管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
情景 由于公司内网有多台服务器的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
5 K0 H4 p' {- E% j2 B
: ]0 `$ j ]2 h- i K; E, p- ###更新仓库
) _; }# M. b9 I' [! r9 G1 u/ i - 2 h+ G B+ g; {
- apt-get update -y
& q/ o) N' x7 P. D+ s - apt-get install wget -y
3 v( ~1 Y& E2 y* o3 [1 d - #下载nginx和相关软件包
复制代码 & I6 i3 J* `! z$ p5 L0 P4 I; V" Y
G! w3 t+ T& N/ v$ V5 j
pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
; `7 P+ V- L' F3 z5 f2 E
3 M/ a! U5 Y3 m, C" E0 Z, T* @- cd /usr/local/src& C* g5 t# f- P0 H7 _( O. g
- 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>
& t* o! W# s' l, ]3 D - wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>
) k* C$ D# b, T2 @0 D# W$ U9 ? - wget <a href="http://nginx.org/download/nginx-1.4.2.tar.gz">http://nginx.org/download/nginx-1.4.2.tar.gz</a>0 W% ^% h( j3 F3 ?
- tar xf pcre-8.33.tar.gz
p) k2 P: q+ N/ v( v5 b0 M - tar xf zlib-1.2.8.tar.gz
P5 @. B5 x* {% A - #安装编译环境
* C B4 c2 O5 t% w3 E2 t
复制代码 5 k" L" W; K- Y5 J5 z$ B4 U
% h) u& N+ [0 m/ _: j apt-get install build-essential libtool -y
; t3 q( ]) y5 Y4 n. z#创建nginx用户
$ `4 X- a3 Y( p& e. d" b2 A' d6 V3 Y8 A7 Z4 z7 k) y0 m+ f
所谓的unprivileged user
: S2 F9 D9 M# N( C( M
6 D9 }1 l6 L0 q' V+ l- useradd -s /bin/false -r -M -d /nonexistent www
2 h8 ]$ ?2 f1 U- Q) B! p - #开始编译安装( M7 m" U& b; P
- + w, |; n9 d) ?- x2 D6 e6 h
- /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
! u! x% _# k2 `2 o$ P& f& l8 o; C- U - --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
. O4 _ u7 k8 ~& A' v - make
. ~- c4 G4 c e u8 }0 `3 s/ @. U3 @ - make install
0 [4 C- m# P' |% O2 W - #给文件夹授权
复制代码 |/ C/ l8 Q7 G. D
( i& ~! r' W |" A$ q
chown -R www:www /usr/local/nginx _. P) \2 k1 n0 W
#修改配置文件" @4 E- T0 h9 X) X+ p& Z4 z# ~
vim nginx.conf2 _ o/ o: m, ~$ m
' t1 |6 f5 ?$ z4 C. C
user www www;
: F+ Q' Z) r& B! T0 D0 {2 f5 Y Lworker_processes 1;
) H( }0 m9 C* K/ R3 C$ J6 \5 `error_log logs/error.log;, x5 R4 A) u' i; b
pid logs/nginx.pid;; O+ j6 c5 K, g, P* k; w( \1 B; Y
worker_rlimit_nofile 65535;
; h D. H1 M/ G3 u) nevents {
) `. Z4 l6 w( r$ G use epoll;
S e+ B! s% I5 J worker_connections 65535;/ a/ t5 W' _' Q. D" q3 Q
}5 H5 k4 Q5 H) h2 U9 F' o( ^
http {# S \. F5 L0 w, y' I
include mime.types;
- Q' E) I/ h( O2 r default_type application/octet-stream;2 j. \) |3 M% }; m5 F7 N
include /usr/local/nginx/conf/reverse-proxy.conf;
8 E! |; J* V9 d sendfile on;6 P7 L- g7 h* Q0 j( t" K2 g
keepalive_timeout 65;* c" V8 I! J9 D1 o3 X4 F' E! X
gzip on;/ x$ q7 u: r" o8 t, }
client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
$ c' S7 |! ~ ]5 x' R1 f, m- C& v: Z client_body_buffer_size 256k;
/ B2 B( F! \) u) {2 ] client_header_timeout 3m;
% o4 m3 ]+ @, e6 e0 ? client_body_timeout 3m;
2 d3 E) e7 G5 ]: I8 i send_timeout 3m;
' z c! ~5 v) r' M; K8 h: d proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
; i( j7 z& E) J5 f7 S proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
) C! k+ E) h- L( n proxy_send_timeout 300s;: \" }& ?1 g5 Q# q% u+ {
proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小/ {1 a3 s) O* A1 r; {- q2 h9 {
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
$ u9 z. A/ p l' [4 f proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)# U% E5 X( y' A
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘/ c' M* h+ F# N
proxy_ignore_client_abort on; #不允许代理端主动关闭连接! g, c- w" Y) m, v7 h' O- h
server {
3 u4 J$ m1 u* ^5 ?0 l1 Z9 x listen 80;
' Z- e) B* d+ H( w* Y5 D. C server_name localhost;% H0 w3 j. E4 K5 r8 ~/ b
location / {% a% C& b$ v, p) w; Z; v7 @# s1 V" p
root html;
$ X8 ?. P4 b% ]6 P& @ index index.html index.htm;8 ]+ ^ J1 {% w5 v; v
}' S; G h/ g) @% K4 j4 O1 Z6 g
error_page 500 502 503 504 /50x.html;+ W3 D! K6 W# J9 E. ?2 J
location = /50x.html {
3 Q2 j- n" C# N( k1 Q5 S; ^1 g root html;
+ }: @ m/ z' b5 H! p. v' {/ s }
- `6 |7 P# f4 J$ _ }
3 x( \: D1 ~- \/ [& a1 z, z2 j}
( W' G& B$ Q G8 O
( G4 v5 h2 W z7 g4 H! P编辑反向代理服务器配置文件:: E4 G0 L2 t/ _7 v9 i
/ X& y( v$ t6 f" t8 @- ~vim /usr/local/nginx/conf/reverse-proxy.conf9 a# B8 f) a* g: E4 \
/ v, D- ?) k8 e- e# K: P# Z Xserver8 R6 `# d; V5 O+ f: C9 j
{' X+ O5 @8 U, b. N) [
listen 80;7 T) D* X( a% H# _1 B9 |
server_name xxx123.tk;: T0 j/ D- e2 W$ V6 a
location / {
$ U5 {, d" I. l0 v proxy_redirect off;( m& ^4 m7 ^. B# H
proxy_set_header Host $host;5 O* Y6 w9 M/ s
proxy_set_header X-Real-IP $remote_addr;1 d$ Z: K% c# B" Y, M# ]
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;% M3 B {. T3 |: F( f
proxy_pass http://192.168.10.38:3000;
. k. J! D7 G- Z0 d }
e( d6 }4 t+ O& }7 s2 \2 A# g+ S access_log logs/xxx123.tk_access.log;
' |+ g, T3 N$ g) I+ T l( M' \) K6 w}) A4 S0 W: J& I: c# E: W% W
3 o Z, w9 W2 |# t% ~, p# V) j
server) u9 r+ |5 k+ q% E1 ^8 T- a( m
{0 F& C2 V8 q& y) ]" n* c) t
listen 80;" k4 W; ~2 ^- K; r Y
server_name xxx456.tk;
9 V8 @! N# K7 _* R4 P- } location / {/ b0 G0 l$ `1 Y% _+ \5 W8 E
proxy_redirect off;" ^3 P1 m/ P$ p( Y, O, N! }% s
proxy_set_header Host $host;
- @' S a+ _. r5 Z( E) [) e proxy_set_header X-Real-IP $remote_addr;
* x v& r; ~: ?: V3 U# H! r7 j( _% u proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;" S8 C7 b2 B8 ?, c
proxy_pass http://192.168.10.40:80;) s6 ?- _" B# d# o8 |
}$ s; C$ w( w' N
access_log logs/xxx456.tk_access.log;8 j2 I1 c5 T- D3 ]. {
}
( v% c! d9 Z, o9 z, G/ [$ m
0 \+ U* \2 S( w' z然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。, L' y: ]9 D. r' e# d: }7 R" F
5 G6 W: T! f) q9 }9 T1 ?
upstream monitor_server {# S$ y& a1 J6 F* A, C8 S
server 192.168.0.131:80;. q" j, x) ]; Q; S
server 192.168.0.132:80;
7 Z$ ~& `9 v0 u5 i}! ~/ ~5 S2 {/ h6 x: \
8 V- [% \5 S$ t
server( M* y6 g: K" v0 y8 |) g
{
6 X- l0 {' g, t8 [ listen 80;. _) b+ ]; x6 d7 l c- x
server_name nagios.xxx123.tk;$ Y1 y1 q/ N8 h' B
location / {" f: s. x0 I+ i& Y# ^+ Q
proxy_redirect off;
- r3 y' u% Y/ s! h& Q$ p3 \ proxy_set_header Host $host;
6 y) ?7 c) |6 `# _& a proxy_set_header X-Real-IP $remote_addr;
: I b: B' N4 b$ D ?( E3 U proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ! k7 }4 I: Q7 A7 {1 D# N! O+ Y/ k( r
proxy_pass http://monitor_server;
/ L6 x! p# A" L$ l4 h }
: j& g% J% j8 W; h8 i4 ?1 h access_log logs/nagios.xxx123.tk_access.log;+ P, l( ~. X. h0 m
}
- }, }9 I i( }. \ @* X! F" w8 n( j
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
& h; G' ^; w. L6 q
; y0 a* K0 k# a% S6 `+ Slog_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
7 C7 d& C8 M* f+ q$ a `5 h: x# R'$status $body_bytes_sent "$http_referer" '
8 c- x- D9 F) {4 W'"$http_user_agent" $HTTP_X_Forwarded_For';
5 _4 C& n+ z, X# G" o! N5 e7 `; j 7 Y) \" {0 ?/ q0 [# @3 W" p* ~
access_log logs/access.log access;4 U% R9 v9 T1 E; q( G# b
6 X: X- E6 U* |" B' y1 e5 _* h/ b再看看原来日志的格式长什么样:
! f1 n# [4 Y0 X+ A D2 R4 X7 a$ _& s6 y0 D, c1 m% }
1
" D' N3 F# T) U; E; ~' V0 o2
$ v! q' R7 }! A% r3
3 S+ V/ U7 g/ H4" E1 i" d' ]$ ^6 d
5
6 S/ Z% `' h7 e: ~& k, w#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
) v# n" X0 ^% M1 b# l8 c' }# '$status $body_bytes_sent "$http_referer" '' c0 M% S) E0 m# R6 A
# '"$http_user_agent" "$http_x_forwarded_for"';
! l* q# `/ q$ l0 M
9 x4 [4 A, {0 ?7 ~" e0 B#access_log logs/access.log main;- A9 D \3 S X" a+ Z' D' k
看出区别了吧 遇到的问题 之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查$ i5 C$ A# E* i: \: T3 b
; \; c! c+ C' K10 Z. B8 l! i" p) P& ~% E: Q" r
2: E, I" S! r: A7 c/ b6 g# Y
3
, l' }) Y5 @9 K5 H# ^9 V& `4
& D5 k- w: N5 r6 P* Q/ v1 `5
% w8 y# k2 `; z: ~5 I7 E0 {' |; S6
- |% z( `6 E- _5 W. v7 j7
: K8 x4 A7 E8 S- L8
/ d. {8 Y# R/ O$ k7 t& Hproxy_connect_timeout 300s;
: ~" X5 Z! S4 g, Lproxy_read_timeout 300s;
$ `% k( e- ~) ]proxy_send_timeout 300s;
) h C' n3 `& ?) h5 S2 Z8 zproxy_buffer_size 64k;6 N$ C; L* T. n. g3 x! t! p
proxy_buffers 4 32k;# K& i2 l2 W7 V) J4 Z. h
proxy_busy_buffers_size 64k;
! B( m; K& }' A9 N5 s: h Dproxy_temp_file_write_size 64k;
. B& E/ `# o; C6 h6 N9 Fproxy_ignore_client_abort on;) U) a1 S! i7 M2 Q0 r R; F
报错日志:
' M# r6 q, ^9 T! J- ^( O4 f, z" ^1 ?/ M, T
...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。
C- P% Y; Y- c/ r
" X- n+ t7 h: l8 b: ]5 q# YPS:关于域名转发
. }9 |: J* y S1 D8 Z# ?4 @0 v! r4 s, _. s Y3 m2 J& M* ~9 r: @ Y
所谓域名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/ 的内容。
* v1 I2 X; q8 R9 `: M0 J |
|