管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
情景 由于公司内网有多台服务器的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
. T/ Q1 C' y1 |* O: M, h8 B
6 q4 z+ H0 v/ S' _2 y- ###更新仓库+ E; ?7 c$ A' ]) K% ?% {: {! j
8 e5 ~- ^, K2 ^/ w) D) ^0 Q h4 {$ U- apt-get update -y/ [5 ] A* o6 D( n8 S- `
- apt-get install wget -y- }, X5 C2 n0 s& [1 X2 V& w
- #下载nginx和相关软件包
复制代码
$ V( y3 `6 M, a V; x% h& P# `
' l3 N# y! l8 U) k0 t3 V/ ?pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。3 I; y( M/ u! G
: F1 R9 Y5 a) {1 l
- cd /usr/local/src' z$ [- }1 L: }& v r- 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 Q5 F; _8 R4 \+ s9 f. Z
- wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a># e9 F% |* \, h0 y/ `4 J
- wget <a href="http://nginx.org/download/nginx-1.4.2.tar.gz">http://nginx.org/download/nginx-1.4.2.tar.gz</a>
4 I# r+ n- O! @& E$ R+ i7 N/ U - tar xf pcre-8.33.tar.gz
2 G% ]+ h& g9 Y: d - tar xf zlib-1.2.8.tar.gz
6 B6 x w* s$ }1 I4 w - #安装编译环境. d7 d8 J8 |; y6 _( z3 u
复制代码 ; m& y3 \6 P, k: x, h( ~
& }2 r4 _5 [* ]5 x0 ]' o) G4 [ apt-get install build-essential libtool -y
( ?2 |) v9 w; R, g9 O. ?#创建nginx用户! P9 e4 X( r- v3 |: @* X
' t: x% x* {; e* e9 }$ {0 ~
所谓的unprivileged user; w) s/ h7 {7 Y. a! P3 t9 P
9 H) S8 f! G% e' z% k4 G3 Z6 h- useradd -s /bin/false -r -M -d /nonexistent www
. G8 C$ v0 u3 K/ m1 @/ a - #开始编译安装& G- z% ?9 A' U
" S3 k# G' ^. \- /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \; _4 x! U. m) [- i0 M
- --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
, j, _" U2 t+ c+ B X( u0 z* U* D6 a N - make
7 w" Q' E7 ^3 L - make install
8 y; d T" j6 H- K' ^ - #给文件夹授权
复制代码 ! H9 [6 `$ o9 I8 F- P9 { {
% W( U! P/ Q1 K& z" rchown -R www:www /usr/local/nginx
( D( Y* g, d1 C# }* Y2 W#修改配置文件
( G+ Z9 P1 b9 r9 t3 ?vim nginx.conf
: K' }! ~ I2 P/ U v: R* k2 n0 C* I% z$ ~# L
user www www;' c3 S9 |% A, v- M& o
worker_processes 1;4 o, E& q' K: _8 f
error_log logs/error.log;
$ ~$ m1 P4 Q% \! G; Qpid logs/nginx.pid;* F- z( t1 l- Y5 E4 Q0 b* F/ Y: c
worker_rlimit_nofile 65535;
: u) F! V8 M; v; f, Zevents {0 J9 Q2 ^. ~. r" ^% E" h* ~0 \; t) a
use epoll;
. T5 {/ Q# I0 x/ K) F worker_connections 65535;: B2 ^/ s' k/ ?% N/ l; k4 ?
}
0 b# j; w8 @8 M' Lhttp {
; D x7 R- s, x8 E8 r include mime.types;
/ r+ J. V9 u ^) ?* b default_type application/octet-stream;5 V7 k- V6 J" G+ @
include /usr/local/nginx/conf/reverse-proxy.conf;
$ ^) d4 h- j4 t' [* ^) f0 Y! g2 G sendfile on;
6 N" z0 K- ?0 v1 x2 S$ c keepalive_timeout 65;. @$ M3 D+ E: b- V8 }
gzip on; u" P, G+ f% {- S& G4 z( M
client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
8 ~! v9 w+ O8 p! A" f2 i client_body_buffer_size 256k;
- j- H$ T0 o2 A4 { \6 s( K" Z" u4 L client_header_timeout 3m;
9 z9 f3 `5 T; u/ R client_body_timeout 3m;
7 K- U2 ?' J& F% K! D+ G" H send_timeout 3m;
" H1 J8 o, I# p$ W proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)$ y$ M; z; M- M
proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
& y* o1 ]9 x: n' y proxy_send_timeout 300s;% q1 }) E. R$ I9 {4 p9 G
proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
/ j& x# _3 ]5 o4 j! O proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置 c) [% m5 d) @, |. ?
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)4 s0 @2 e4 Q/ f/ \
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
. }. U6 ?. H: M: Z" L8 X/ c2 ?- u proxy_ignore_client_abort on; #不允许代理端主动关闭连接% W, ?9 y/ B4 t$ \. h' T7 _: O
server {
2 O3 j9 ^; E* k4 O9 n listen 80;- v! ]- ?( [$ [3 G7 ]
server_name localhost;/ G) [; p! _5 S/ X3 g
location / {
6 Z. ~8 w( c* B9 N. [ root html;
, V8 k; m# o+ ~7 v* u/ S8 k/ v index index.html index.htm;4 B' n' ~% Q0 Z5 s7 c; } o6 A
}# r$ n! \6 P8 j* ^' ]$ a
error_page 500 502 503 504 /50x.html;
g/ D4 c* E% p( c; e9 ] location = /50x.html {
% c! J/ K3 L) d6 L {& }- G1 ]/ B9 Z3 ~ root html;
4 x" U$ J$ t& o' `9 a6 M( G" I$ T# ~ } t( L: R8 ` U7 u2 d& V
}/ z: ]3 Q/ K$ m: N6 v
}
1 x2 f q9 H$ ~' \9 A1 y" O9 S' Q* w4 y# L
编辑反向代理服务器配置文件:
2 `8 m- _2 \6 f; s* A& V, c& p& u- ^' Z: U# _
vim /usr/local/nginx/conf/reverse-proxy.conf9 Y+ Q3 {! @5 n' }' O6 n
+ I2 B- q+ w5 h/ J) X3 p
server
- E x: N" J$ B2 \' S) i E6 r7 h{
; K" P+ F$ @! k( D( @& n+ U3 y6 t3 A* c listen 80;
( Y g. z0 h* C& Q$ b server_name xxx123.tk;, K) z& D. {) u6 q
location / {
) n1 a& O* d3 P; I( e# [7 l proxy_redirect off;: O8 D' a. ^. e
proxy_set_header Host $host;9 @' T" L" C, m5 ]. Y
proxy_set_header X-Real-IP $remote_addr;
. f7 [% _8 }2 s! } proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;1 N$ G6 {8 |8 p7 U
proxy_pass http://192.168.10.38:3000;+ g0 J1 g6 ?; U6 Q0 B! c0 @5 k
}. W) p) v4 ^+ ]* O" u/ y
access_log logs/xxx123.tk_access.log;! {3 m: X7 g. `& f2 F' I
}' @& |9 T: D9 c2 L) E% A: A. p2 d) C& x$ p
# Z3 J" a/ C( e- e7 R* a
server& i. i4 i9 X& l( J ^
{
' p) [! \# c3 k: S6 y; d listen 80;
! ^2 h) q' z# e; V. A/ T server_name xxx456.tk;
/ R; a( y& H- a location / {
9 H4 r& L# I1 W; a& i7 i4 b5 C proxy_redirect off;
5 v2 N. t% M( W/ b( Z proxy_set_header Host $host;
3 A7 @1 n J4 \+ X2 o4 g proxy_set_header X-Real-IP $remote_addr;
; a; }# j, P) J' e* ]* A7 A, ^* o proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;3 ^" D% Z1 ^; B2 T j4 W
proxy_pass http://192.168.10.40:80;
8 I7 e' n. |* r. O }! R i# I$ ~$ c) M" M) V
access_log logs/xxx456.tk_access.log;
7 g; s" o+ Y' k- r$ K; Z}; B* F( i* k [1 k& n# e. M. l
1 @0 C) G5 s, }% O然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。 b! M2 [: `9 z1 l7 ?
- ?8 U$ v) T% }) m
upstream monitor_server {
& w1 ~; D! G/ q0 a4 H7 I( Y server 192.168.0.131:80;
" v7 o( l& P9 Q! M0 k server 192.168.0.132:80;
) R d3 ^3 v3 O6 Y% Z}, E8 d1 G% X0 |# z8 Z
5 L2 }5 k% j! e" ]+ R# }0 Oserver
; H" c4 z9 x8 L3 Z{) g) W( O- c5 K" T2 c. L* i
listen 80;3 U, p4 L6 g( ]0 `1 U# _7 e" h: j
server_name nagios.xxx123.tk;
X" ^) `9 k9 r4 w+ G location / {
) w3 H% J4 Y- L proxy_redirect off;9 e+ K) _9 e" d
proxy_set_header Host $host;( G! i8 x8 q6 ]0 e
proxy_set_header X-Real-IP $remote_addr;
0 \% S1 N# t8 N1 O. g0 n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; % h' t' H$ i& B$ x. B
proxy_pass http://monitor_server;
; @! c3 U! C& X* Y6 t% k" V }
( p' x, d4 [& ]% c4 l access_log logs/nagios.xxx123.tk_access.log;
% U: ?4 H+ V- c7 r5 x}3 C- F6 T7 J& x, j9 k0 |) q0 G
$ N3 U( w" [2 G# o
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:3 O+ \; z6 C% b4 g6 H. \
& w; }4 k, G2 U; |, A- Clog_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
9 I& R+ i* G r'$status $body_bytes_sent "$http_referer" '
# u' Y# n3 D; u2 u/ H; T" P6 Q9 J'"$http_user_agent" $HTTP_X_Forwarded_For';- I4 x! r6 [8 E+ j4 W
% U" ^' J3 u4 o0 t( q
access_log logs/access.log access;
. j8 l. { ~) t) J
A& F7 a8 D& E. x) b9 x再看看原来日志的格式长什么样:, H: c7 x2 D4 c9 K
3 G6 X+ o4 J1 R2 |5 K
1
, W8 e8 d# _/ A4 v. _+ K2
( O9 c' m5 O0 Q* `1 u! `4 W3
; y7 j1 T1 _/ w* H, _4% d6 M, u4 ^' |* J$ J9 G
5( @: ]& `, Y+ Q( U
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '( H" G5 T; _$ W% ] m$ U) u
# '$status $body_bytes_sent "$http_referer" '
, n+ C' h+ m0 v) a' \: C7 ^( U+ o* R# '"$http_user_agent" "$http_x_forwarded_for"';! h# r8 R2 K8 `, Q$ F9 _+ q
2 D! i+ r, z% X#access_log logs/access.log main;
$ t# u& f* C% x2 S' J看出区别了吧 遇到的问题 之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
9 K o1 g9 R* o% O7 ^4 n8 @# B; c8 i* l& j1 t6 Y# d6 P! ]
1; P4 t `7 T4 x: x$ {3 V
2: }* Q- J; @1 A; d6 k
37 K( V. ^" U$ s. Z' O
40 |: V6 ?4 A: K7 U0 D" @
5- { ^- F( X3 g
69 t. _7 B* g$ s1 S$ e
7) l! Z: y8 `5 g* @$ L# U
8
5 c; `% ~9 F7 C6 d$ M/ iproxy_connect_timeout 300s;
7 e" B5 H1 J6 K+ m0 t! r& C; B& Uproxy_read_timeout 300s;- X# Q2 {# t5 m
proxy_send_timeout 300s;& `' k2 f: w; p' O B1 J+ Q* U% E
proxy_buffer_size 64k;/ k& B; U9 B6 u) S# N' z
proxy_buffers 4 32k;( U! [8 G# H+ a. [ p% B! x
proxy_busy_buffers_size 64k;
9 V3 c" c/ z1 Z3 C6 e' xproxy_temp_file_write_size 64k;
( w7 e6 b2 B: I1 H1 _proxy_ignore_client_abort on;) O+ Q5 L- F9 q' ?
报错日志:
% s, i& e9 w' O0 \7 z& @
+ K1 \/ Y) `& J |6 G...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。3 n5 R2 L$ P9 N+ v& W7 a
( w, p* w- n, @7 p3 P% m
PS:关于域名转发 T0 S/ @- T4 D: v, U
2 _. P, L/ E0 F# A所谓域名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/ 的内容。
9 @; Q8 K: P: ^. Q; { |
|