管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
情景 由于公司内网有多台服务器的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
9 r& M. I6 C3 n! M( f2 ], F( X ~/ N. J6 h; _* r8 ^0 |3 c. P1 U
- ###更新仓库
1 t1 F6 p8 S/ p+ c - 5 j! J, ~) i* `' [6 }7 v% B, a$ D
- apt-get update -y
+ ^( J5 C" }5 ~. E - apt-get install wget -y
! ]1 j4 r1 d; Z$ m( M - #下载nginx和相关软件包
复制代码
! b8 Y, n6 M; }3 j* u- D! z. j) ~' B" x) B9 o% g9 }
pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
: o b& p4 g N0 v3 h
2 }( r+ d; j7 [& |% ~3 x4 O8 r. o复制代码 1 } y1 H7 \+ M* q
. |" z5 n. D% H) I( D9 K, s apt-get install build-essential libtool -y
/ X$ p" n# P8 l( H& F) f#创建nginx用户8 [ N) }2 }1 D
! p6 y& E& U! }0 d所谓的unprivileged user
8 M/ B0 V6 r' L4 V3 V$ B" m5 U7 }! _8 ^/ G$ e0 {+ m3 W
- useradd -s /bin/false -r -M -d /nonexistent www
/ ?" u0 ^! s: S4 K6 y - #开始编译安装
* n( ?7 b; f2 _& r
/ u. I; g+ z/ R- e- /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
8 h7 Z) C& ]* d. W6 s - --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
6 K6 |2 H! p; `0 B# s0 ?: k - make7 b- {: |- j5 |2 J1 E) ?" [( J
- make install
% a. v) c" R U( |! u& n+ J - #给文件夹授权
复制代码
: P6 P q( U, u , {$ Q$ d4 L0 F& Q% }) }* M
chown -R www:www /usr/local/nginx
6 l- m( S# p8 I) }8 p7 I# S. `#修改配置文件5 }- s: ]- j6 W# M) X% `% [
vim nginx.conf
8 v) s1 g' |. a/ y" u! H3 f; R G6 h' T+ m- f% O
user www www;/ m" c# q5 [3 r' J, k) I, l
worker_processes 1;0 I* u' O9 X# K- T% i
error_log logs/error.log;, n/ K! P! I% u4 x/ |
pid logs/nginx.pid;
+ q1 x6 y4 n* w- ]7 C) J# q. M7 Wworker_rlimit_nofile 65535;
8 M( M; P" H, @) n7 v' z0 a- S! kevents {/ Y/ y. U. u# O
use epoll;% U+ Y9 N/ k+ x1 N* h0 R- c& r
worker_connections 65535;
5 ?! u& |* x3 }: u4 i}4 T+ s @- i4 o( W+ d3 z
http {
; l8 H. L" \9 p& N8 t" R include mime.types;9 r) i$ Z, }3 Q3 _& u
default_type application/octet-stream;
( X+ K& p3 r& Q# G& P1 x include /usr/local/nginx/conf/reverse-proxy.conf;8 r3 d% n3 @' f K
sendfile on;/ ]& z) J; s& a. R
keepalive_timeout 65;
, F8 r' ~+ k: Q1 F% p gzip on;
+ ^: }7 p; O+ w7 u' d, N/ Q client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户& I6 U6 s$ ^3 B
client_body_buffer_size 256k;
$ ~" M4 ^9 H4 n/ V' _! S& i client_header_timeout 3m;
% j4 Q" C, F2 e2 f# E* x5 A3 s; Z2 `2 j client_body_timeout 3m;0 i; y) H) x$ ~% p* r/ ?5 E7 k) [
send_timeout 3m;& _, D) T# n! Q* c+ R
proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时), H0 G$ | Y" A' ~2 S" n
proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)9 D( A) f ^3 ]% X0 a
proxy_send_timeout 300s;( F0 h/ a0 ]6 w, ?6 o" l
proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小* G* |$ X8 [ c; |5 u4 _
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
2 b" g; \ t9 b/ t7 Z proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
2 y3 F0 L3 p# i/ R proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘" r0 h; Y: F; n1 D0 Q; G8 `
proxy_ignore_client_abort on; #不允许代理端主动关闭连接" k/ m2 t, b, A; J# q6 \8 y
server {
" b6 X& T a/ H3 l listen 80;( {1 G4 b3 O, n- a
server_name localhost;
& M5 r0 w! _8 r* T4 A U3 h location / {4 `$ Q1 Q7 k1 c4 W
root html;
% `- i) D4 T, n) V index index.html index.htm;
3 f# ^% i* D+ J2 `8 U% t }
0 \5 v( ~4 s; U+ Q error_page 500 502 503 504 /50x.html;
/ B9 y" o" \- [$ n, Y8 s" p2 G location = /50x.html {
9 r8 c$ {, r, _' v root html;# ~/ M/ ?: f4 Z1 [7 `
}
5 C$ ~. A) X( h( _4 n( P; ] } [9 V( a4 B% q/ V
}
7 M7 J5 t+ f0 H& _( T2 M( }" i! t* J) `7 h
编辑反向代理服务器配置文件:
& w9 [: _; Z9 u* _3 f) o, ~3 s6 Z9 Z* S/ U9 v1 f' Y
vim /usr/local/nginx/conf/reverse-proxy.conf
3 l0 x4 _ w& _4 ^. J
; t& y+ Y% ?) l' M0 bserver
* i2 I. `4 R* c/ M+ m{/ n& _& q$ H$ m) \ r1 v; d! F
listen 80;2 {( T- B2 e. [
server_name xxx123.tk;
& v, W3 _2 w3 E9 P8 f- n2 U location / {. y; I8 _$ N G* G
proxy_redirect off;4 m+ Q( N1 |: K+ ~1 \) A
proxy_set_header Host $host;/ }7 M- Y! l0 s; ~8 a* h1 u; B
proxy_set_header X-Real-IP $remote_addr;
( d. Y7 F8 D0 b. x6 |& F4 J proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;( ?( y+ i% n( c
proxy_pass http://192.168.10.38:3000; o, I L4 r3 t
}7 v; B: ?* q$ [& d2 p: g
access_log logs/xxx123.tk_access.log;
. ~5 X9 e Y" C( i4 ]+ P}& Z8 H' y/ M9 u# R/ z' t
+ V) l) M. O4 y% ^* w
server h! J5 }* N$ M( ?
{- G% a3 W7 b- Y. k4 t* A% z5 d
listen 80;
, Z' m) C0 l4 G% X l ] server_name xxx456.tk;
4 D+ T9 \; Q) v, b: u4 F' _ location / {' A& L: x3 f B+ v) P5 W
proxy_redirect off;$ G. X# i) z( _- H" Z( N F
proxy_set_header Host $host;) h2 Z$ {( @ r7 A: u8 i# H
proxy_set_header X-Real-IP $remote_addr;
% X& W5 ]( o0 k% x3 m proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
4 Q) p2 d+ }4 w _, b proxy_pass http://192.168.10.40:80;
" x9 x0 @0 V" g1 j; E" a }
/ B x( y4 B5 U' e access_log logs/xxx456.tk_access.log;8 \1 f4 m1 W4 t3 z; U" O
}1 R" I" Q3 z9 e/ c' |
_4 @, J& I4 M' x+ _; v然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。
- P o* o( z) i; ^3 ^' O `
. a7 E( r) Q$ C* qupstream monitor_server {. l1 l; u1 k& V A* H
server 192.168.0.131:80;
7 a# V1 c+ F" Q: K$ G. D server 192.168.0.132:80;0 Z N: w! v* Q/ q+ l
}
3 S6 u7 Q, W% y
( ]- J: v8 ]: l1 O/ O+ Qserver( G. U% ], G# J/ `4 |9 U4 ~
{
' I1 Q; U0 A: T" d1 M5 A listen 80;, V- y; u$ x- z8 N; _. `4 V: i) a
server_name nagios.xxx123.tk;" Z. q' [5 w) } T- I- g
location / {
' o* Y: a3 v2 e) v, b3 v$ l* g proxy_redirect off;
) q b; p' b: H* Q. l6 O; I' ?7 \ proxy_set_header Host $host;) A! C! u @$ M
proxy_set_header X-Real-IP $remote_addr;
" D9 ~& _" [# r/ g) ]/ i proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
) N" H" `. p z0 X B proxy_pass http://monitor_server;+ }2 s% L( D& o
}$ p0 u2 S! U' |3 D7 ]" O' _
access_log logs/nagios.xxx123.tk_access.log;8 \. L4 t. z4 z& h6 ?
}' C+ T" w5 R% A$ J( W* N& ]
) l# U/ Y1 y4 V- _5 ~额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
7 \" P& z( D7 W! q7 y
( o$ ]+ F% n W" }% [) f, g5 e( rlog_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '/ u O' s' ~1 D$ K+ x( H
'$status $body_bytes_sent "$http_referer" '
* v& c4 P7 Y4 Z+ p# ?# |'"$http_user_agent" $HTTP_X_Forwarded_For';* h! m x9 X- `! N1 u
2 H( f1 @& s' }3 z) `( T4 aaccess_log logs/access.log access;
/ d" E9 m9 b# \ D) m
' ]* c% O* o% C( S5 o再看看原来日志的格式长什么样:% W, z) \( k: S& T9 ]2 `+ G
4 J& G% d, |0 x8 J- L+ Q1
6 e& m* R+ r, T; a, N- ^2- F% P' p3 B% [
3
" A7 B$ C) b+ H. A$ W( Q$ u4
' Z- b! D9 b( _6 L5 {4 R3 K7 x5- E' [, G' n3 L1 S; @: n
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '. M1 e! a/ \$ @+ @, ~( h3 h
# '$status $body_bytes_sent "$http_referer" ', N$ j- z3 W( H) \
# '"$http_user_agent" "$http_x_forwarded_for"';
) B- ^# B4 p& A& Q& `" m ; N! X" N; m8 k' d4 F
#access_log logs/access.log main;- S9 E0 D7 f% Y: K& b# ]! [/ J
看出区别了吧 遇到的问题 之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查: L3 Z$ W1 ]0 b+ Y; p
T8 r# C4 c% w
1
& L0 g7 x1 [0 B9 m0 \3 q7 D' ?2* h* }) m6 i3 u& Y& n; j, `. B
3+ i4 D% k/ |$ t+ k; ^ h5 d
4
. M( A7 i2 K/ R! i D8 Z3 i/ C" o5( e/ U& a2 c1 f/ j5 i3 C
6
Z6 I# y) j6 i' j8 c' i76 Y; q. |" ?5 j3 L5 G* l0 C# ?
8
) g7 ~8 R& M" X) i$ f3 t1 Xproxy_connect_timeout 300s;
; w; r' P2 `8 b7 X# U( q/ y4 V% yproxy_read_timeout 300s;0 ?& w: E- T6 l/ E' K
proxy_send_timeout 300s;5 ^! A1 t5 C5 b+ E P- s3 d! I
proxy_buffer_size 64k; [% j9 S Z& m- N) @
proxy_buffers 4 32k;
$ M. Z- ]' W* |1 r" D: kproxy_busy_buffers_size 64k;2 j% p* T0 `7 G5 S8 {" @3 S
proxy_temp_file_write_size 64k;
. p7 a/ H' N. m) j% ?proxy_ignore_client_abort on;
9 Z5 T/ w* C1 f0 A) t9 l报错日志:4 t1 Z& T' ]; o& U. j' s0 `
( \4 E( J! ?7 k. J/ W7 ^' p2 e# E
...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。$ j& h5 E/ g5 N6 V
1 G7 L" Q8 H5 ~$ ^
PS:关于域名转发8 |' S: y7 W# ?7 F. O# t4 k
- N$ E7 p1 q+ @0 D% Y6 N" s所谓域名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/ 的内容。( {) R* _$ w6 y4 G& d
|
|