管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
情景 由于公司内网有多台服务器的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 b0 e6 a2 O4 A! [& ^. H5 E W* ^7 _" |# d C
- ###更新仓库
) A, }, _4 U+ }9 n - $ T+ S0 N' _$ _+ |; B5 ~8 I
- apt-get update -y
7 s- k& n( Y- H: j* b) y - apt-get install wget -y
. f: J1 U8 N. u( G" E - #下载nginx和相关软件包
复制代码
+ w$ `$ N9 x; r k
/ s/ y9 d" ~. Epcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。/ C" B, N% S, U7 K, f: A5 r; _
* Y: H$ X N, \, O- cd /usr/local/src
& @% o( K) @( w - 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>
; M7 G) M; |( T - wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>
& O% i2 p7 X; V2 X& A: H# c: b - wget <a href="http://nginx.org/download/nginx-1.4.2.tar.gz">http://nginx.org/download/nginx-1.4.2.tar.gz</a>
: r# a9 [! `: G7 \ - tar xf pcre-8.33.tar.gz( J# g) g) w, {/ y) a6 }
- tar xf zlib-1.2.8.tar.gz
! U1 R1 Y. S1 t3 [- u o - #安装编译环境
* g& n3 J$ J, }$ h" f9 t
复制代码 1 n5 F' e% ^' v" ~. v) c/ f
" J1 d7 _9 m T" g apt-get install build-essential libtool -y
5 ~" Z8 j# v, G6 B! S; X7 `#创建nginx用户5 S3 u4 f4 c9 w; N- ^
. J* O' y6 w, O/ e% U7 y所谓的unprivileged user
, e* E' ?& Q. e4 l4 a1 R3 @. e
- useradd -s /bin/false -r -M -d /nonexistent www8 j+ ] T8 h2 K: {$ h! G! F
- #开始编译安装
/ H; \5 T A d - , ?9 k& `4 V S) G+ z3 j. K
- /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
4 U6 c* f W4 a% Y - --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
) \8 x& }; S3 H! j9 l* j2 [ - make
1 r/ h9 f0 F% O; A1 `7 c - make install$ R, u5 n$ v- n( v+ Z
- #给文件夹授权
复制代码 / i! {% W4 f5 r
7 K9 J, d- c: _( {chown -R www:www /usr/local/nginx- e6 a# P! o4 P0 g1 P4 t
#修改配置文件" U# G3 M- W8 w# j$ {
vim nginx.conf3 G( i& J$ I! X' l
8 I2 \! _6 | U9 u* {* r
user www www;
) |* U" e7 i% \( v% s$ Eworker_processes 1;
. L. G7 Z7 {; }3 g! ]8 Ferror_log logs/error.log;% W+ ^1 o2 U5 e' N( i {
pid logs/nginx.pid;5 o) k- {4 Q% d! u- t
worker_rlimit_nofile 65535; p7 A9 o1 f2 n( \( L( }* d
events {( ^7 T* W9 P: S' V% L! _
use epoll;9 E, Z! a3 a' g9 _! f4 M# I8 Y
worker_connections 65535;8 C; j: z* p( z0 T7 B
}
, n* d7 U7 f( Y: phttp {
) c4 i) t0 V* ]+ ^) N2 y include mime.types;& U% ^/ |8 \" M, {! y
default_type application/octet-stream;( \+ L& x& f6 J& R
include /usr/local/nginx/conf/reverse-proxy.conf;0 K2 i; B4 L7 ~; k4 S' y
sendfile on;& s6 ]7 N$ O* Y# N2 A w
keepalive_timeout 65;- ]& ]7 A! E" v2 C4 j
gzip on; f. x9 \. M: b! f& j
client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
: }) r5 V' m5 ~! y. o( n2 Y6 m client_body_buffer_size 256k;" _' W0 |' \) W, U" j
client_header_timeout 3m;; m, T0 B: _- @5 ~ w
client_body_timeout 3m;: N* U4 L+ @/ `1 m
send_timeout 3m;) Q) a% J9 y5 g) `6 l; ~2 j
proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
' ~! u6 g g3 U/ y proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
/ }- G0 M5 _" ` proxy_send_timeout 300s;
( W% h& I8 R" g3 ]. U proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
' Q# J: k1 O- D* i8 T' p3 E [: Y proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置7 C% L* d& c% ^% A" F8 u
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
' ]6 b2 O& c# H5 O1 J9 A5 n& `1 m proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘 m* U. `- K- a" O
proxy_ignore_client_abort on; #不允许代理端主动关闭连接! c! Z# ^9 ^# L1 ]& e2 |
server {
" P/ B; K1 I* Z, @# K/ M. A- x) S, i H listen 80;' E2 J6 B1 x7 c/ ?, }3 c
server_name localhost;/ U8 q/ N" S$ ]' O6 r
location / {
8 |$ A1 }4 w7 I& s$ l; W( ]+ s root html;0 }0 o0 C2 ^& F0 i( J4 ?
index index.html index.htm;, }# M1 f" f6 b3 D* ]: D ?
}
* r: I6 I ?; y8 ^3 H; X! X error_page 500 502 503 504 /50x.html;( ?' v" q& f& e/ r8 D1 s1 [ ~" f
location = /50x.html {6 `6 b w7 d5 m2 D! r, [- U
root html;1 |4 o5 {3 ]2 Z, w/ t3 U. B
}. [/ b4 L/ b6 N% C4 {' y
}
- v# p2 ]1 m( r$ w/ z}! E( Y7 ~( e' A, E s, m" J
) y; u0 E# t, d! n% A- H
编辑反向代理服务器配置文件:- ]# |$ D# `5 t! `# [: d; E8 {, C, R/ y
, Z8 N$ ]$ W; O3 Y1 t/ K% Nvim /usr/local/nginx/conf/reverse-proxy.conf; n3 l- X7 N( I; R
, Y; }! A8 e- u3 \- y+ Eserver$ P) p2 x! S, x; d8 j8 E8 w
{
5 Y: k: _6 X b+ @6 T1 ] listen 80;& v+ T N$ `/ {* i9 \1 { h5 a
server_name xxx123.tk;5 j* F. w# `9 ]2 B
location / {. z% B2 j0 m, T$ M7 b ]
proxy_redirect off;8 C, j) b) E& S6 S7 \' a
proxy_set_header Host $host;* E6 D+ h- t+ B* w; K. |0 t
proxy_set_header X-Real-IP $remote_addr;5 _( L8 D, }5 o6 @, A
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;4 h. r7 S. [8 q. E% }* n+ j$ @
proxy_pass http://192.168.10.38:3000;$ m, l. Y3 e& P, g
}
$ }/ g; O% T. k) j! @. G! S* e8 a access_log logs/xxx123.tk_access.log;
, z0 u& s1 w( R6 R, b- S% G p; R}
. u. o2 v2 g) r+ {& z! f! Q/ y
, I) `; W$ l9 o, ^5 fserver
8 {; i/ e7 ?" \& L" d& N2 B{
( I% d/ @! u) z. ^9 d4 u listen 80;
. i, T: i- o { server_name xxx456.tk;6 x4 r6 I8 ]8 p( {0 m- `. O6 V2 `
location / {$ b0 K6 X: M3 [% L0 h* z* {0 P
proxy_redirect off;
! D5 y$ F7 C. n* p9 ]. u! O. j proxy_set_header Host $host;
7 L+ |9 ?4 c" v+ J: C7 V, b' d3 V proxy_set_header X-Real-IP $remote_addr;
& ] ]7 p; K# l; J+ s9 Q0 W- c proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;) |; }- s! w( D% ^' q2 P. }( M
proxy_pass http://192.168.10.40:80;
) j! t3 U1 Y5 u5 s* b G$ @ }
0 n' w, z6 H8 ~' C( t% N access_log logs/xxx456.tk_access.log;
' ?$ r' M5 [5 J* Q- v, j& C}% \7 @2 f4 h0 u+ e9 Y$ ~
' l5 m3 K: I G4 ~然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。
. C! R5 H0 p! q/ I/ |" [% z) _. N2 v# Q4 Z4 Y. T
upstream monitor_server {/ D& b- }& R, p4 X4 k9 w* j
server 192.168.0.131:80;
1 |# k& O* D& g9 F$ w server 192.168.0.132:80;
. P6 ~ ]6 ?! @( e6 K/ R) x# S}! a: h+ `0 V. y& n- S- X5 ~
R8 v3 R$ b! `# J' r3 o' W: B
server
4 g3 s& |9 D- k$ V6 l( j0 J{6 C5 W: g8 V7 m; S+ b: A
listen 80;
8 H8 r" V/ i" `( d' } o server_name nagios.xxx123.tk;6 P l( E2 |8 A. x9 Q4 k7 Y
location / { u" {: Z+ N5 S* C! f3 J8 C3 {
proxy_redirect off;( u7 b! V( k4 ~! Q6 n
proxy_set_header Host $host;
" r2 v/ |1 ]1 m9 o7 U4 K/ [7 e5 | proxy_set_header X-Real-IP $remote_addr;7 n) i( R p+ _/ Z
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ( U: C8 \& j5 \
proxy_pass http://monitor_server;
: G, v. m+ L" [ }+ Y5 g& Y7 t, b0 Q. A
access_log logs/nagios.xxx123.tk_access.log;
6 S1 i: B$ E/ C6 L8 K}9 T! c1 D2 g% P) T( B! H7 U% z
9 A- @# J+ [2 O" z0 f
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
8 P# i% ?; r: `; a7 w& @5 i3 I1 N7 Y
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
1 g6 {2 d1 H3 k" x( k1 I'$status $body_bytes_sent "$http_referer" '
2 I8 c6 k# r% i/ K9 ?'"$http_user_agent" $HTTP_X_Forwarded_For';
, P6 g$ H+ f, u: G" _7 x' Y0 A ' W: `, b! Y6 H
access_log logs/access.log access;
" I+ [$ i5 [* }6 ? l) ^% c/ j
: i/ F3 y; i# C* v F3 g再看看原来日志的格式长什么样:7 p. ~% s9 k5 v' j: v) m. r! C
; Y1 d6 r" G. ?5 |& Y5 b1
$ I7 u1 W$ n" h# Q W o4 ]) j1 i2
8 ?9 z# U- ~8 O' U3* p3 N# q( S/ A6 o) {2 c- O
4! j& a4 p+ L$ n
5
. [" b) r v& w#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
$ L% L7 Z- D, G2 i# '$status $body_bytes_sent "$http_referer" '# |9 Z7 w7 X! K+ w+ @
# '"$http_user_agent" "$http_x_forwarded_for"';
{0 z, {/ @5 y+ t5 j, N$ [ 7 C6 u2 l8 n& ^
#access_log logs/access.log main;- a* {$ J4 U* C
看出区别了吧 遇到的问题 之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查$ o; L3 D1 l3 B, X
# x7 o5 o+ O/ f3 w+ o$ u; f1% A, _5 v8 Q3 w1 o8 w( @
20 O; M, Q8 w: K/ m+ w" x, D
3
w& q2 F0 R. r. I45 @4 _4 O' ]* g" D5 V7 k
54 }1 ~; T' Q5 x* y3 B( L( J2 R
6) [8 ?0 r5 e. t3 b' {8 @& b7 ~5 {
7
* a7 H; j" { Q: |+ t ~) o' v8
( _3 ]5 X! m! ]; Mproxy_connect_timeout 300s;
: c( N% W* q2 U$ K& ]; _/ L! l: O" fproxy_read_timeout 300s;
3 `" U7 y- L( d9 {4 {3 H3 yproxy_send_timeout 300s;/ ~& P4 o O* A. }# ~1 [: {
proxy_buffer_size 64k;
4 o6 D: K% w k: [& ?5 ?! Qproxy_buffers 4 32k;
1 |- r# P% ?1 k- c$ y- b0 {% Vproxy_busy_buffers_size 64k;( l( K" g; c m* c; ]4 {
proxy_temp_file_write_size 64k;0 |/ U( H4 B3 o0 Q$ t# M7 P q
proxy_ignore_client_abort on;0 B8 X2 D/ \+ f& v# }
报错日志:
+ v t' d/ V, _: I8 e: R9 A" l" t1 P0 C0 y- s
...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。+ f+ a6 R9 i" r& X9 \* s7 O
4 I* c) C9 r* gPS:关于域名转发# u# X' p9 N" Q' D- l+ Z
+ G$ T0 F, Y& Q所谓域名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/ 的内容。) k) n$ z% z$ z) `
|
|