管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
情景 由于公司内网有多台服务器的http服务要映射到公司外网静态IP,如果用路由的端口映射来做,就只能一台内网服务器的80端口映射到外网80端口,其他服务器的80端口只能映射到外网的非80端口。非80端口的映射在访问的时候要域名加上端口,比较麻烦。并且公司入口路由最多只能做20个端口映射。肯定以后不够用。 然后k兄就提议可以在内网搭建个nginx反向代理服务器,将nginx反向代理服务器的80映射到外网IP的80,这样指向到公司外网IP的域名的HTTP请求就会发送到nginx反向代理服务器,利用nginx反向代理将不同域名的请求转发给内网不同机器的端口,就起到了“根据域名自动转发到相应服务器的特定端口”的效果,而路由器的端口映射做到的只是“根据不同端口自动转发到相应服务器的特定端口”,真是喜大普奔啊。 涉及的知识:nginx编译安装,nginx反向代理基本配置,路由端口映射知识,还有网络域名等常识。 本次实验目标是做到:在浏览器中输入xxx123.tk能访问到内网机器192.168.10.38的3000端口,输入xxx456.tk能访问到内网机器192.168.10.40的80端口。 配置步骤 服务器ubuntu 12.04& M h. X4 Q6 S5 t e3 J
" h, W1 P0 L) H; z6 g+ \% U
- ###更新仓库 _$ Y+ q; A G) G, L! \1 W
- / y1 f6 I5 }0 C; j% @$ m
- apt-get update -y+ r7 n$ z# H1 v" F
- apt-get install wget -y
9 [+ O$ S6 h% k: w6 l% g2 H- H - #下载nginx和相关软件包
复制代码
5 u+ p: d9 M* q8 D8 ?5 C k: g+ z2 w% q
pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
& _5 G( _* f$ _) P# U
4 }& k) W7 i7 e: ~; ^- cd /usr/local/src& A Q/ }3 R8 H' m* W0 a0 ^ K& `
- wget <a href="ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.33.tar.gz">ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.33.tar.gz</a>8 k! k4 x7 `9 F4 Z+ U
- wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>9 b ~, m# W0 r8 V, |! |7 X3 }
- wget <a href="http://nginx.org/download/nginx-1.4.2.tar.gz">http://nginx.org/download/nginx-1.4.2.tar.gz</a>
; ~' T4 P9 D. W4 Z, v - tar xf pcre-8.33.tar.gz* m2 \1 z" f' [ N% C3 O: B
- tar xf zlib-1.2.8.tar.gz
/ } C) A" d4 a3 w) s8 `& ] I - #安装编译环境
/ W0 `+ A. Y5 [
复制代码
! q, f5 m. y2 ?9 } 1 d1 t0 q$ p$ B& Q, @/ f( j
apt-get install build-essential libtool -y6 V# ~- T+ s9 C& G5 z2 W" @
#创建nginx用户
/ U( ]6 b" S( h: y2 K* Y8 u0 A' j: T! a6 ^& Z
所谓的unprivileged user( I/ N% L( O1 X* H, v4 U
5 ~) a0 W6 H: P; i' [
- useradd -s /bin/false -r -M -d /nonexistent www/ F! r% X; M* u3 `; N
- #开始编译安装
) O& T. R+ C. N/ ~7 |! } - ! p7 q+ \% [ p* i
- /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
/ u4 N% j# }9 J, x% A0 ~# ` - --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
' m; W1 a- o5 W; A3 |% W6 \3 m - make1 ?! T P X }$ ~( o1 o, Q# P7 j
- make install
5 U5 n7 j X5 i% v1 }1 C5 Q8 r I - #给文件夹授权
复制代码 ( s! \/ J% `# I9 S# K! A( i
$ \2 I' W1 F" V- Q0 j9 h5 \3 C2 I/ i
chown -R www:www /usr/local/nginx
5 L2 R" S/ B1 C Z8 K0 ?#修改配置文件
% c$ B6 g* G8 A+ t# v0 g, Rvim nginx.conf1 g: ]6 N+ U0 s9 Z; j) k( E
: p! o5 O* z( |. d- {user www www;, F7 Q& p3 |4 C
worker_processes 1;
. ]" ` F0 ~ ~error_log logs/error.log;
/ H. c2 Q* k5 e* m& a* Spid logs/nginx.pid;
+ n8 e* i) s4 U% C' e- iworker_rlimit_nofile 65535;) {* F9 b# M# {2 s" \5 K' `. V
events {
' q* c) U1 E$ D* k use epoll;
! ]1 C+ ^% n8 q! e worker_connections 65535;
- z8 Q9 \1 m# I, W6 g& l' y# ^}/ m& H- M! A2 w% K. V
http {4 b, [& y! s) [) r5 m! S& c
include mime.types;1 V1 V/ ^9 a6 ?7 Q6 F4 v3 @+ J
default_type application/octet-stream;
8 T, O& S$ _; U: N include /usr/local/nginx/conf/reverse-proxy.conf;$ m/ x: q7 {% D4 s
sendfile on;
1 p* _, E0 s8 w keepalive_timeout 65;, N9 o) K, |# |- L# u6 z' e0 F
gzip on;- W4 K" f# b% m1 G- v, I5 \
client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
; |" j4 ?' j. _3 E* n6 m! j client_body_buffer_size 256k;! S F$ \9 L9 U; F- M# [! r! Q9 T
client_header_timeout 3m;
7 A% M* |9 C" D( p4 y, t! P% R client_body_timeout 3m;# @! w: Q1 I# A: X5 v
send_timeout 3m;
( T+ c9 C. @8 K! r* h' \ proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)0 |$ ^6 N+ L( Y; h+ h. T: D( [0 e
proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
7 [- [4 n" K5 ^- [% H/ W ] proxy_send_timeout 300s;0 z4 G% |! \+ H4 l
proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
1 z3 a; B$ Z; I proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
z: K$ `9 @8 [0 R9 h- O' ] Q% G/ q7 c. [ proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
. G1 o7 h4 W# D: p+ H proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘0 n2 h! r' _* w
proxy_ignore_client_abort on; #不允许代理端主动关闭连接' [, O0 P: V* Q& n
server {
5 p: p0 s( K8 g8 i$ d listen 80;1 y7 p6 L ]! ?6 O5 x
server_name localhost;6 [+ L% m; Y4 ]; U' [
location / {
: s4 ]2 s- a( P' A4 p root html;( r1 K) H: N, W; z
index index.html index.htm;' q% h% y% x* F! }1 V0 c, ~
}3 ]4 K q7 x6 u+ M, X0 ?
error_page 500 502 503 504 /50x.html;. ?& s, b: F ?! R) j2 j* V
location = /50x.html {
" Z+ Q, x" b3 g+ E! P root html;
& ]3 k! v2 k: ?9 ]" A* N! b0 G }
5 {- o: \! w7 s( L# A+ q }
" b4 ^/ o0 Q6 R$ T8 L% P ^% |}- p, s/ q# j. W4 q
4 n) j! ^5 a' c+ L2 k3 G编辑反向代理服务器配置文件:
# p6 z) P, w* F) J
) q6 ]1 Y: w6 i, Zvim /usr/local/nginx/conf/reverse-proxy.conf9 b' D; C" }# b H
- W/ I6 Q! m) f" lserver
" }. _7 S+ P$ }" {{) G z- b# x. t! e) Q1 `
listen 80;
, ~: B1 N+ y9 a" S/ e server_name xxx123.tk;" n+ T& @; j, x& K0 r1 X
location / {
% n; I: v7 l; J W proxy_redirect off;5 X z5 J" \3 l& A4 k0 [
proxy_set_header Host $host;
( y4 g' |4 c6 _ proxy_set_header X-Real-IP $remote_addr;
8 ]8 b* _! G8 ]' e6 Z) ^ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;/ v( C4 }+ D0 c/ l6 i
proxy_pass http://192.168.10.38:3000;; e" F: ?' Q' G' d/ S# l
}+ x. }' i5 n: s, ]/ J6 g7 X( h1 f
access_log logs/xxx123.tk_access.log;
# Q9 R& ^) T$ o A; E: i& W}
! C/ }% `; C2 Y/ I* a: E3 W 2 v/ }) E& ?0 f9 }( t
server
: [; K5 l: f2 w8 |: s+ k9 Q{+ M& F% k" ]' v1 V# d
listen 80;# n0 b A) `& {5 K# S7 L8 y
server_name xxx456.tk;
* w1 s5 T* N. p, O) l, k% ^ location / {; ^# m; t! }. L, h0 U5 y
proxy_redirect off;# I2 j8 `2 q" @; u$ h: V
proxy_set_header Host $host;
' V( u. x4 V3 `4 r' y( F proxy_set_header X-Real-IP $remote_addr;8 K1 w( I7 z* h9 S
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
; b. @* |% Y1 C3 [- Y$ P& A proxy_pass http://192.168.10.40:80;' K; L0 ~$ v$ ^. t K- Z
}7 r3 O7 V7 N: ]& U
access_log logs/xxx456.tk_access.log;
* d1 V/ n4 z3 s0 [5 e}
S7 t# a/ ^7 D' g( h9 B5 }/ \+ V
# u/ I) N9 m" ?, D1 j& Z; F1 v然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。; n6 i/ E0 Z5 r
. O; T8 i/ u! w: m
upstream monitor_server {4 t- K1 h. @/ E
server 192.168.0.131:80;7 [ C/ B9 Z) {5 o/ T% l F% A
server 192.168.0.132:80;
! Y# a3 k1 ? \7 N3 e" A# H" X}
6 p+ U1 z0 J5 k! M3 c % E f/ r2 j# |: `% ]- b* }
server9 @$ [6 x" O) W' V' e
{
& Z% b' ~/ f) U" S% N s" o; O listen 80;6 M1 n }8 o# a# _- z$ H4 p, H9 B
server_name nagios.xxx123.tk;
R5 C4 s( ~, w, n! Q location / {$ ~3 L2 p& T6 [
proxy_redirect off;
% b& X' ~ D6 _# d, { proxy_set_header Host $host;
8 }$ J$ p/ Q/ Z& N0 k* E% U) o- I# w proxy_set_header X-Real-IP $remote_addr;) V3 i; N+ Z2 v" c* l/ `
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ' s9 V+ q; z( V8 K# S
proxy_pass http://monitor_server;
% B1 { a9 i8 R( J. v }, N0 e* `. O) z3 X6 W
access_log logs/nagios.xxx123.tk_access.log;9 l2 G, U, G2 F/ {! C- s' k% j f; w
}
0 S* C8 X2 I( W5 y: l( U ?+ V! o- U- P( j- ~
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
% i) S3 E* ^5 }& T, b9 f0 S" ?' E6 P7 i8 P4 _9 Q
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
. k: [- u' g' o% h U' T'$status $body_bytes_sent "$http_referer" '
; S0 ` V/ Y [ w7 Y" _'"$http_user_agent" $HTTP_X_Forwarded_For';* e% B0 l' t. P
s8 P6 P5 T; {+ j; M% @access_log logs/access.log access;
/ e. N$ M. w r: E
% U6 \$ f' M" f+ J r( g" j再看看原来日志的格式长什么样:
( l- \" a! ]# b5 q; P! r$ @7 N% H$ K( S. M+ A( |1 m: s3 c- O
1
* B1 i( J; t8 X2: O: ?* g S! j
3
. a& b) k; i- s% z7 M2 _7 z! d. y4
4 d5 ]1 y& L! o6 p" Q50 w" F! O# @1 o6 z
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
' [, T: f1 Z) n' G# '$status $body_bytes_sent "$http_referer" '
8 @! @4 B. w2 [7 I# '"$http_user_agent" "$http_x_forwarded_for"';; {) A- X- p; Y% m3 w
0 b* Y2 H, |" T9 [) }+ E
#access_log logs/access.log main;/ N) {4 x/ o8 ~1 b
看出区别了吧 遇到的问题 之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查- u! Y2 r# R! K: Z1 \ r. a8 G
|5 T# t" ~: D3 N" k2 N- [* ~/ i16 r+ D9 Y; J" a% v7 W" z
2+ M1 Y9 I7 a3 ^/ F+ }
3
( A# E" b5 Y% r1 X4
: l, O. K' S1 V& b! }. x" F. F: V+ O5
4 e% e1 X4 x! s# D- N5 r1 ^2 d6, F0 L" k0 F( E6 G( a% L3 c
7- r3 n6 l" [0 t9 A
8
& x9 C2 r0 R1 O, }6 `: [+ g% Bproxy_connect_timeout 300s;
4 m ]. ~3 {! S9 c& L5 V, @proxy_read_timeout 300s;5 u; T: ~5 q" w g8 C+ q- X* N
proxy_send_timeout 300s;
6 b9 v1 J, y Pproxy_buffer_size 64k;
0 B% }# ]3 }6 n1 Y! N+ b6 o' yproxy_buffers 4 32k;4 w; }1 j. _; n3 v
proxy_busy_buffers_size 64k;5 i# S, e8 R# c3 N, [/ }5 O
proxy_temp_file_write_size 64k;
0 e9 X& x; \, U dproxy_ignore_client_abort on;
' v1 ^* C6 ~) h7 ?报错日志:1 u( Y, J1 }; A! I; Y) w
! P& X' _7 x6 g5 G
...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。
9 t! e$ P$ E) O
8 ^# v- c" S" {# _1 m6 p0 e9 a ?PS:关于域名转发- u. t9 r q0 I8 _5 ?
( G( y }( {" [+ \; `4 `
所谓域名URL转发,是通过服务器的特殊设置,将访问您当前域名的用户引导到您指定的另一个网络地址。 地址转向(也可称“URL转发”)即将一个域名指向到另外一个已存在的站点,英文称为“ URL FORWARDING ”。域名指向可能这个站点原有的域名或网址是比较复杂难记的。 已经注册成功的域名,若初设或取消 URL 转发设置,一般均在 24-48 小时之内生效。对于原有已经设置成功的 URL 转发域名,如果修改 URL 转发的目标地址,则只需 1-2 个小时即可生效。 不隐藏路径 URL 转发:例如: http://b.com/ 指向 http://a.com/xxx/ (任意目录);当在浏览器地址栏中敲入 http://b.com/ 后回车, IE 浏览器的地址栏里显示的地址会由原来您敲入的 http://b.com/ 自动变为显示真正的目标地址 http://a.com/xxx/ ; 隐藏路径的 URL 转发:例如:先同上, IE 浏览器的地址栏里显示的地址保持不变,仍是 http://b.com/ ,但实际访问到的是 http://a.com/xxx/ 的内容。
7 m1 @/ d' m* A% N |
|