管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
情景 由于公司内网有多台服务器的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
/ q) I. U3 e# x$ K5 f% d/ i4 R
- ###更新仓库/ [2 F2 j# U( c( u, x9 o( T
( S+ J \- Z R' m- apt-get update -y
# f, Y- ]9 d% D - apt-get install wget -y
7 l! k6 v6 B0 I! O! q5 E - #下载nginx和相关软件包
复制代码 8 A! W; y9 V# T) V$ x
+ Q% N# z% _- o. Tpcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
8 w2 R* t! P# `, M% T* H+ E" n9 J# U4 a, |2 D
- cd /usr/local/src
6 m' X$ I( q& K% b - 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>. u( ~$ S( y( \+ M# i, `+ d
- wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>+ G2 ^/ F; o# f1 X. x+ `/ a$ y
- wget <a href="http://nginx.org/download/nginx-1.4.2.tar.gz">http://nginx.org/download/nginx-1.4.2.tar.gz</a>( C6 u5 {* y# W0 x2 e- b
- tar xf pcre-8.33.tar.gz
/ `/ X% l; R, v; K5 k# e$ u! R - tar xf zlib-1.2.8.tar.gz( C8 ]0 X4 l5 }9 o: j- @( }+ ^
- #安装编译环境1 P3 n- G) O% j
复制代码
6 c0 {0 e; G. C0 Z* p. x; X# ?* g! {
% n H+ r7 C# U2 I: ^ apt-get install build-essential libtool -y
6 J1 i' c/ _) f! t8 ~#创建nginx用户
$ m9 ^* E5 q, t+ [* Q9 ~/ B. C8 v5 P4 K' a5 y
所谓的unprivileged user. h* q& Z7 {4 h4 [& d* D
- G) I, S4 j# b3 i9 @+ R% A) Y- useradd -s /bin/false -r -M -d /nonexistent www; G2 X/ ~# ?1 \4 ~ V( z
- #开始编译安装
2 w' \4 x- L3 Q
8 U/ l; Q( n6 k8 r- /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
9 V' P0 @2 @9 o* J3 L0 s - --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module% K# x- s; H2 U; _- B. o/ M8 l
- make" a- v" V, H8 S" [$ ~
- make install
/ s0 ]; R& l3 s4 A, L, ~1 G - #给文件夹授权
复制代码
9 S" C% F; [! I
+ p$ i+ v2 T+ ?# p9 L9 Bchown -R www:www /usr/local/nginx
- U, R! T3 {7 { q' H- h#修改配置文件9 U4 E |; c7 _. _' x
vim nginx.conf
% e) z6 J7 I" z# y" X6 ~- c8 x6 T
9 }; u: C* b( P& p' u' G1 a& c: Ouser www www;
% B- L+ k0 E. f5 o8 pworker_processes 1;
* | D7 U2 `1 w1 Lerror_log logs/error.log;2 ^+ l0 {- t/ f5 j, s
pid logs/nginx.pid;
% w% |1 r6 J: C0 D5 u9 \0 ]4 Hworker_rlimit_nofile 65535;
7 \- {7 `1 J( |2 k0 ?. jevents {- d( o& s! z% F, I6 @
use epoll;
- e5 x, E0 @6 z2 U" G worker_connections 65535;- ?# W" W' V5 c5 h
}
5 S6 W1 h% Y+ f' mhttp {
5 {, k9 i2 D* c8 N' y include mime.types;
% P0 S# {4 C7 ?! R# ]. V; ` default_type application/octet-stream;) O" r1 e: q. t/ A8 q! e9 j
include /usr/local/nginx/conf/reverse-proxy.conf;
& N; i! e- M2 M+ B, b1 d0 R sendfile on;8 T( U) w4 u* z8 U
keepalive_timeout 65;
7 _; _/ p; S# }3 P$ Y/ ]% j3 | gzip on;- N: W* s" B6 l0 `1 l, g5 r
client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户% B4 C$ L8 U% S& v' {
client_body_buffer_size 256k;6 X5 [) N9 [2 M/ C h+ R
client_header_timeout 3m;2 m0 v- q/ `' d
client_body_timeout 3m;$ e* {+ d9 F+ m" p
send_timeout 3m;
9 H# j8 v( @' x; a proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
& T1 o* ]1 j/ O o proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)8 O6 ^) O0 O; O5 Z) Y9 b
proxy_send_timeout 300s;
4 I b: _* l3 w5 f proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
- M8 x0 @ m: @ proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
, o" V3 g+ W% }% @( p/ r6 t proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
q" Y3 }) K5 D3 V& u proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘# ?8 t% `( M, k
proxy_ignore_client_abort on; #不允许代理端主动关闭连接
6 Q. Z' l4 P% N- q server {
. k0 i- d: `! ]; `$ _6 r- ^8 @ listen 80;
. b* H" Z) T# s server_name localhost;* s' H8 L; e- \4 J* r1 ?. P( [# f
location / {
+ R6 j1 G- ^. a) t* k8 s root html;
0 z# p+ {& J# B Z index index.html index.htm;- [* y9 I E6 _9 C( Z" z) g% M
}( r* {8 P# s' s, i r( F" L* f
error_page 500 502 503 504 /50x.html;
1 u# i/ l8 f+ o2 x location = /50x.html {' Q E4 B$ |8 T) h
root html;' a& p7 Z+ b \+ ]2 R/ X" i
}
4 x- ]+ }- y! J. ]* F _; O4 | }6 [4 E8 l+ ^/ h' \
}! Z+ x8 o' v! W' P
0 u& N7 Z! D4 B1 x9 A1 H
编辑反向代理服务器配置文件:! ]) C$ f$ u s
* X. | o( V2 I) G& b' P, G
vim /usr/local/nginx/conf/reverse-proxy.conf
2 x u5 f2 V3 b L% z" t8 v
* h& p q2 K7 I6 H9 hserver" u4 _/ ^% ]) d5 B
{
* H3 ^' m8 q2 d/ \$ E% l listen 80;0 U2 E4 T' q4 i& ?- A j9 N- E
server_name xxx123.tk;, b0 ]& Q; Q8 T- X
location / {4 F/ v: k7 o( i
proxy_redirect off;- A, \* Q0 }) o+ J- M
proxy_set_header Host $host;
) H( x$ f' a m+ j. h, j# @ proxy_set_header X-Real-IP $remote_addr;
9 [; {; F) a2 j5 k% L. c proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;6 X* w/ _/ Q" F7 T0 j
proxy_pass http://192.168.10.38:3000;
% r7 f+ y& r' x7 Q+ v }* O$ u) v2 s) G p( {7 G: n
access_log logs/xxx123.tk_access.log;. @4 N6 Y" T* |. ?' Z4 w
}0 P2 T. n0 l9 B. r/ b
4 Q z, S, o. H0 v7 d' Nserver% m5 ?; c' H7 L) |
{: {. T1 W A' I& N
listen 80;
. u; b- `: T% Q2 Z: r9 ? server_name xxx456.tk;8 e' U7 t9 M. Y6 j3 {
location / {3 ?* o; z1 G- a7 E
proxy_redirect off;
) y8 P# {8 K0 W! d4 A/ U, B6 m. S proxy_set_header Host $host;. m5 j z$ o$ `
proxy_set_header X-Real-IP $remote_addr;
) K+ w: P% o- r1 \ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ M q8 l: b; z& } proxy_pass http://192.168.10.40:80;
' v: Y2 m$ T; M }4 v& ^) h# w" J& G, e2 G. L' U
access_log logs/xxx456.tk_access.log;& n! j5 i# ?+ V( ?7 L& C4 L9 a3 B$ O
}5 q, O* g; h2 K) N0 Y# A
2 J! e& X& C! O: u然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。
+ v* H* n y$ R- i0 a% a% q J6 Y) d
upstream monitor_server {
& X5 S2 |. [/ h$ g' N server 192.168.0.131:80;
" `8 H* z u7 Q, W6 K% ? server 192.168.0.132:80;
3 V3 R% z6 `! F}
. n( Q' H( u3 m" ~# n8 g. C / o4 B/ o1 Z. S
server
$ D% Z, G& E k* a* }4 Z0 H{
; n& u5 M# v. \/ k& a6 } listen 80;( |) z; d! a ?! D9 V M
server_name nagios.xxx123.tk; [7 j# Y* W: `0 w
location / {
8 n7 X" m; e$ N$ n; } proxy_redirect off;
! \% H E2 ]! U- m2 e proxy_set_header Host $host;
" l' Q* z$ p5 \, @. P" V" z proxy_set_header X-Real-IP $remote_addr;# v8 [' M/ N' G8 p" J: x! A9 y4 J
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
* e+ [% Y/ s* o6 _7 v: |6 |/ R; u7 G* ] proxy_pass http://monitor_server;- y: s6 n# H& B$ H8 J% T2 C
}7 c# e/ _( c6 z
access_log logs/nagios.xxx123.tk_access.log;
8 ]8 m Y5 G! w& k, \9 d}
4 I; K: @1 S- Z) O) }6 S% D! d
+ ~2 A4 C# T& q! v* P. ]& }1 |额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
: Y* X3 ^' j: Z* j$ J" ^& z
p: U. B" K9 e0 `( q* klog_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
: ?2 o, c7 p5 X0 R( s; P'$status $body_bytes_sent "$http_referer" '
7 n& v+ X- v/ I2 D'"$http_user_agent" $HTTP_X_Forwarded_For';7 j" V7 Q& f6 J* E! W' a; `
0 k# I2 r6 n" y; ^% o) q/ S
access_log logs/access.log access;
( H8 Y- J8 r" w3 b
3 z: c+ T$ \2 x5 \ S1 L% \; n再看看原来日志的格式长什么样:. {% K6 |! }0 n9 I* j: h+ w
' ]$ j; m6 f$ b8 P1
, [1 ~' D( L k' p: Z+ o2
( _0 z! R8 X7 `5 A6 t& `$ B3
% N2 f# |- s: F) h2 |9 n& Z4
6 [0 I. h9 K9 w9 K5
. g9 F, m! ~$ H: ?3 P#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
" ]9 `7 l. k# D% b# '$status $body_bytes_sent "$http_referer" '0 q9 o: g; {$ [+ y- I
# '"$http_user_agent" "$http_x_forwarded_for"';
/ e, l5 h# B. S1 C+ {
! D) q) _) m/ P& p |#access_log logs/access.log main;
0 _1 G1 Y+ t4 N, y6 A8 e+ u0 O看出区别了吧 遇到的问题 之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查3 x: S4 i Y( }8 m4 a9 J9 i
2 @7 ?, b& ^6 [* R$ @- J
13 U& ]6 ?) s/ a: X+ o1 m
2( Q+ Y) q: x; J8 T6 ?! u/ f+ C. M
31 ~, Y) V1 k3 \' x$ P' ?* t& L* H. I& z
42 b8 v# @, a. K* w1 ~! \& ~
53 ?4 u F' r. e3 k/ {. n
6" z! w) x, I/ r2 g- m% T! i3 ]
7
8 ?/ s) V0 C! r8
" x3 d0 B2 Q6 M' ]proxy_connect_timeout 300s;
, @3 a% m# ?3 q" v' t* y @/ m3 \proxy_read_timeout 300s;
. G3 Z: \. @ \. O7 E4 nproxy_send_timeout 300s;, q8 O" d( |1 {' M
proxy_buffer_size 64k;" G( A8 p- ]7 A
proxy_buffers 4 32k;' ?7 i6 w- ]' B2 |7 G
proxy_busy_buffers_size 64k;; |# B+ b" r7 t/ w8 K6 ? N
proxy_temp_file_write_size 64k;+ M z/ j% h; m
proxy_ignore_client_abort on;# b+ g# @! x9 @
报错日志:
5 g s- S) d* Y
3 l- I: h* e2 j...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。4 g" V) O. k2 @
3 P; b" \( J: W. V' X& X$ @
PS:关于域名转发; S8 d4 ^" O! C
9 F8 L3 r; u; [' e
所谓域名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 }. _0 S {( [6 |! [( H' i9 | |
|