管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
情景 由于公司内网有多台服务器的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
% n+ {* E1 ~" U' N% f2 p/ r `" s% r. k
- ###更新仓库2 T! e' Q! Z) G4 B3 o3 H
- ' a$ j% ]4 @1 w' _
- apt-get update -y1 o2 x0 |1 g! u1 f! ]
- apt-get install wget -y! B+ X) n: ~% m6 F' X) {, r, F2 t7 ^
- #下载nginx和相关软件包
复制代码
' ?% I! h9 p, J H) L. j; x
, }: X2 t5 O5 @& q' j& d4 B6 Rpcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
* h9 ], m7 _& Y1 n2 R9 j
5 x( \3 \' y: b \2 W7 f' ?) x3 E- cd /usr/local/src. p+ X. D" G6 \) J! V
- 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 N9 x0 Z8 r+ @ - wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>( Q1 [0 }" x, D- P8 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>
, d9 O' ~: ^5 L$ e+ j* f/ S - tar xf pcre-8.33.tar.gz8 B4 p) v0 s! @& W% H
- tar xf zlib-1.2.8.tar.gz- z% z/ [) p: m/ L# k7 r" `
- #安装编译环境
x. u" {/ d& R2 |
复制代码 # c6 z) H& k/ u' e9 B( x
' p' k0 q n1 G! D- i apt-get install build-essential libtool -y
6 u1 @& l8 U( Y- N/ v' w7 g; J#创建nginx用户) i: F/ \) s+ z1 [. e( w
1 @5 m$ z2 G/ f' L! q所谓的unprivileged user% u7 ~ S/ t5 K! w% E: Y
+ \6 j1 U/ o* W, r* \- useradd -s /bin/false -r -M -d /nonexistent www* O* W% I J! _# K) }( Z1 T
- #开始编译安装
3 V2 U5 K' M7 F6 j
' R& J7 o3 g# N) S! E- /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \) P) @( P1 x/ A5 t
- --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module5 | c4 {4 F& ~, o+ b( H2 C
- make
, v. ?, M4 C6 n. f% [" R/ V. w0 T. Y - make install
+ @& `5 x, w% J3 w* e7 r$ f9 n - #给文件夹授权
复制代码 7 Q5 w2 O$ v6 m7 x( L
& F+ O7 ?9 k5 o# ~8 _, s- gchown -R www:www /usr/local/nginx0 h3 K. O1 _* m
#修改配置文件
5 R1 _- N* j `' u) j, rvim nginx.conf% r+ S2 s+ ^) A8 J% _6 O
2 C& T3 k! u! ^+ v8 j& ]8 B
user www www; v3 ?0 k) Z. }; ^( x
worker_processes 1;
9 B9 h; ]5 e1 l1 Y8 J8 }error_log logs/error.log;
3 {( g# F/ F5 Cpid logs/nginx.pid;, q2 Q: J" W, C5 f
worker_rlimit_nofile 65535;' A' B' i: t1 B" x" c2 ]
events {: t" s5 g9 H* b/ F& C
use epoll;
; h$ Y+ M, t- Y1 Z9 y1 O* ] worker_connections 65535;4 g; a! `; U5 t1 R3 R& _7 ?
}
+ }- e1 A' `1 |: p% ahttp {
- d! d3 h3 h8 ~$ l o2 p- S# G include mime.types;
' z7 i1 A4 ~% Y1 U0 I( I2 L- s* K! W: X default_type application/octet-stream;1 q0 k7 X6 B/ G0 y2 _
include /usr/local/nginx/conf/reverse-proxy.conf;
5 d1 F3 u, @7 y& \+ g7 S; n: N sendfile on;
0 m0 h5 ?: r0 _) N2 b/ {" H1 ~ keepalive_timeout 65;
1 y; _: a9 w+ E7 m5 E gzip on;) ]/ y7 c/ h6 l3 }2 ?8 P, b1 ?$ N
client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户; `, U( y% \, F- ]8 f6 k: J3 U+ E
client_body_buffer_size 256k;
9 ]" ^: y# o2 v- Y client_header_timeout 3m;
# l! B+ B; R/ b' p7 d client_body_timeout 3m;5 H2 c3 H- k; M. T3 i8 e
send_timeout 3m;
1 I1 \1 k5 E# c9 @+ S. ?! k- B proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)0 }* ]9 h: ]& u; B+ ^
proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)6 D! n$ Y5 G1 c! Z
proxy_send_timeout 300s;1 S, M% z3 K) \% @0 L$ K
proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小" t; Y2 L* d( P* T0 P# J
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
4 |& v+ i: ^- M8 C7 W8 b" L proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)" k- m- }. j$ E# m
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘( f' G) O' W& }* Q! y" X
proxy_ignore_client_abort on; #不允许代理端主动关闭连接
5 |; H$ s4 z/ s, |; O7 x2 n server {
; ^3 z8 |& f) j: z0 A listen 80;* F, m4 A4 C4 I3 S4 z8 D" N: d
server_name localhost;
4 G2 g6 {. A5 I- y/ G1 `, S0 X7 x' F location / {
7 o9 Y* a, E2 `: V# t' ?. } root html;
. ?. Z" a7 _. K index index.html index.htm;
' x4 g# Q: H' d% p5 N& R }
" s/ S# m- _# o/ r0 \ error_page 500 502 503 504 /50x.html;
( k6 c8 e! f% @2 t* Q location = /50x.html {
! J! i* d f/ H7 t+ l: l root html;
1 a% n/ e" r4 _2 X! Y }9 B* O2 S# E+ H9 X$ [% V' a- Q9 ^
}! v2 g* L7 k7 _, `( s
}; t8 d7 \: k4 B- p
3 x* X( V% T& Y% c* ]) h( C编辑反向代理服务器配置文件:; h( s' d9 J# k5 h
- m1 _" z- j7 Z. r1 f% R
vim /usr/local/nginx/conf/reverse-proxy.conf) C0 {0 w9 @/ H! X3 y3 U. k
0 d1 \3 q" C! t; o4 g& l( ]server, f! z v, |0 `) P
{3 X8 P& v: q8 e% b6 j8 m9 p
listen 80;5 i3 l5 Q$ ]; s! _& r( I' Y
server_name xxx123.tk;
' K% V4 a$ Z" g6 d+ c location / {: M4 g( b5 d/ t; a; Z0 j3 Y
proxy_redirect off;
& ?8 O' \& m( t8 E proxy_set_header Host $host;
3 R* o: d5 j" t- I' \" \$ Y proxy_set_header X-Real-IP $remote_addr;1 X# Q2 y3 V# k/ c0 B
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
8 g" `) s* P# [6 Y3 P proxy_pass http://192.168.10.38:3000;
4 E% I# V% y& t }9 o* w( i' \, D0 Y9 _
access_log logs/xxx123.tk_access.log;
3 \6 y# ^0 @) {" W1 v2 f}
3 h3 `) a G* F: d1 H( k- ~ : K7 c$ T/ }. Q' i2 N
server: U1 {: G! j6 c, a' _% _
{
9 I3 H2 E" }3 `+ s+ @/ C listen 80;
# V) O B, U8 A+ T; Q* O server_name xxx456.tk;
% O0 K3 I. e: H6 y location / {
8 \4 `# A. _9 U5 d. A) d3 L# Y2 o proxy_redirect off;
6 M6 r9 D" F: ~3 ?, W! S proxy_set_header Host $host;
7 j+ i% S# `! u, _ proxy_set_header X-Real-IP $remote_addr;3 w5 ^" h* a& A9 C1 k" D7 u5 i
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- K6 I/ X1 b4 c: E, g* B- { proxy_pass http://192.168.10.40:80;
: t6 L* d% z7 T# j; f" V( d }
8 l& Z: u" l4 I8 X# B' c8 z access_log logs/xxx456.tk_access.log;
% Y6 M5 C* h% y7 g}: m% f% H4 e3 k; o. J. d% S
" B# }) c, P! P* |然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。% i0 E9 o& U& q; c9 V
+ J3 w# Q+ D0 Q* q- ^: N0 v& Eupstream monitor_server {
9 k$ A9 O$ Q, X server 192.168.0.131:80;. N( y* Q1 {6 o8 r; y0 d, X8 y
server 192.168.0.132:80;
" y5 W( }( u7 o}+ q' d( ~2 J8 l# s
( O! s# L% T# W: L% userver
! ~2 r2 k7 y. K, W7 F! {{
a6 O8 P7 N" e listen 80;& x" b9 q% g4 a1 S- T" g( X
server_name nagios.xxx123.tk;
, _+ j* c+ R& q. z) ^4 _" D2 t location / {" S3 f0 a- N% F7 ` O
proxy_redirect off;$ Y/ J0 x: A) O; o& k$ k
proxy_set_header Host $host;
# y7 s9 k9 i1 A& I4 b) {7 n proxy_set_header X-Real-IP $remote_addr;
8 p& B7 C/ g! ?: r, l; { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
2 b! x/ n( b$ d/ B proxy_pass http://monitor_server;, f; i* j5 b1 F6 k
}1 K' @, f; H4 c4 a# |# b, b& t! q0 C
access_log logs/nagios.xxx123.tk_access.log;
! K5 E1 m" M# u( q. a# j}+ U7 W# u5 d% N2 }% y
2 \3 q7 {, O5 X. v1 g
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:7 @4 K& ?1 }9 \) l" A
% ~/ h2 X+ q1 S/ g! i
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '% u7 B0 i# ^$ C' k" f
'$status $body_bytes_sent "$http_referer" '
7 t/ M) F; q. m: b'"$http_user_agent" $HTTP_X_Forwarded_For';. b# z8 q) z8 ?! K8 Z4 c4 n" @
6 w7 \9 W/ _$ ~ @. l3 H9 w! F0 \
access_log logs/access.log access;1 v: H; p H/ C v z A7 a. R
, B" w1 [9 g2 H& k6 e) S7 B
再看看原来日志的格式长什么样:* ]1 n, m. P% R: K7 g- A. M
1 a, C' h8 k- y! A, g1
; L; q" j& p# g. s3 a0 _2
# P1 C$ c( I: }7 f$ r% `0 ~0 }3
2 A- O# T# j4 M! z- Y4
* v) C9 n+ c7 X, ]0 w! \57 x# w: `5 d5 K. r( g
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
. b7 A4 a! A/ `% a. v$ q# x n# '$status $body_bytes_sent "$http_referer" '
! `& E! \2 T# q: k# '"$http_user_agent" "$http_x_forwarded_for"';4 }% U! L3 C& m
! }8 O `2 s" A#access_log logs/access.log main;
9 T9 K8 K& m l' d8 P/ H看出区别了吧 遇到的问题 之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
; |7 N F/ P0 Y& B" O1 i1 A/ c$ d2 d9 b# L; @4 ^: n' a
1
3 I: r* a9 { A# Z& D5 }9 I- a9 l27 F; P% U0 |" ~+ i
31 l" l# j7 M4 ?! d0 O# I' X" ]
4
5 }; [; o* U( f" V4 l59 J/ @6 O& P" `2 L2 ]
6) S, T& ]4 `1 ^1 [( r5 }8 |" i M6 h
72 g8 h5 ]% N( q0 H1 U, M6 U
8
% o# j2 r5 Q- n! uproxy_connect_timeout 300s; U' M" i& @6 {" R( o' P. n. P" k
proxy_read_timeout 300s;
- B2 J( B+ p+ Jproxy_send_timeout 300s;% J! b9 N6 B5 c. W2 p g% X% X1 [
proxy_buffer_size 64k;
' d1 f, h" c3 W8 \proxy_buffers 4 32k;
& H- r/ J+ E9 i+ f8 I9 f$ @proxy_busy_buffers_size 64k;+ t0 v2 S+ H" P# a
proxy_temp_file_write_size 64k;$ L" @- g& A# Q1 q# V5 K# D* K
proxy_ignore_client_abort on;
3 { u/ q3 K) y6 h' J6 e1 n' d, w报错日志:9 n9 G( N7 F! G6 f
; z; N. f! {/ V8 x1 z* e1 Z) m
...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。# J$ g! G# k; j4 e7 D) @
. B) _% e* }: \/ Z7 D
PS:关于域名转发4 s% A! K: [, `; f6 D! N
1 Z f5 r/ G6 _
所谓域名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/ 的内容。' h; }' B8 q3 o
|
|