管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
情景 由于公司内网有多台服务器的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
6 b0 i3 ~4 T* u0 c; d
3 I% u. E" S* [& F! E9 }' L# B9 \- ###更新仓库
6 i4 t4 c& B* l( Y* n$ D0 s: j# N - / D! d. V; M1 U0 h
- apt-get update -y
0 A. m- \: r2 }3 D6 M+ G - apt-get install wget -y1 n4 y$ G9 p; ^+ Z1 Y8 Q
- #下载nginx和相关软件包
复制代码
2 ^9 u p& G/ t( F% x6 |# c+ f) b# H, z, }. F2 G! p: m0 Y
pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
' u" Y5 V4 C8 B6 ~1 j
6 p( E: s+ c9 [- cd /usr/local/src2 p, h' E8 h, ?$ v+ z
- 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> a) S+ E: z8 p+ A: e
- wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>6 Z+ C0 z; }1 }5 U5 s7 I* I
- wget <a href="http://nginx.org/download/nginx-1.4.2.tar.gz">http://nginx.org/download/nginx-1.4.2.tar.gz</a>& x! Q7 u( O: \
- tar xf pcre-8.33.tar.gz) C& J: {" p1 J7 [) o
- tar xf zlib-1.2.8.tar.gz
! {' S8 Q- B2 I8 V* x - #安装编译环境# d2 d3 z# j4 h( Y
复制代码
! A0 U, {" d$ p ^2 l( b
* L9 O6 y# _% S/ D3 c5 Z apt-get install build-essential libtool -y' I0 L; u( g; F8 F
#创建nginx用户 m2 {# \3 Q, V% d
9 @1 d1 V, n: P
所谓的unprivileged user
. G0 f2 J+ i! K( @4 S0 p& L! L2 S- }# L( u1 j
- useradd -s /bin/false -r -M -d /nonexistent www
/ Y. _; i' D- R$ K - #开始编译安装
9 ^8 q7 N2 L) Y
5 S) I' j6 V2 m$ m& h5 g3 M- /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \3 c' h8 U5 J3 E9 p0 @3 s" }/ L' U
- --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
6 `/ J, F% ]5 `2 A! }& v - make' A8 k' p! K1 F5 ?( P6 b
- make install
) c' `( m( Z) i4 ]( k# K3 {0 g: ~ - #给文件夹授权
复制代码 + J, W0 {6 T# Q9 e
: z% t$ z% t/ v! b( m* U- B3 p- ochown -R www:www /usr/local/nginx
5 V6 `2 x5 n) `: U0 o: D#修改配置文件; q, V' i9 u. w3 w# j& s! k' n
vim nginx.conf
8 ~. V/ R/ W, Q2 _( |0 L. R" u( ?( ]; q7 l/ w! L1 ~
user www www;/ Q2 c$ B4 Q/ w7 M) I
worker_processes 1;
0 N+ n* K& f) r& yerror_log logs/error.log;
# n. G$ o$ I, G3 Tpid logs/nginx.pid;
. T& V* B" F( M; Uworker_rlimit_nofile 65535;
+ T( N# f7 m( b& yevents {0 i( I; p. r6 C6 ^' }/ u' C% ^
use epoll;
3 n. y1 _4 L/ \% m8 S/ w worker_connections 65535;. g& _; H8 L9 p
}
9 Z8 P, s: k( F' B$ m4 Z1 Hhttp {6 V) |! S' |4 F- |, @5 c
include mime.types;
% |' \3 `! r0 Y! f default_type application/octet-stream;
* }! h; R* g: o- s8 m! F include /usr/local/nginx/conf/reverse-proxy.conf;% x: n) t/ @+ r" a' Z. z
sendfile on;- S$ [. G- f% z. y U* x* u
keepalive_timeout 65;
1 W; ]3 ~% S. F0 m7 d gzip on;; K' ^3 ]. w' f! F1 ^
client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户- {. g$ G8 O, U
client_body_buffer_size 256k;
: A. @: j7 a. M( s client_header_timeout 3m;% d8 _6 Y" r( V! O: o
client_body_timeout 3m;
8 O! I& ?: T% _1 N send_timeout 3m;2 |, m0 L! h6 ^+ O2 H5 |
proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时) O$ Z- N. L6 g! u+ Q
proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时); O# K% e- m% G$ s
proxy_send_timeout 300s;' }7 r& C8 z+ P
proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
: J" ^! y8 _0 ?# o proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置% ^: p- t5 H2 f! s7 p; A
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)+ U V2 e. E T
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘1 s& ^( N- \4 z
proxy_ignore_client_abort on; #不允许代理端主动关闭连接+ D* Z4 M9 ?( v6 e8 c
server {
2 G1 p6 K Z. [. h- j9 }- g8 s listen 80;3 }4 r: J' ]8 }5 `
server_name localhost;) i. a9 S6 ]8 s6 z o
location / {$ H( V8 k9 Z) [. {1 R
root html;
5 ]/ v. w5 a) G index index.html index.htm;
; ^8 W: C. v( v$ {$ k }
- h% P d5 k6 }5 k error_page 500 502 503 504 /50x.html;
6 a5 o6 K) u0 o location = /50x.html {! J. g" o# |( e" N, W$ M
root html;* k' V! Y: s* T' |: ]5 @
}9 {% C7 I6 c* [7 Q) E! g4 S
}$ ]9 R, v- Q5 t+ n, V& _2 t
}) y( v. T. c6 V3 |5 \0 c5 K1 d
$ g- J" _5 m. [4 ^. ~% {2 E; k
编辑反向代理服务器配置文件:5 [# S ?+ d8 l! K$ d \* v
3 ^) r7 P( ~6 T" k$ U0 v% Vvim /usr/local/nginx/conf/reverse-proxy.conf
# ~+ I1 z4 }- {
2 i4 G0 ?6 z! `3 b) Zserver8 B% ~" Z: q& Q$ v3 ^; b
{
$ u7 J5 L; V8 N listen 80;
- }7 n- q5 }# |; l0 V1 ?- Q9 v% ?: S server_name xxx123.tk;1 z: T$ w9 m+ h; m# a; P" U, \0 `
location / {, m$ P& E% \ x! B
proxy_redirect off;
# \ z0 `6 k# u* R p3 R6 E proxy_set_header Host $host;
; v$ j; }/ D( i( h1 x8 y proxy_set_header X-Real-IP $remote_addr;
" F# \' O8 F9 }6 \' @0 T# J8 C W$ ^ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- E7 |, @) ~( V6 K8 u8 r2 j a proxy_pass http://192.168.10.38:3000;) G) H: O2 y) I; j; V) U# W; r( P, b
}
. _1 s( G& h0 v4 M. M' ?) ?, T! T access_log logs/xxx123.tk_access.log;
8 u1 V8 `! P0 L4 Y) }$ E" i8 L}
. a$ N. l* K) C 3 M8 {; r, t6 b; O# r2 F9 q9 b7 g8 b
server
5 D- l) g5 u* z5 W4 }: K/ T+ S{
1 I. c# s! f! d. l listen 80;9 f1 ]) N3 G6 Y- U. a e& L9 F. e. a
server_name xxx456.tk;) |) A- `& L* U9 ]* ]+ z7 [
location / {. { ~: i6 o! j0 O, x- ?9 ^' P
proxy_redirect off;
, Q1 |7 n+ q9 D9 F# S( } proxy_set_header Host $host;
$ H$ M1 s/ C) p proxy_set_header X-Real-IP $remote_addr;# g( |1 S( P! ?+ }" F" v
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;7 H2 l' T- a& q) W" L4 X3 i* B2 f0 S& }
proxy_pass http://192.168.10.40:80;( l. m8 K6 k1 \: K
}( @( r% ?8 b& y/ J
access_log logs/xxx456.tk_access.log;
+ {/ f$ ?7 n0 ?9 u7 h}. _# K3 z) @9 U2 m+ v' B: @) }6 u4 s
% O5 _/ Y- [. n2 t1 r0 }- ^0 ~" _# j然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。
+ X7 U7 J% k* c2 l+ t5 o2 M( f) o- e
upstream monitor_server {
+ [9 G" {; G5 F# h% B4 R server 192.168.0.131:80;
& H9 I' I$ [& h, @ server 192.168.0.132:80;
) W, R, G5 a$ ^( f6 }+ h: K1 n}
, P. H2 O1 _! `. u
, s! s9 t; `" B! b. p, n; Fserver
. L. o: i( ~$ q+ @{
/ e: K3 B5 A9 [$ ? listen 80;5 a+ j' p8 M. i
server_name nagios.xxx123.tk;) f: i z! H) E1 N* S, g7 u
location / {9 C) U# f, m# K8 b/ z z: W
proxy_redirect off;% h$ H5 o' m5 ?6 N0 T
proxy_set_header Host $host;
" ?( F8 Q( m" s y& }: _8 e! M proxy_set_header X-Real-IP $remote_addr;
2 E0 K+ j: q* J% {7 Y% ]3 k proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + @4 z8 W, s+ v, O3 \
proxy_pass http://monitor_server;% y* N2 a3 W% ?' E/ i' P( o
}
1 v! C& B8 p: c% `4 T access_log logs/nagios.xxx123.tk_access.log;
% f( s% d+ V" k. [6 g}1 z3 _9 G/ e; F k0 b- ?$ m) _
2 y% H+ ^3 ?. f5 v" J, Z8 A+ E额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:$ I3 L! V3 p: }* c, k+ C. s
' g; o9 _6 F2 [7 K1 r) @* K$ Klog_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
3 ^6 f/ a. n; U, b/ O, P'$status $body_bytes_sent "$http_referer" '
& N8 Z9 ?" x0 [8 r+ r'"$http_user_agent" $HTTP_X_Forwarded_For';8 N) Z, r6 M% |
. T. L# n& \& Z2 R- r' j3 [
access_log logs/access.log access;
8 c0 d" K( t1 H0 ~1 Z5 v# q7 H- h8 S8 e u
再看看原来日志的格式长什么样:
. s. w1 ^. F3 ]' J2 o0 z$ i( o+ [5 J; d" ^- `
1
* A: G" N6 V" C, ~$ e, f2
& y; ^( \: r' E3: a9 P" q( p0 c9 I! t% o1 E) \. f
4
0 @* L! C9 x. |7 A' X58 A, G: D2 a) Q( a, [
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '0 P. R# t7 W5 W2 X
# '$status $body_bytes_sent "$http_referer" '
. u* Z# z1 m' b; t, a: v# '"$http_user_agent" "$http_x_forwarded_for"';4 G& Z8 {# e2 j! a1 q+ m
6 U2 D# V) h3 U, W# O6 R. }
#access_log logs/access.log main;
* ~: _, B. \/ S5 F6 @) j" X看出区别了吧 遇到的问题 之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
6 K9 R) Y% A6 P4 Y+ p
+ _2 z* }' a0 H5 Z. P, ~8 h1
# Y4 x- d9 h5 P; S% @2# P1 A" u7 h4 L: F( k: P. v( t# ?- w8 U
3
. r3 a# K2 K4 k$ w4 l4
& E: N1 F1 d7 z% c5
% y" w1 W% R: I: Q6
1 ^7 p! N+ ~, R7
- U2 x% o, j6 D+ y8
0 C7 T2 f2 v- b* M& R6 k5 t: uproxy_connect_timeout 300s;, p% g' N( D* B0 W
proxy_read_timeout 300s;
M, H' g0 Y; J5 d! P' Xproxy_send_timeout 300s;. [9 G, ]1 R G0 R( N
proxy_buffer_size 64k;
( v$ w& ? Y* Eproxy_buffers 4 32k;
; x% g& y, U& B- C8 {proxy_busy_buffers_size 64k;$ q, X9 G# E/ |1 d2 @3 Y
proxy_temp_file_write_size 64k;
9 r# S7 _0 T$ ]proxy_ignore_client_abort on;
8 Y- a+ Z! j, @# ~1 h" o5 [报错日志:
+ P6 B/ ^" x% i6 ] ~
% U8 V) Z6 e: i) A9 X...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。! c+ g$ c0 [; ^. h+ b) y- `' Z" Z' R+ S
) F" @: Z3 \2 b7 o; cPS:关于域名转发
6 V C4 G* ~; d+ C/ E1 ^! @' A9 @) g( b- P3 x
所谓域名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/ 的内容。; x" g+ k6 R- }% [ z+ k! x
|
|