管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
情景 由于公司内网有多台服务器的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
& C- g9 k5 K/ U! B7 o$ k. L U |- B! ?2 r- Q$ m
- ###更新仓库
* R) r, q# D. @# }" ]
! T* U' {; u" H* l- G- apt-get update -y$ _/ c( H, M( A" @
- apt-get install wget -y
3 `- X5 c. B E! w9 p8 q& _, a - #下载nginx和相关软件包
复制代码
2 R; j0 x# ~& w, h# @. I
" A; }% i3 l7 A/ \( hpcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。! I8 x; `1 L F4 T
3 P/ z. H1 z% z. {3 X
- cd /usr/local/src; F0 W4 }( V* d m3 m
- 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 [; J( B8 Z: f2 @. G
- wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>6 b n. M4 R; d4 \) m' X
- wget <a href="http://nginx.org/download/nginx-1.4.2.tar.gz">http://nginx.org/download/nginx-1.4.2.tar.gz</a>
+ a; |4 G. O& S4 A3 V" I - tar xf pcre-8.33.tar.gz
- I( y! j1 J$ @ ^ - tar xf zlib-1.2.8.tar.gz; P$ @# M+ D0 A! J- E
- #安装编译环境) A( t# V! x/ ]9 B/ W1 W( n
复制代码 , R- w0 ~( t! u: Q x5 G, w' B
% o$ F' ]2 r3 O" j$ h v+ y2 C3 V* ` apt-get install build-essential libtool -y
+ N, M4 b* h0 o) n4 k; W#创建nginx用户
& R& v( ^ L3 f6 b( `9 }
2 Z$ N8 j/ C- S+ F9 ], s" c所谓的unprivileged user
^: a3 {6 O) U# e; s4 p+ \+ Z
9 C8 Y5 ?) q V# q: ]+ `- useradd -s /bin/false -r -M -d /nonexistent www S4 A8 }) n% _" Z0 s B
- #开始编译安装
4 ^! A" }2 E5 J. V+ t - , p2 t) L& C1 h6 u
- /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \- L+ K9 s: O5 w5 p
- --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module F1 D- m- R/ S" I' S
- make
# W, _" d! A% @( H0 F9 _! I - make install; j% G# _; i, X: r! G3 z
- #给文件夹授权
复制代码 7 m0 H: b& W9 ^
: C2 o( O) [+ D: S- ?chown -R www:www /usr/local/nginx2 _8 A7 M: F+ M: S
#修改配置文件& E m: X5 m8 n2 ^. E- t
vim nginx.conf
% I7 @5 `) }1 g& |* }" Q: \ |4 z! G. `" w M/ n3 `- G' S
user www www;
3 P7 J: t) C/ D- }worker_processes 1;! p. u1 v8 k' g: U' E% v
error_log logs/error.log;
6 ~/ {+ O0 F5 {3 ^( Hpid logs/nginx.pid;' Q( ~: M* E! _
worker_rlimit_nofile 65535;
! T. Z4 t: Y8 x8 v& U/ [- vevents {
6 ]" N. @* y7 E) z s/ h3 I use epoll;; y& {7 _4 @8 y
worker_connections 65535;
, {1 |1 Y* _" c- \' A) |$ }}
, I3 i' F b4 h8 qhttp {
# H8 j- ]. T7 u include mime.types;
- `$ u9 N( T6 L2 o# x5 ? default_type application/octet-stream;5 E6 z5 g2 T# S) e4 M7 a
include /usr/local/nginx/conf/reverse-proxy.conf;
\" l2 _5 h0 s sendfile on;
0 b! i/ {* B% Z A: V0 s$ A keepalive_timeout 65;
) h' ?# `- F# \" f. o gzip on;
2 R* F! | O2 G" n$ }$ b8 ? client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户' S. C; ~: t4 `0 ~6 `* b9 |
client_body_buffer_size 256k;
* r! v! }, w! N/ P' |" }/ D client_header_timeout 3m;7 G7 k$ j/ W3 {! ^2 G( v O
client_body_timeout 3m;/ k( s% k1 ^+ E, J. t
send_timeout 3m;) R, L& g7 A6 o) G+ x# ^! Q6 ^
proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
/ M" U4 ]. }! D, [( Q% J( K- u proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
" O' p) ?0 p9 Y3 y" n) f proxy_send_timeout 300s;
3 X0 i' x! P8 s proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小6 ]2 }* _2 O J' K% b1 @" }
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
' ], `! l6 J o, C proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)3 V% p/ Y2 R; d- \1 X) P/ e
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘* l7 S4 Q+ A+ @
proxy_ignore_client_abort on; #不允许代理端主动关闭连接
! m6 m0 u- H) `1 \ r. l0 O server {/ r( L- Z4 w4 a" F' [
listen 80;5 q! D' v- y( O B* o
server_name localhost;1 Q$ C6 s$ t- }* n
location / {4 |# f3 a3 w$ i+ h" s$ z# [7 ~3 i
root html;
7 F( w4 W/ [9 O" s# o index index.html index.htm;* H; |- U0 W' Z4 _/ U$ N
}5 h( ^4 m& A w2 y% p# X8 D
error_page 500 502 503 504 /50x.html;
2 |2 f5 t9 O; K) ? location = /50x.html {
6 a% q" }+ X% j7 @) t+ P root html;4 v# ]$ C" a, S( \3 b+ t# D" C. r* B" }
}
) i! Z g) v8 _( g+ s7 B }6 F6 ]0 R6 n# u: M b0 D" g
}
* {5 X9 ?' [ \) j- ~
0 i# W& F l5 O4 E+ v3 Q/ l# U编辑反向代理服务器配置文件:) m* N6 I) t6 l; S, y+ [+ @
4 }# U, N& Z* W+ M' l4 v" U3 b* W
vim /usr/local/nginx/conf/reverse-proxy.conf
0 y" |/ e; S3 R) a+ v; y! G3 ^7 {# d* ]" s, R1 g# n e7 a
server
- K! e3 s. h5 V. U# _% ?) n# @{% {2 ?& F4 z8 a, W
listen 80;. J+ i+ d8 r Q' P
server_name xxx123.tk;
) G. J: G% D) q! T2 a* S) f) I7 I location / {: J0 @' }4 w+ \3 @1 v. J
proxy_redirect off;( T+ D2 y q/ V; @: G1 ?
proxy_set_header Host $host;
2 P, v0 e6 y0 @! k. S proxy_set_header X-Real-IP $remote_addr;% |# s2 O! ^. i$ i* h0 k3 W. K6 E
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;" A3 b: @$ K! i" f: g! \
proxy_pass http://192.168.10.38:3000;
; j. w+ ` E# G+ O }
4 t J. ]1 }8 z6 O2 e access_log logs/xxx123.tk_access.log;
2 Y: F; W3 x; P}9 t' E9 J2 W. u7 v9 c( C
5 V0 K: v2 Y( s# A( f
server
4 z! y* g* }: Z{
. e# R1 r( n2 R7 _' z" K; I- B listen 80;
# F# b5 x1 Y% G& z+ x Y server_name xxx456.tk;) h/ z8 Z9 ?1 _# `) y3 k0 w( M
location / {
" T B8 |5 s1 v) B3 U: m5 C% I# x# M proxy_redirect off;% N4 H0 l7 q1 K4 _% G* j
proxy_set_header Host $host;$ g! v y) r: D, h W& G
proxy_set_header X-Real-IP $remote_addr;
2 d7 ~1 ^2 u" e+ _4 } proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;. }( m F7 V# } m" Q |: r1 P/ G
proxy_pass http://192.168.10.40:80;
) ^; [6 i" k. X, W }
+ E% }7 i+ ?- b1 N9 R access_log logs/xxx456.tk_access.log;# H, G* }4 J/ b7 K4 m. N
}
! }" V0 o0 L( T" T" O1 ]
4 j; d, y( c( Y7 r$ b; c然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。
9 ~; I. x6 ? h' d0 p/ k( f8 P& K0 U& K
upstream monitor_server {# B1 v% C" P5 a( C1 I
server 192.168.0.131:80;
& p" X8 U; F2 t" d* j) m* G server 192.168.0.132:80;
, u+ w$ G) f0 R! u}7 X+ w" W% P0 }( _$ P
9 R' V* X$ X, [8 w" N$ P& tserver
/ m/ u& t' |. @# ^{
- [6 j. T( e6 r) r j' u1 ` listen 80;6 h2 Q7 p, k: |
server_name nagios.xxx123.tk;
4 m( B5 G1 q: c0 C n+ k location / {$ e1 V' u& J6 n& E y
proxy_redirect off; F0 M" O9 P$ Y- V- a
proxy_set_header Host $host;
) h& l) A; [ a' y# D proxy_set_header X-Real-IP $remote_addr;
1 T; u/ v5 g5 @9 p' Y proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 8 g% W; a/ z; I2 u
proxy_pass http://monitor_server;5 ~; x( q2 G+ p- m: M9 q1 M
}- {! y. m( u) P( \
access_log logs/nagios.xxx123.tk_access.log;
. D, {5 ?- e9 y9 @. Z. c3 C}
5 k* g9 Y( r3 p8 F! B/ a7 x, o( E
& e& A7 J5 l4 k1 ?1 |# X额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
" o& q! E, z \" z) q2 C8 c7 N0 K" `
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
1 w7 d+ {6 Y4 G+ L'$status $body_bytes_sent "$http_referer" '+ G8 E j5 x% W s
'"$http_user_agent" $HTTP_X_Forwarded_For';& }5 O; y! {' \ y
" t. c5 g' g" c, C& O/ v
access_log logs/access.log access;" t6 M& o; v( z* r
# k) t0 a. s7 s3 a3 X再看看原来日志的格式长什么样:
0 n- V, ? Q5 G7 C: Z+ I" E& o' X; u, {$ i% a
1- K0 e! {5 H, k+ f$ V) C
2* i5 S; t8 w% h& q6 ]/ r$ s$ N
38 I9 \. d6 d' S6 D
4% C/ S r2 ^# a: M
5
) v% K8 _ i7 a#log_format main '$remote_addr - $remote_user [$time_local] "$request" '7 F6 S6 l! B, `* {$ H
# '$status $body_bytes_sent "$http_referer" '/ w3 `, ?6 j% I0 b
# '"$http_user_agent" "$http_x_forwarded_for"';
4 P* @. |/ d- H+ W, N , N. j- }; g7 I+ s) b C
#access_log logs/access.log main;3 y8 G# P7 k8 y; B
看出区别了吧 遇到的问题 之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
' r9 ]6 r' }* C% c* C) \ W# k, Q8 X6 S! ~3 x. M3 i
1
+ \9 [- r' Z$ y, t d2! }* H" e" j$ J8 X8 q
3
$ J: ]* ~ P1 c! t2 y2 P4
|& f- E6 ~, _; z4 V' A3 m6 ~/ K. e5
! n3 @& X4 }( ]! A* z* y' V+ }6
5 T0 [ _. K2 f3 \* X* M+ H" _) b70 l) b* b0 [) d/ r! ~7 f
8* C1 N4 z9 a5 a e6 X
proxy_connect_timeout 300s;
3 M4 w6 J3 F# l7 o2 Aproxy_read_timeout 300s;
" s1 {/ G+ Y* W( ]# l' }proxy_send_timeout 300s;
- N* J9 ]& ?- Vproxy_buffer_size 64k;
" K: x) q" U- o; |1 a$ k+ q6 dproxy_buffers 4 32k;
; U" p4 A3 e; P% J4 ?5 C# @8 q) c# lproxy_busy_buffers_size 64k;
1 g; [. G9 ?, b; `proxy_temp_file_write_size 64k;* r( [# O: A4 M }
proxy_ignore_client_abort on;
( F5 S) n9 {7 j: }$ ?报错日志:5 q9 N, N8 k& L M
8 p& W/ t& @, ~- c
...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。. c& d/ @( a; ^8 o6 y2 k+ q
. S( e1 b2 V! O; O1 O& A1 ]PS:关于域名转发
" w: K4 _( M' I# P% s1 O/ S! k
# |, R2 U: w7 ^所谓域名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/ 的内容。
% q8 w9 \( H% ? |
|