管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
情景 由于公司内网有多台服务器的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
& c1 ~" b5 f" S# ~4 G( F: ^6 O
4 @* t: ~. i" y' O- ###更新仓库
, J; K$ {4 H( s6 j" R0 O" w - ; p- ^# f6 R* b; _& w
- apt-get update -y
: ?( U, J7 k! S, y; b9 ?( j+ ^ - apt-get install wget -y
- X/ z3 I0 j Z2 c5 }. |$ D! x6 z - #下载nginx和相关软件包
复制代码 2 L; s6 Z- `3 Z9 X' \7 h b1 ?
) g; F) h, k! c& z
pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
: u! n" v1 R9 e+ a8 l% Z4 ^
$ D: P A6 j- w# x% l8 ?- cd /usr/local/src
* r. H% L' W% X* c) R' y# f - 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>
: E% ]1 w' m5 f; L, { - wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>; T( K: w- |+ @# @5 c' 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>$ J5 W5 O1 s% S. Q: h* D
- tar xf pcre-8.33.tar.gz, E# P7 p( ]. Z. i) u3 n! v/ o0 V7 v1 G
- tar xf zlib-1.2.8.tar.gz- Q' X9 }# O- ]: t5 T
- #安装编译环境# G' w, F J3 x/ M! `
复制代码
- g0 \* T2 `9 `# k5 ]3 I * D5 }; Z9 q: h% o; C. F
apt-get install build-essential libtool -y
) I' _. I+ }* Q6 z' t#创建nginx用户7 D/ f8 `0 |1 f5 i* S' Z4 r( k
3 v& T) Q5 c) m$ Y$ ~6 C: P8 Q( f所谓的unprivileged user$ _& M. I* I- H$ M2 g `5 q9 q
Y3 W4 T3 F# k' ]
- useradd -s /bin/false -r -M -d /nonexistent www
+ r) Q" y& J& F$ y! B% v8 ?" | - #开始编译安装
, W5 r5 G/ O2 S- H: c+ l - " c( e: r8 \4 k$ g: o3 q; X4 c
- /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
/ D7 ^9 R1 `6 v1 j5 V/ j1 i6 S4 e - --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module1 f W( V8 s7 k1 E* A: @/ v
- make" {, d/ M. a2 I$ R: R
- make install
* Q/ C' t1 V- j% v6 X5 U+ M - #给文件夹授权
复制代码
% ~& I8 l; P, w* |: g
# D5 J4 K* C6 R% O- K, Ichown -R www:www /usr/local/nginx
* `7 Q+ f% t2 U: S v3 B; w) A$ S#修改配置文件& b0 g M% F6 E! l( l7 X' Q
vim nginx.conf
" s& s) @) q) h$ j' _5 a: Z \- m a9 m3 l; u$ ~
user www www;/ }3 z0 O. z M/ |' f1 N- c* C8 V
worker_processes 1;- y4 g8 A6 |- n- A0 a! ^
error_log logs/error.log;
( r2 s9 B; a: M0 Tpid logs/nginx.pid;. \1 f! F* n3 n5 G
worker_rlimit_nofile 65535;# N( e8 O, C) q/ M2 m& o5 v
events {
6 ~- }; j% W% X1 ^& H use epoll;
* j+ A& ^( d3 t) b, ?- _4 b worker_connections 65535;
3 T, M2 j, L4 H5 y}& }0 D) L; x, b
http {
# V/ y+ @+ _, V) U include mime.types;
# {" {2 N. r6 G+ ~ default_type application/octet-stream;; g' N9 K' ^0 E
include /usr/local/nginx/conf/reverse-proxy.conf;
0 | w. d8 j8 z) W7 F$ {% o& ] sendfile on;
! C0 a7 c9 H* b keepalive_timeout 65;
1 C' R! E; d& k2 B gzip on;. Q5 a+ u8 h! S9 ~9 X7 q6 m6 k
client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
3 y. I# Q' f/ z client_body_buffer_size 256k;
! _$ U. w S& y% g1 K client_header_timeout 3m;, D6 t6 H6 P* v# _
client_body_timeout 3m;8 D# ` [$ Z/ P N$ o7 A9 ~, H" t
send_timeout 3m;3 \$ N# v# b& `' W6 g7 S7 w
proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
% z( M; f( f& Z' S5 J8 G" N7 M% h proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
2 n: z! h0 I+ r Q. s proxy_send_timeout 300s;
# ^1 G% N7 c7 Q: |2 Z5 d proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小! f' y+ L1 P/ T
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置9 @4 F- \& G/ {" ^* `
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
" I; c1 G8 g1 L proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘9 [' t+ Q4 G) X1 d6 v, X, \5 M
proxy_ignore_client_abort on; #不允许代理端主动关闭连接
1 ]/ K6 Y; T: q" c w& p server {- p( i8 ^$ z k. M, ^5 X
listen 80;8 k5 g0 O# |+ J$ p u2 v
server_name localhost;3 ?! Q) t. b1 G, X4 `7 d: O6 d
location / {+ ^1 n1 Y6 g4 Y; q7 x
root html;
$ }* `4 Q( m1 F" h index index.html index.htm;
9 L# V! o6 F" Q& Z% F7 ] }- G8 I, c" a' H% u
error_page 500 502 503 504 /50x.html;* O8 H$ ^) b" ^/ s- P5 H% ^
location = /50x.html {
# Q3 Z: N2 N! Q0 d" v5 {7 m+ G root html;
/ F( }3 [( n7 \+ n) S9 ?. N }
3 X4 G; {$ j$ g1 q9 v3 {2 c }
3 F" r/ P) \/ K/ _+ M7 M, N L}" ^0 A. _& L" d0 F7 H$ T: O
1 j( }6 K: n, j3 Q2 N% P/ c& Y编辑反向代理服务器配置文件:
/ J; Q6 e; S) K# K+ W
4 r8 U7 C4 [+ T0 Yvim /usr/local/nginx/conf/reverse-proxy.conf" i" H, \- E3 c& w
/ a& m1 O# u$ t2 S
server* k1 q0 `, U' {# g0 m
{
$ K1 N; L! v* U listen 80;% E* j4 i% i. m2 x/ V Q$ m
server_name xxx123.tk;
5 I/ Y1 {. @# N* R3 s: v location / {
( p7 l3 s9 F* N: Y2 M proxy_redirect off;
/ h1 |) ?, ] j; P- k, e& q B proxy_set_header Host $host;
2 Q4 Y) I/ H' q( I2 F$ Q6 _ proxy_set_header X-Real-IP $remote_addr;
( }8 R0 H5 p h0 g- O$ s; o: a proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
8 ?1 H/ ^- U' Z proxy_pass http://192.168.10.38:3000;" p: Y4 |& Y5 O8 Y E2 s
}- o* ?* o1 ?# M+ y7 m6 k1 Y
access_log logs/xxx123.tk_access.log;
# q, n4 P/ e5 i}
+ }6 P# f c5 S & F" P$ I5 w9 ^4 ? k4 q- k" ]
server! L, P7 _0 R i2 \
{
$ R. `8 Z, l% C listen 80;
* ^! G6 C& I% B; W0 Z9 B server_name xxx456.tk;4 L6 w- ]$ x4 ~& u
location / {
! d4 N1 k, u1 h: K; v proxy_redirect off;% U' z: u$ n! R6 y6 y7 n
proxy_set_header Host $host;
2 K3 ?$ Q+ \. Y6 w/ C1 v proxy_set_header X-Real-IP $remote_addr;# O+ ?( c$ c; r* Y, h2 P' K
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
, u4 _4 F, `5 ~9 ~+ ?$ @! y! ` proxy_pass http://192.168.10.40:80;4 f5 r0 s& v: f1 I
}
6 L# D1 b! M2 s access_log logs/xxx456.tk_access.log;0 \* j$ m; [/ ]7 Y3 i
}% I, T$ [5 P8 d1 C; [
5 D$ [9 a+ z0 F0 D, w
然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。# N" g7 f! ]& x- k' t5 R& U
( D4 O9 T& R6 c: b- R6 j4 wupstream monitor_server {! i s- P7 W& L N2 L9 l* v
server 192.168.0.131:80;4 g% h& q# k: f" N7 s( T
server 192.168.0.132:80;
! R4 D, G: [9 R# L}& \8 U2 f: p+ q
( M1 }" L: l4 U4 lserver
& f0 V7 P! w3 C; s{
; y3 F; v2 r0 W- ]. C8 u listen 80;
3 x6 ~3 M" V- W/ I, h" g server_name nagios.xxx123.tk;- e8 N/ g1 J! T& R0 `
location / {! e9 _7 W( f- R+ j% R' S
proxy_redirect off;
. E; q) C- i& c6 r! i9 i( t proxy_set_header Host $host;1 j, W7 x8 g5 p( N
proxy_set_header X-Real-IP $remote_addr;7 w$ U9 _& S6 Z
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
: a5 X) U9 |( ^5 b8 D" ] proxy_pass http://monitor_server;
7 @% P- }8 V7 w/ l1 S: t# J' x }
~) I( c {7 h5 \. G7 d z access_log logs/nagios.xxx123.tk_access.log;. K8 C0 i: H( i
}
( B/ X$ l" @3 w( Z/ z/ z1 ]1 l( G$ `; N2 |3 Q" `) _
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:3 \1 s; Z3 }4 T& F
, }& ^/ |( v2 I' {8 }, glog_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '+ l0 ~8 F4 p' L+ w2 B3 }
'$status $body_bytes_sent "$http_referer" '
& r: y8 D7 u2 c9 ~' |'"$http_user_agent" $HTTP_X_Forwarded_For';9 f8 g9 c9 R6 D& r# k! h8 l( d
) l+ n& c' M9 M- {4 Z7 T* R
access_log logs/access.log access;0 N% A: o4 M; a* p5 S4 }4 h
4 z& }+ F E/ W9 g
再看看原来日志的格式长什么样:) l; R1 B- A' `( v0 `9 U
/ q1 k* f8 l$ B: K! @
15 c) q9 y( F# A6 Z' L L5 d+ [
2! W Y3 Y1 {+ ~7 a) }1 F5 q, ^
34 O( u1 Y1 @$ I1 ^# a( m) ?
4
/ i2 z- q( A4 U! t5! W4 U* A) z9 y* p( h0 U; k
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
5 G+ x! d% ^1 h# y J* W! e. E3 E# '$status $body_bytes_sent "$http_referer" '% y( c; i2 g% k) P) w
# '"$http_user_agent" "$http_x_forwarded_for"';7 d5 ^$ v4 u+ a# `, ^
, |8 l6 c$ r5 q#access_log logs/access.log main;- j) @. R( ~; f3 j3 x! s
看出区别了吧 遇到的问题 之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查: o3 { @2 |4 T, e2 x7 @7 T3 f* \ o
3 C; T- y* ~4 w5 j3 u+ x
1, ?7 N! o: _6 J' U) X1 f
24 R! S5 `* |' A9 @" W4 Y: Y& d3 {8 @
37 w3 o0 C- k7 U( q4 h: e
49 C: x) e% ~7 Q8 Y
5& _3 y! y2 r0 p
67 s. `* ?, v' Z6 m- G
7" \# g0 i- ], }# _" H
89 C# i& v; m8 |5 h8 J
proxy_connect_timeout 300s;
; O R: T7 h, M/ x3 U6 |' l6 iproxy_read_timeout 300s;3 |; I& h- m! w9 r8 h7 s! b1 Q. E
proxy_send_timeout 300s;! U4 P( X! _$ z
proxy_buffer_size 64k;+ v* O* S" R0 [
proxy_buffers 4 32k;
+ I& ~$ A% @1 |7 z" f! [$ e( ]proxy_busy_buffers_size 64k;/ A9 Z2 z+ t7 B+ @5 Q; ^+ Y5 ]
proxy_temp_file_write_size 64k;# S: I6 N1 X2 _0 L6 y2 N
proxy_ignore_client_abort on;5 M( @; q9 P4 Y8 u2 L8 d2 m, M
报错日志:
0 O8 |# P* O- w) Z1 f, R
. ^: k! j1 w4 j# z2 P...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。; ^; j0 B1 h& I1 P( S
" q4 x! T* j: \# E3 y
PS:关于域名转发
7 o9 [3 h: ?5 s! Q; `; q$ n! _+ g
所谓域名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/ 的内容。
7 G( s* \! E" \: i, ` |
|