管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
情景 由于公司内网有多台服务器的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
. x" T& X3 _0 {, O, j6 u& @2 k
- {/ t( {4 W* f5 W/ X- ###更新仓库
* K' a! m3 v, ~! s7 E, N - : D& Q1 p' @/ L
- apt-get update -y, R# w$ L0 R/ D' \4 O# O
- apt-get install wget -y: h$ E9 i& i. O9 b* b: [
- #下载nginx和相关软件包
复制代码
3 M* I9 l4 d2 R: e1 j
0 R% }% T: q0 K. l# X1 @3 o ipcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
i& a+ z" R! d( }; S8 H8 ]
- S; N0 B6 q: B- cd /usr/local/src
2 A3 p. C/ z+ \ - 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>7 m3 d- A" s: ` S5 \* a, g# h
- wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>) U, U7 v% K" c* p
- wget <a href="http://nginx.org/download/nginx-1.4.2.tar.gz">http://nginx.org/download/nginx-1.4.2.tar.gz</a>- V8 l1 m/ x, P0 Q5 g0 Y9 M1 G
- tar xf pcre-8.33.tar.gz
6 Z0 p4 M% S, [9 z4 X1 h, t2 s, c - tar xf zlib-1.2.8.tar.gz
! j& d- U( p. Q6 \* d! G0 s, o6 e - #安装编译环境$ T) ?1 g/ I. c1 O
复制代码
% X; h5 a/ E1 F0 j0 X % S5 Y" f$ Z: V, T$ {0 ~/ E
apt-get install build-essential libtool -y
8 `. ?3 b5 N. W4 F/ I#创建nginx用户5 ~ b: j$ z* w8 @. ]
$ o# d2 U1 P& m+ A所谓的unprivileged user
2 e) s- f* a9 G9 t- J3 N
+ E9 f5 t* r& y4 i; c" w- useradd -s /bin/false -r -M -d /nonexistent www
* i9 C" \6 y& b6 e& E# T - #开始编译安装7 |5 n, [- i7 _6 `# y' L" ]( f
- $ p: e1 f4 ]& W9 i. r# ]9 ^- s
- /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \) [* ]0 H9 E: j- w% c1 b
- --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module; w9 q9 g% [! I% Q: t
- make V; E2 g2 C8 }5 M
- make install
8 D* s' m$ f u1 y2 U - #给文件夹授权
复制代码 3 M6 g9 M2 W9 h4 X
' P0 h8 W" G' c& m2 H/ @' vchown -R www:www /usr/local/nginx
1 C3 S, G+ U* h n6 M1 K#修改配置文件) ?% A& b2 T/ q! k4 a: c" n2 |
vim nginx.conf
6 h* p0 P U& F' |" u- u u" J1 Q4 |: V X* u3 B
user www www; A5 \# E7 X3 x/ B4 y- j, z* G0 q
worker_processes 1;
6 x. Z9 t* [. {% }5 T2 berror_log logs/error.log;* J; Y" Y3 Y; o- h
pid logs/nginx.pid;
8 {: t: T- q2 Q. C3 eworker_rlimit_nofile 65535;
; \) v& O) q) A4 J& uevents {
, V+ Q7 G3 s8 F H, s use epoll;
) S! m( Q0 C9 c$ i7 p+ ~' o" F worker_connections 65535;9 W% [" K. X( Y* o* |
}
* e2 ]/ s. @ H' ?0 V9 Fhttp {
& |6 c' P4 X% {" O; S' k include mime.types;6 I( `& _. n' r3 x: j4 E F8 _6 n
default_type application/octet-stream;" c( r: k$ {) }4 N6 V% U
include /usr/local/nginx/conf/reverse-proxy.conf;
* a5 e$ D# F0 U/ ? sendfile on;
# _. P* m2 s/ [; @; R keepalive_timeout 65;7 J7 n4 A1 K: G" X
gzip on;: }+ `5 J5 u, w" _
client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户0 G" ]9 H' z0 _! c; c. q
client_body_buffer_size 256k;- ?1 [ H& A" F4 B* i5 i! M' F7 e
client_header_timeout 3m;4 o" z; [' P- x7 O9 m/ r u
client_body_timeout 3m;
4 v% M$ n" y$ Q6 k send_timeout 3m;3 [/ g+ e% N6 w4 Q
proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
! x( s+ a$ A: m7 Y+ Y* W! t1 \' _ proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)1 t& p: |. u' T' H1 l
proxy_send_timeout 300s;
F. ?+ t* t+ d }+ T6 o proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
/ l5 r7 F& z0 Q. J; q proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
0 m) L: @, u6 E4 `) U3 C proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)1 z# F; ?$ \2 ~* c# H# y
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘. @& k; ^% o0 U* v0 _' I
proxy_ignore_client_abort on; #不允许代理端主动关闭连接
3 b, J4 A7 x- O- p server {
( k E7 g& J U, S$ O. I listen 80;
2 x- ?3 x2 ]4 O server_name localhost;
7 e' e% `5 V( v9 |' a4 i; T location / { E j) m' I! _
root html;3 K2 m' u$ h2 Q3 U+ M" W$ U, A- U
index index.html index.htm; G& p5 R. R6 b5 y* q9 D9 Y
}
2 ^2 {* q$ K: K# {% D- ] error_page 500 502 503 504 /50x.html;
4 @! `+ C D H; m; n location = /50x.html {2 }+ P5 { o# \- u4 x" v, U& l6 L! ~, l
root html;" l# }: x7 H( B; M# A" x5 {
}) ?& `( U7 R* E; `& H
}
/ N2 ~% g# F2 l% k* t O$ g}
$ L6 u9 S" a7 a" J; N' a3 E
9 P) R- r% b$ _' U% S编辑反向代理服务器配置文件:, n* s, f5 v$ N" a: G) J, I
1 U1 G) n0 d' t- h3 g5 Jvim /usr/local/nginx/conf/reverse-proxy.conf( t% M6 K! ?' k- k% c A C; f
* j0 v# v5 {) J* D+ R: tserver9 Q5 a+ S2 s" f& G+ ~
{$ W* }4 s( k2 V; U/ ]
listen 80; f& ^* K+ ~+ {9 D( H; ]+ D5 A
server_name xxx123.tk;
, c5 ^; c" ^" d+ s" Q9 q location / {
r7 t7 L/ g+ z7 U6 P proxy_redirect off;3 ?" q$ x; a1 i, [
proxy_set_header Host $host;. T3 ]& O2 V0 k: D# H, a
proxy_set_header X-Real-IP $remote_addr;
; w# u! s) l" g" e5 c8 I3 H proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
, t! C6 H1 c! G: q proxy_pass http://192.168.10.38:3000;
, j2 H9 Z: J5 r" t }
. }- ^# {( @+ z! \: m, Y7 W' s' V access_log logs/xxx123.tk_access.log;9 ]( q; Q, z9 w
}
4 A A. }6 H6 ~- `3 H
9 q/ R+ p& w( J# [6 X R8 h s1 }server
: p4 B$ }0 K/ p{8 I. E# y$ [3 j" }; @7 P: D2 n0 Z
listen 80;
5 |0 M0 m8 R' k# j9 d6 t8 c. s server_name xxx456.tk;' x6 L" p* P! L
location / {: o+ [& ~, h1 t% S" `
proxy_redirect off;
! b. R, Y7 f7 S' l proxy_set_header Host $host;9 |) s8 c, z. Y& ~/ a/ C: T- h. ^
proxy_set_header X-Real-IP $remote_addr;
" n4 P# o+ }3 Y5 L6 [: [( @, t proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;' [7 O ^/ p6 T( `% Y$ U
proxy_pass http://192.168.10.40:80;6 }% b/ v8 g' d7 s% `4 @& ?1 {
}
1 H7 J- @6 T) e# [$ q1 _7 F5 Q5 h access_log logs/xxx456.tk_access.log;- d4 c7 c6 d! s. S
}
1 O$ D! y( U# G' }1 h5 e8 C# L" @; Q! [ H, d) `: T7 W2 Z
然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。
' Q0 |5 ]8 x) d! h f& v8 Z- g6 b# t) @1 v3 |1 q9 y
upstream monitor_server {
7 m$ Z: A3 R6 ]' S server 192.168.0.131:80;
% _+ W) Y1 G- B7 P1 a% l) S+ R server 192.168.0.132:80;
6 A* e- b& m0 W- h/ f* g}
3 x/ l' P/ b; j- d* k
7 P% m Y: e( ?server
. K5 _; S* [; L5 x5 f. z) y{
; R3 m, t1 J6 N- ~7 | listen 80;
6 p' L% X6 c r9 x- K% H0 G3 R server_name nagios.xxx123.tk;# e% e P" G4 v. I
location / {" u8 M5 H! h- a% l G
proxy_redirect off;
2 x- z7 P' i4 h6 c proxy_set_header Host $host;
4 N7 O8 I3 e4 W# a" i+ D proxy_set_header X-Real-IP $remote_addr;
9 e' O# x' e+ Q+ \) l: z proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 4 [( K1 `5 D, t: [! D! N% l
proxy_pass http://monitor_server;0 r& u; f8 L: q) N0 }2 \6 s9 p) J
}
% a$ s0 K9 n! g# F& h access_log logs/nagios.xxx123.tk_access.log;
% q0 |6 a/ Y" Y* w}+ a6 P- |& u* Y) a. e& k
1 l! s7 K& }$ o2 @
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
3 u" w0 r4 z& D0 S+ Q7 n# u1 [
U, J5 ~. S. q7 l* Alog_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '+ @3 n" m# B; l9 ~ ~- `3 U; }
'$status $body_bytes_sent "$http_referer" '' P0 [5 }# z3 W+ a7 _
'"$http_user_agent" $HTTP_X_Forwarded_For';" r/ G' B1 B x8 P9 k
7 A% m+ n; q# P8 p4 j1 Caccess_log logs/access.log access;
# G$ T3 r, O: `6 G: ?. s3 K' i2 J
再看看原来日志的格式长什么样:9 ]' m/ \, o: m, u' J8 _1 F( r
4 j# o+ d8 c% {7 I1/ F( }* C2 ?5 ^+ f
2
9 }5 m S( O! ~, \. [9 o3% D5 }' g! f8 T3 }
45 d: ]2 t) L( S( \6 n$ a7 ]
5/ ^8 a- s' I: l. @" b% K% q$ l
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '6 j8 D B1 i* y6 M- R
# '$status $body_bytes_sent "$http_referer" '8 V) I/ `& G4 R4 j/ _% a' m1 H
# '"$http_user_agent" "$http_x_forwarded_for"';
; p3 s# n( N2 F; a0 a, n
* I/ u/ ^9 v5 B2 x1 w8 S1 I5 c#access_log logs/access.log main;
$ ]! q) _0 j& [" t8 J& `0 s看出区别了吧 遇到的问题 之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
7 f) _/ z. E! G% s, l2 ~, _0 s- j: e( W+ U9 a
10 z8 `! T- v+ k9 [' C5 w
2! [" ~0 |* V9 \/ X
3
# n4 _$ B9 m! }4# p# h) r* @" Q: n
5
1 T# Z7 n9 y4 f" H3 z6
$ u6 h, a) c3 p4 d0 D/ _ f' P7
% n" o; ]; l& f! l/ e8/ ?) s4 U" z9 M& S$ @8 Z
proxy_connect_timeout 300s;- d: Z" \' m& S8 M: S
proxy_read_timeout 300s;% A3 r# o: N. q* H6 _! C J+ O
proxy_send_timeout 300s;+ s; i3 [3 W& N$ A; l/ E8 f4 @. v
proxy_buffer_size 64k;
/ v( _. Z# T, S! _8 f+ V C8 qproxy_buffers 4 32k;
: x. p+ p% T6 N4 ^1 |4 Oproxy_busy_buffers_size 64k;2 Y1 ]* V! K" p: R3 X: ?) u* y9 c
proxy_temp_file_write_size 64k;
3 x/ u, h z. l; n2 f; d/ Z8 p6 ^proxy_ignore_client_abort on;
: q3 P6 B5 A. i: u/ G报错日志:
8 E' _5 G" O- y+ U1 e) O% M% D7 E+ O% b: o
...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。
4 D& r, \; h" |1 t8 M2 |: z& z3 S6 l7 K4 {5 ]
PS:关于域名转发( X0 _! {' a9 e
% I7 m# A% e# v7 `
所谓域名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/ 的内容。" Y: q2 j. n3 a8 o
|
|