管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
情景 由于公司内网有多台服务器的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
, V+ m+ b9 r) j. ~
* l7 H/ _6 ` \1 _+ a% M- ###更新仓库2 e$ k! _7 P' i5 b" }9 `
" `" R: X, [& P- x. g- apt-get update -y
! M) _1 o1 H' K+ m, P - apt-get install wget -y. w6 I& }) ?8 e- M/ f
- #下载nginx和相关软件包
复制代码 ) ^2 W+ B4 i. y# y, \: W! R
3 |& U T$ P4 Z1 O* a. v- M" ~5 Ppcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
' P0 r/ \2 c5 N$ e. {* C, _+ l3 A
- g# `3 N( v0 t. v$ C1 J+ I8 G5 C# `- cd /usr/local/src
: a5 Q! R- R- K1 u - 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># p4 ]8 E/ o4 A. O
- wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>! }8 Y, Y3 g: F* e
- wget <a href="http://nginx.org/download/nginx-1.4.2.tar.gz">http://nginx.org/download/nginx-1.4.2.tar.gz</a>
: K- i$ F% r& c. s- V9 | - tar xf pcre-8.33.tar.gz
* N( W8 Q- ^8 H( A5 |2 T- E# T3 ^ - tar xf zlib-1.2.8.tar.gz2 @; L& B! z: Y: V3 D
- #安装编译环境
# W7 G) F. Y/ F% [ A
复制代码 ; `; p9 z0 A& {5 P! p
) ]0 @9 M$ X7 v" [
apt-get install build-essential libtool -y3 A) J* |% X1 b- Y/ I; l( M
#创建nginx用户
8 B3 B1 n7 S, |) n
9 G/ r, c4 {7 O所谓的unprivileged user( P( t: r, [9 r/ ^' r S- @: P" f
. p4 s' U5 a1 I4 U6 }- useradd -s /bin/false -r -M -d /nonexistent www( v# J: V, P4 ^9 t) P; X
- #开始编译安装. p# `+ }0 y$ f5 C" d9 i4 V! ]
$ v- h! Y N' i- G+ f& F/ x- /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
5 @" Z. x$ Y+ r* b$ z9 Y; j - --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
& x f+ T! x1 a, z8 S3 S5 d1 w, Y- p7 ` - make/ z% O" N8 q1 h) u B: m
- make install
' e/ n& T' b+ S! ?! ` - #给文件夹授权
复制代码
- ]+ F1 I& ?4 Y5 \' _
' H$ ^- W2 [- `9 e1 ichown -R www:www /usr/local/nginx
3 G j3 W: r% y) _#修改配置文件
/ Q# |% R7 L! u7 w$ l# s! evim nginx.conf! _9 r3 e8 p1 g( \
`5 N& [- C/ V
user www www;
6 V: z+ {! }9 v# I" Hworker_processes 1;
9 p1 `) X7 v1 x* M9 j, merror_log logs/error.log;% R2 i+ J) c* s; H1 Z% `
pid logs/nginx.pid;
- f5 s, M1 c4 S/ `; \0 bworker_rlimit_nofile 65535;
9 X% E; h4 e; E2 E' d6 uevents {
# a) z. O2 Z8 l! }/ M use epoll;
5 J0 F0 C/ `; x% [ worker_connections 65535;( @& }4 x, |4 ?0 m3 t, N
}
! j2 k& | Z6 V1 r1 s1 d+ h4 khttp {; M' v$ {. {; i
include mime.types;: S# O0 N# x, _) G1 }
default_type application/octet-stream;
9 C: D$ ]/ S+ K& { include /usr/local/nginx/conf/reverse-proxy.conf;
9 Y2 x5 ^' A. i% T1 n, r5 r sendfile on;
4 x0 e. N; m" ] keepalive_timeout 65;
4 o: D! A! V$ y gzip on;3 m; ]" u1 r3 _5 B
client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户2 `' v9 B! @" b0 C
client_body_buffer_size 256k;! q, x9 {/ w# Z* w( ?4 K @- R9 z
client_header_timeout 3m;: O( U) k4 s9 E) E7 f
client_body_timeout 3m;! E$ H8 q" L5 E/ x
send_timeout 3m;: Q6 B: N- k' r M& H v
proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
8 m% W' t, }! [% `0 Q proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)* X+ ~* j% S, }+ ?) y+ I
proxy_send_timeout 300s;
$ @) W+ x/ L: |5 V proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
, w2 U* U/ k8 g3 d" y' b1 I proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置, s+ K& G3 P% C5 f
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
+ K% D$ c6 ~# [1 G+ v proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘, G4 x9 F# ~' v2 i/ i
proxy_ignore_client_abort on; #不允许代理端主动关闭连接% c# c$ P* Z. _' I! i
server {& t" R9 `9 e0 J7 z
listen 80;8 I3 d$ \# W- w; e- C
server_name localhost;
$ \9 M$ d1 }# y9 i4 ? location / {
$ Q0 p; n" N5 Y+ p root html;7 D3 e5 \! _) @) k+ E0 a/ m
index index.html index.htm;
4 L/ s+ D" m2 }$ h }
- y- m& _' ~) P- m% u! y: | error_page 500 502 503 504 /50x.html; E" ?0 g* S' C& H0 ^
location = /50x.html {1 G8 D2 E7 a3 F# y3 P; Z
root html;
2 I2 P% R- e) E, w, v2 u }. |2 B t7 H3 h& Q z
}. V8 b2 t& f5 b. o9 _
}+ a6 a/ p. D, P7 g3 e/ H; D
2 _6 `1 v3 D& L
编辑反向代理服务器配置文件:
& X) [+ B* z$ U' J4 Z3 \3 C4 y9 h# X
vim /usr/local/nginx/conf/reverse-proxy.conf0 T" {7 Y9 T; ]% m. T
' |! o) ?, i- U) x/ L/ I' [server1 q* M6 R& g7 U. b; Q
{# O; y2 q4 w w# b0 {% @
listen 80;) }) T& k+ ]& X' _6 D8 s
server_name xxx123.tk;6 v0 }3 S: R' D3 X/ w
location / {
9 ~% h6 R6 R/ x8 R proxy_redirect off;
$ ~' d7 l) L O) J proxy_set_header Host $host;
) r( G4 m- Z! T+ L1 E+ { proxy_set_header X-Real-IP $remote_addr;
0 A; R$ S2 c9 s* K6 m4 A3 } proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;7 n7 x) h: ?4 a3 C8 g& R! \4 x
proxy_pass http://192.168.10.38:3000;- u8 Z3 X) I' k7 [
}( p+ z1 f4 x" D r$ z& q
access_log logs/xxx123.tk_access.log;
8 c3 m1 }6 F6 M( @' X7 A0 G}
" B' v# [6 g8 |+ E/ m # J" K) [0 S3 v/ d7 o* d% c* c; [ ?
server
6 z* b$ I( z; Y{3 \7 K* r# t, m& b
listen 80;0 L: q# ^) y0 q+ f
server_name xxx456.tk;
' }8 Y* O4 R$ ^! D location / {
a9 }: X* z- ]7 Y9 m% A9 G( s proxy_redirect off;. K6 j" Y+ n% Z# B
proxy_set_header Host $host;; F1 U5 @2 O7 H$ D$ N) W& W
proxy_set_header X-Real-IP $remote_addr;
% v2 S" I- q0 H' ] proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;2 C3 _9 @, ]" b1 O
proxy_pass http://192.168.10.40:80;2 d6 p: H( U* I+ b! @/ B5 O
}7 R/ J: \; C! T: ^9 N6 k+ U
access_log logs/xxx456.tk_access.log;
0 U5 ]# Y: L" H' J% Z" O( y}1 n ]. l3 ~: X
( h1 h4 @$ [! h0 T然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。) m4 L J$ {7 _) t, F4 M
, e. Q4 U) Q) t& Z4 Q8 Aupstream monitor_server {
1 i% m' u9 F; d server 192.168.0.131:80;: b6 ?$ |2 V" U# z7 ~) [, s1 c
server 192.168.0.132:80;; T |9 Y/ {$ F4 B9 `) m
}
8 @. Q2 q# h' P. g/ V ( n3 z; V& c* b b* W5 C
server
3 c5 n& a7 p: h{
4 F! _& f0 ^! F o' u" ~ listen 80;
- a" _0 p; K' e, l% h server_name nagios.xxx123.tk;
9 K `; ~9 V+ A7 N location / {1 O* E) O: X/ Q* N4 x9 e' Z$ i+ b
proxy_redirect off;0 n0 @* o& ]9 g
proxy_set_header Host $host;
# `# K) }/ W- Q" G" R* P proxy_set_header X-Real-IP $remote_addr;3 a# A; M- a: M8 ^3 N
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
" w/ n% n- ^) v4 I' W proxy_pass http://monitor_server;" E: Z* S* U G3 i8 Z+ J
}7 b3 h3 U* @. y) C7 v4 N- J
access_log logs/nagios.xxx123.tk_access.log;8 E3 `# F8 d. o" k8 C
}& \$ }5 T0 u) Q) N. t* l
$ W. o/ A! q; U- j( M
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:0 y0 I* b; v# r9 s P+ q6 R) x
- Z& z# X" _- E/ t2 J6 I2 }
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '- K" L2 x8 O4 w/ a8 q8 D. J9 y
'$status $body_bytes_sent "$http_referer" '' e& p4 [8 H# V ~+ R9 N ^) h0 B
'"$http_user_agent" $HTTP_X_Forwarded_For';+ `* y+ ?% y5 _9 \2 g0 {) l; }7 L3 Q
* f8 q6 |2 U' `. L$ Vaccess_log logs/access.log access;, \* s- X: F5 z e4 \9 ?8 F
, A; A q1 b6 Z$ ~再看看原来日志的格式长什么样:
6 ^: a# y. W- X0 H
% o* p# c5 K1 u" [( Z: r1
! i/ _# L& |! |2
) e3 l# ?* \! U. k( F+ V6 I3
7 ~+ m+ c9 w8 M4
; T" {6 o2 h& b. M9 H1 L6 u4 y5
! R/ r: e7 c' I" {, r2 Z' v#log_format main '$remote_addr - $remote_user [$time_local] "$request" '% ]9 L% J8 I, h0 ~
# '$status $body_bytes_sent "$http_referer" ' X9 |3 y8 ]5 y1 W' z
# '"$http_user_agent" "$http_x_forwarded_for"';. v0 f3 ]) l/ O! W- ^4 q( q
; J( n& d1 c$ g% ]* R# v3 F3 t5 J#access_log logs/access.log main;
( v) L2 h: y6 _9 c/ F& P H _看出区别了吧 遇到的问题 之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查0 m# R) m" S6 p. U
6 _$ u" k6 r9 j v
1. ~: x: t0 g3 z+ _
2
9 m3 c3 b3 H: J0 a9 b+ F3) e: H$ F' m' E& E% B) i" d
4( Z( \& O. O- L" B' q0 N
5
3 K. i/ ~( |( N/ |% ~* o6
: R( K) E: i& e+ ^$ n! u! O, m2 }7
& W$ y/ J3 O- O, e4 j' D8
3 U, T: E7 K& I# nproxy_connect_timeout 300s;
5 |3 Z4 b! D) b. x Z% Z# b* U( Nproxy_read_timeout 300s;
6 x, k0 v$ P0 I8 u$ x' ~7 ]proxy_send_timeout 300s;# q5 M* d+ L: k$ |% ]
proxy_buffer_size 64k;
) ]/ X; i% D8 e8 j fproxy_buffers 4 32k;5 B1 H. H, }& _5 X- M
proxy_busy_buffers_size 64k; x3 E' Z1 P6 w+ f0 A
proxy_temp_file_write_size 64k;
% a( E. t; M' U' {( t/ eproxy_ignore_client_abort on;
& a! i( y" _7 d; ?. F( b* x2 ~5 I报错日志:, G- E+ O5 n( n9 T
0 y- Z% v; T0 P* M3 R* x8 W. M...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。
* Q% `# ], _) w4 s! Q4 _
% l6 F. i' U2 KPS:关于域名转发2 I# Y# q6 o% K1 Z2 o
- B' |4 r( q$ ~( c* X# i5 I9 D所谓域名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/ 的内容。
Q* g9 Y8 ^8 t9 O; W' A |
|