管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
情景 由于公司内网有多台服务器的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
* y H2 Q( H |# ~
" d& b) c& L" I- ###更新仓库4 H- j0 U: _" {+ Y3 q1 ]
y+ E0 g( V* j' b+ }, D+ @. k# A- apt-get update -y0 b' k. D" W6 N+ G- ]& i
- apt-get install wget -y' H" h0 n* [5 d: a: x
- #下载nginx和相关软件包
复制代码
. v+ @2 v' q7 `! U4 P
. R( Q* E8 O4 ^1 x7 Q" P+ vpcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。% V) K' U4 T; m. S
) b+ n5 ~2 C, p4 T' o7 O h
- cd /usr/local/src% V% z/ [4 P# E' m/ a
- 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>- Z, r! @0 o/ q; y- @ F. f+ [; F
- wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>
4 g* |* M& @$ C - wget <a href="http://nginx.org/download/nginx-1.4.2.tar.gz">http://nginx.org/download/nginx-1.4.2.tar.gz</a>
/ w5 I; \0 `9 f - tar xf pcre-8.33.tar.gz! F) \/ y% X. j/ y! h4 c% |
- tar xf zlib-1.2.8.tar.gz
4 D. @: w' K3 {. C6 m1 Z& w - #安装编译环境) e5 i; o* T- X3 D% `2 ?
复制代码
9 f) _8 j' L, k- F. l
- f7 E, R6 B8 v8 E9 }( O# h apt-get install build-essential libtool -y
! b2 C Y( Z5 H* w#创建nginx用户' r( i. A7 `. v7 P! M! y
8 Z" o2 i( G, d$ L, K4 B
所谓的unprivileged user
( ^6 Q) M8 P$ a" Y4 w; z; \2 f) w. e" R
- useradd -s /bin/false -r -M -d /nonexistent www s4 _5 U" R5 E- m8 ~( H0 D
- #开始编译安装
! K& I% z4 D' R4 E+ k8 N2 m - 4 \0 K7 ]# Z9 o" Y* |; H; s# I
- /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
5 M8 E. I7 y: @% | - --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
. Q* P- ]7 h Q: M% s - make4 h! v! Y2 S B7 w% l! r. a2 r: ~9 Q
- make install6 y& L1 O% s8 z3 d1 T1 u8 } `
- #给文件夹授权
复制代码
9 n& E7 T+ N' H n& \& \
& \8 [6 {; n4 _" i* }" e0 Tchown -R www:www /usr/local/nginx
/ d: n5 C! v$ z( S, C#修改配置文件
; y* T. z" h+ O2 ]* B3 p' Gvim nginx.conf
% X4 s/ `. A$ |7 ?3 @3 M7 t: z+ C. ]. |/ W
user www www;9 j6 B# ^2 h( A1 J! l k' R
worker_processes 1;
6 ^: {1 k& _( J, E( |error_log logs/error.log;4 U T3 A4 D$ P, n
pid logs/nginx.pid;
6 C# M8 B7 t# ]3 q8 ~9 e+ ^worker_rlimit_nofile 65535;* \, y' Q0 u9 v* r
events {
- h5 @: y+ b( I, L4 M use epoll;* g8 z! b. P/ m$ i$ |
worker_connections 65535;; f$ q1 Y: u! r/ T# h. D" s$ o, E" O
}. s$ B! e- G& o* Y
http {
9 l+ |3 W0 {+ c. d( M. R2 O; B1 E include mime.types;
( t2 D. z; l, q) P# {+ t _ default_type application/octet-stream; O8 D/ T8 y- l! `6 Q
include /usr/local/nginx/conf/reverse-proxy.conf;
4 j" ^5 l- q. \: b( _ sendfile on;
R$ M# L$ n1 Y& m+ H) B) `) O keepalive_timeout 65;
" o1 z. R% X6 g+ R1 `: r gzip on;
' }' s+ K: W8 L+ l7 R' k; I+ R client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
, ~( g: m0 [9 v' d client_body_buffer_size 256k;9 H, v: \2 f) n3 g* I* `" j c# q* \
client_header_timeout 3m;
& i8 d0 c) n! t9 y1 m/ w( E client_body_timeout 3m;7 L7 \( p9 f! {& e3 ^1 `1 E
send_timeout 3m;* J% q( V) N2 A- ~( ~7 N* {$ U
proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)$ k1 q9 N/ A3 k7 \
proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
: {' @3 w" @0 n% w0 [ proxy_send_timeout 300s;
& F/ k! i( a( x# X* i proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小. `2 F0 }3 s i; M: s- p
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
) U2 X1 Q/ O1 F, v! c5 V% Q7 a proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)( S" |- q1 x) W( y6 n* |
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘7 G& [4 S4 ]* i7 c# N \1 ^4 x; O
proxy_ignore_client_abort on; #不允许代理端主动关闭连接
+ r0 \0 J& z: W9 V server {
* M6 Y/ Q8 t# T$ U: c listen 80;
: h( G3 O+ N5 B5 l# P# ~7 x8 X! @/ v+ v server_name localhost;
v9 r; y- K" O9 Y! _# V location / {
% r& a& S/ `* ^4 B! ]- ]6 _ root html;
! D2 O1 ^# b3 S9 T. @ index index.html index.htm;9 I# x5 A+ d6 e' ^; J! E, `
}: \. B6 k. h! M& _
error_page 500 502 503 504 /50x.html;. u+ E g$ o# P* e$ N
location = /50x.html {
) T8 U- Z( O- j( q: L root html;) r$ G3 B3 b) Z! P* O# q3 P
}( E: k" P# ~' @; d! z3 Y! q- `5 A
}
# P% l% h! W& w4 v}( ^7 C2 z/ @2 h/ U7 w
' _: O3 k4 i. x N, p5 p. ]编辑反向代理服务器配置文件:/ s1 Q1 m1 V! C& f" _) ~
+ L0 Q: W# c0 I x# H' Bvim /usr/local/nginx/conf/reverse-proxy.conf
- u5 X H; l. z) {" [% V2 m' N' H+ Z7 A5 h, D9 v! |3 O8 L
server
) c* R O- A2 z1 _' A{ u5 O8 e4 k+ E4 Q9 D* |
listen 80;- k' r0 o9 `3 B- x5 i1 L. l
server_name xxx123.tk;: b T7 ~& i5 F+ o8 F2 S: X
location / {& Q" a$ j/ _( ^! I' a1 |
proxy_redirect off;0 z, }( a) \' Y: e$ V# c/ C" y
proxy_set_header Host $host;
p7 R+ O; D, } A. Z proxy_set_header X-Real-IP $remote_addr;* A/ A! r) k( x m4 g" Q2 I
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# y3 ]' N+ v* F/ \* h/ @; Q5 L( R
proxy_pass http://192.168.10.38:3000;
, K% P, j# l3 [. C }
9 G2 X, U+ b3 R4 N3 D P' X$ Q access_log logs/xxx123.tk_access.log;. p8 }# K3 p2 k, C$ Q3 o1 w Z
}
+ ~/ K# T) x" ?1 ^ ' \, P0 d9 e' v; O$ L9 V
server
& G, D, b3 O% K{- I# U w2 ]* C
listen 80;
9 B& j9 m, e5 k8 K4 |$ ^0 F server_name xxx456.tk;$ g7 j0 `8 l% n/ i4 r. i; g
location / {0 m% t, K1 t% }; [3 l# ^. h, t& @
proxy_redirect off;
0 J1 c s" H, H c, P# @: n proxy_set_header Host $host;
9 O$ b5 k' }2 @7 G$ |2 H. g proxy_set_header X-Real-IP $remote_addr;
1 Z5 \1 I& p! h proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;' n& ]- \. I% B1 v0 p- P- K' e$ i( {
proxy_pass http://192.168.10.40:80;
* m9 g& Z. K$ w$ e0 e; Z }
8 j- \( |, K+ d0 T0 f% j access_log logs/xxx456.tk_access.log;/ I4 x4 D- i8 Z/ ]6 H$ L
}0 ?: i) a8 X/ v5 L, ?% {
5 M' C# `1 R& N7 P
然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。, Y9 n; Q8 P4 Y8 }4 i
+ R) t: _$ d& v$ M- `# }( _, D" Z; Pupstream monitor_server { Z9 r R0 P0 T' b3 s
server 192.168.0.131:80;2 a* u8 n3 K4 s4 s( [" K
server 192.168.0.132:80;
2 Z M; k" `- \3 |& R5 Q( F: a( X. i}
2 o P; U' T8 e+ ~ : _! R' |4 Q) L+ ^
server7 `% e2 l* i' P9 c, u
{$ g/ Y0 ~/ n3 K! ?" r$ V
listen 80; T+ m& P2 g) u R% M, k
server_name nagios.xxx123.tk;# y) z& t# u! q( q; v- n
location / {% t: c" q, S) `( |9 r2 K
proxy_redirect off;
, t3 h# b# L8 E proxy_set_header Host $host;# p) ?% m* s' b: ~, L0 Z" A! _, u( x. J
proxy_set_header X-Real-IP $remote_addr;
( S3 \. D: q4 C T* H5 ?) Z0 t5 _4 t% M proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; : B) `, s9 T( L
proxy_pass http://monitor_server;
, ?5 ?! _6 Y3 A+ u$ u' N$ _ }
: p# V6 ?; W, ~3 [1 j/ K access_log logs/nagios.xxx123.tk_access.log;
# h. a; {, o1 Q) I3 X- R% @$ A* v5 _}' V4 O) w' p+ m8 S
# e" v+ L" ^; U% _+ m5 e
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:! a6 y6 v2 Q0 g6 U
7 \) H0 {8 z) v, k
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
4 r8 E3 r* Q4 x4 `2 k5 _, T0 Y'$status $body_bytes_sent "$http_referer" '0 T4 q' k0 p, X* N
'"$http_user_agent" $HTTP_X_Forwarded_For';! I4 h$ {) \, u% B' f" t
7 t+ Q) w& n0 h Laccess_log logs/access.log access;2 M2 D8 X& p; y* o
' Y9 N1 e- W9 c8 x5 X3 u9 F' i
再看看原来日志的格式长什么样:
% y. S# g {! n3 [& ]* T N
$ f8 W4 w: r6 K1
4 k6 m$ n; M0 y9 {4 i2+ Y% a; x2 C2 V2 c; m: q& u
3$ y( n1 g2 D2 i
4
7 u' h5 C+ |- v2 ~& {58 `* W3 z! D+ Y- H% P3 l1 P
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
1 X6 P y8 Y' r E# g, T# '$status $body_bytes_sent "$http_referer" '
7 i3 n1 A1 j5 X) l3 F( k# '"$http_user_agent" "$http_x_forwarded_for"';
3 N$ e& T: k- p7 W5 o0 U& l( o
6 g8 |/ N" K$ e; e0 d#access_log logs/access.log main;
/ I+ M2 M0 g5 j2 e6 [, `6 _看出区别了吧 遇到的问题 之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查9 y1 c5 d. }; @3 X: J- I6 \
! d( s3 ?! s! U! P
1
D+ F9 H ]& D, L7 H2
' r; v/ ^6 |; a7 b% m. I3
+ x* ~. e( o% f/ w, C' I1 \4
- u/ h: i& A7 }3 V3 W) \5
- M* B9 {& q, y" E6 O/ E+ d' [+ |6
1 S& }/ _0 F$ Q4 }6 h7 b) Y1 \7
* e% y) X! k$ q# L- ]% t9 {) C8" {5 i3 ~7 k5 N" e+ D5 E# D) ~. y
proxy_connect_timeout 300s;
7 w7 [) C" P# Z4 I/ O' g! E- Q) Tproxy_read_timeout 300s;6 z& ]& n; C6 Q2 L
proxy_send_timeout 300s;
' j( H$ j- y9 ~2 F5 d* @proxy_buffer_size 64k;& l# m, J7 K" [! j# _
proxy_buffers 4 32k;, i/ c" b2 b( k5 ^. r
proxy_busy_buffers_size 64k;; c) ]5 m) S* K; l: u. T
proxy_temp_file_write_size 64k;+ B9 G1 J& y: q: i. b
proxy_ignore_client_abort on;* Q" D1 b0 p) x" W7 T, u
报错日志:2 N2 s2 T! n4 | R4 E% |2 k9 V
3 o2 D* Q# Z7 ^5 K0 |...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。8 @. L0 L2 m2 b( x5 F/ e- W: Z0 q
$ E; O5 X0 @- C# E V. _PS:关于域名转发& `9 ?$ w. v! p6 \( m9 m/ z- {
6 z ]; c% o! \2 N7 ?
所谓域名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/ 的内容。) C# R, v3 i0 K0 r, b$ _
|
|