管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
情景 由于公司内网有多台服务器的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' N0 C* C) o* w. v
5 V! m4 N5 n S/ U: T0 ?% c* x5 |
- ###更新仓库1 Q; F2 E0 N; e+ i% L; r4 \0 {% h
6 ?; Y: C: F% l- [! R5 Q) m- apt-get update -y0 O' h" d0 E* m' B
- apt-get install wget -y
, [( F' B2 d( h+ y x - #下载nginx和相关软件包
复制代码
+ \6 n }; n2 z
N' R3 o" \5 d' K, Y! ]" J; mpcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
9 C3 w6 \" i# ~9 Z$ g/ o# a, Q7 _7 U' R, j$ A* A
- cd /usr/local/src
) |) t, W+ ]9 w. i9 ? - 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>
& v/ y) Q T0 J) g7 m- T - wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>, T+ |1 V6 _+ n& {
- wget <a href="http://nginx.org/download/nginx-1.4.2.tar.gz">http://nginx.org/download/nginx-1.4.2.tar.gz</a>/ _6 R/ a; p: h: k+ t4 N
- tar xf pcre-8.33.tar.gz0 H# i. F7 u9 L/ a% l" a
- tar xf zlib-1.2.8.tar.gz
) ?9 N' f! p' S! I8 M$ e8 a# B, v - #安装编译环境
# n6 w8 F1 c2 C: z# w8 k3 [
复制代码 $ [/ c, P0 q2 e% X
/ l* V; r% t# g% | apt-get install build-essential libtool -y
* T! j3 @4 \# s+ ]" q1 k$ M#创建nginx用户
L s3 @/ }) w% |/ o8 Y( O6 M
+ \" e/ I; _+ C6 S$ w: D% K4 V/ c/ `7 z所谓的unprivileged user
6 U9 |+ g* z: D) d5 {9 x8 p" z
; e* J" M8 X. {* h- useradd -s /bin/false -r -M -d /nonexistent www
$ ?: o* e" v: J R - #开始编译安装
& Z0 i4 E3 k5 k. e+ K
" O7 B/ B, j0 S3 S6 `4 Q- /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \- e( U8 f4 D0 C7 l9 R$ o) `
- --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module# L' m- D: z( g7 g
- make$ Q" d6 x* u F, m" C+ ~
- make install4 ]" `0 N' X" z- [1 j
- #给文件夹授权
复制代码 6 @- b5 A/ V" t2 W# s, _0 z% K
5 k9 i( e, H% @+ D
chown -R www:www /usr/local/nginx
1 g! _# a. ?4 m" P1 Y#修改配置文件
. j' w4 L# t/ b! e% `vim nginx.conf
; e* g' c# ^& h% ~+ l+ I! B5 s2 a* c# [% M
user www www;
' ]- Y/ y# Q. f* |. i9 C% [6 A& \worker_processes 1;
3 B1 D j* `2 g/ T9 ]error_log logs/error.log;. `4 t0 N' W/ N( t7 }7 p# {$ X5 g4 `
pid logs/nginx.pid;& L, a1 _7 ~. T- H3 R9 |
worker_rlimit_nofile 65535;4 }1 e' D9 {2 x0 u
events {% i, x$ P( P2 P9 F. _
use epoll;
9 q. D* o0 _ A. L: S& J1 J worker_connections 65535;
/ X4 P; L% k9 w- x}
6 x/ c4 T8 r, F- Rhttp {
$ H. X9 r3 c" s5 z include mime.types;
8 _! o n' W; q# G7 G default_type application/octet-stream;) p* l4 F* }; G' ^+ O$ e
include /usr/local/nginx/conf/reverse-proxy.conf; P5 X/ G/ ~ ^" K
sendfile on;
$ ^0 e0 ~. e3 K. ^3 P0 _! t keepalive_timeout 65;. t7 S4 Y( q( \4 ]
gzip on;4 t% H$ Q4 `% s
client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
1 r% V8 ^8 Q7 s5 e2 b# @1 Z client_body_buffer_size 256k;
, _+ c0 b3 Y4 @3 x/ T0 H( ` client_header_timeout 3m;
+ { G7 U! S0 X7 g client_body_timeout 3m;
0 y' |, b' j1 \+ u- d send_timeout 3m;3 A1 \1 H& p% D5 Z) F. D8 l
proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
+ H& O; c! g( e- w/ R. L/ ? proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)3 D# d! M8 t+ e1 L+ M; U& x
proxy_send_timeout 300s;
9 Y; X4 H* M2 y* [/ w* r: g proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
6 X. m# S* D* F7 n! g } proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置4 l, F* H) o3 I$ f: d6 q
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)& [. R0 I _: d3 F! I
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
! c2 P v8 w7 G, p/ c* M# T k proxy_ignore_client_abort on; #不允许代理端主动关闭连接5 e2 P3 N5 m: [( Z, f
server {
& |' E7 Z7 e; v ] listen 80;
& E1 T9 U% ]' J7 y3 c server_name localhost;
1 j g2 g+ O1 Q. d+ u, ^9 T location / {
8 ^* v0 Q" I, ~& x: k1 M: ^ root html;1 z9 V- k8 t: \. c0 V/ V
index index.html index.htm;# I- v8 T/ i+ n2 ~0 i
}
. ]% L6 m* V; J, F& o. G$ z error_page 500 502 503 504 /50x.html;2 U' y* D! g: Z, o$ n
location = /50x.html {
5 t( {5 w c+ B root html;
) O5 O5 x. c0 |! q% ] }
- {( C" O. X; k% F }
$ f( M+ H: ], p u5 U- U$ b}
; y3 [# b6 \+ p# t* x
* W( q' T& ~! f1 G' ]5 B% P编辑反向代理服务器配置文件:" l( }, ?! e2 Z# p5 {; P
# `: J* {4 m3 D. I2 C# h
vim /usr/local/nginx/conf/reverse-proxy.conf
2 z; m9 U4 I; s/ w& s. z1 s6 |6 ]' B. U3 Y
server
! p; ?3 ~: h" `! O5 F" {{: I3 ?! x) M+ W& ~
listen 80;
% p/ ^2 K3 f" s! z( s server_name xxx123.tk; `6 A" V& s: S( ?7 O
location / {# w9 a+ D8 B6 h. q) J
proxy_redirect off;
' }. i6 T; ]9 z/ |$ E) d' b proxy_set_header Host $host;- B) H- L+ Z5 F" `7 h/ H
proxy_set_header X-Real-IP $remote_addr;2 ?8 s+ }, z$ r% u4 S1 F) j) P8 a! a
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;1 ~1 v0 g, c- S8 d- h3 I4 q
proxy_pass http://192.168.10.38:3000;
. L0 D# ?- d0 U9 v! f$ {- L) K }* E1 e5 a) w6 ]# i; V* [
access_log logs/xxx123.tk_access.log;5 C4 s/ j, h* Z
}- D/ C; M Q {# c6 Q
" r! m8 h! j; {2 k# W! S: Fserver) f) O6 K0 s1 |: A& c6 \
{" h4 }3 g6 R" `3 t
listen 80;
. q/ M! b7 l+ h# O& ? server_name xxx456.tk;
( J- G( N/ F1 H' a( B location / {* `% J4 D& Q% M. q
proxy_redirect off;$ w4 o7 Y6 o* _9 g) n( P
proxy_set_header Host $host;
' I( b& R, [0 e0 P" M0 r proxy_set_header X-Real-IP $remote_addr;
2 l F5 s& |" }) t- n+ Y proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
, L1 r$ `0 l# v: U9 t& I proxy_pass http://192.168.10.40:80;
8 s: F6 J- e" H }
/ z$ f9 F- M; y1 F7 q access_log logs/xxx456.tk_access.log;
( M. ?9 e" U* p% y- {- M/ {; V9 m}
; y7 ], b# w! T5 B' H' M
( o8 s: L# ]3 H' M* E' C/ ~然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。2 w8 H3 K `0 F1 z L
% v9 l- \% r( x6 b, l" |
upstream monitor_server {+ m% e1 q4 ^6 N- X+ i% {' K1 \
server 192.168.0.131:80; o' I( E; `, [: r8 r& T: i+ h
server 192.168.0.132:80;3 F7 ]$ j4 D7 f) I
}
. O( A, W, [7 n2 j* F
]0 N* @' U9 o5 f/ c- qserver* {/ w) B+ |/ V- ?
{
7 ]' _9 O2 R9 R; d% b: X" U listen 80;% E0 K* w5 U9 q! k T
server_name nagios.xxx123.tk;
2 }! }7 ~. J% R6 Z8 C+ ]& I location / {
7 x5 q! _# ]( F: n# k q- q* t proxy_redirect off;
: z9 L% m7 J( V1 S) D- ~ proxy_set_header Host $host;
) F/ k% @5 e9 K. E6 H/ N0 S proxy_set_header X-Real-IP $remote_addr;
3 n& R0 ^0 [2 z( _( s7 N proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
5 v) J# q2 z Z, N- J( ? proxy_pass http://monitor_server;/ b* K# N& V8 e7 _
}
: e! N% ~/ f, E& X* u access_log logs/nagios.xxx123.tk_access.log;
1 S8 X r, ]2 B) L}
. ^. o# F% C% `
; t% [4 B7 K1 M/ l额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
- i4 |- ]+ H# u1 I" D
. Q. Y" A' J7 \, Qlog_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
% y7 I0 V+ `" K. x/ l6 ~2 D'$status $body_bytes_sent "$http_referer" '! F8 [ ^' Y9 V% [1 y
'"$http_user_agent" $HTTP_X_Forwarded_For';
4 I! ~ n5 r) F; B" v ( J' `8 o: x- ?$ \. H
access_log logs/access.log access; x) I& n9 R( P' F% _9 R$ `7 J8 ]
$ Z3 @* o# W+ r7 Q4 H' R! Q0 D/ y. m
再看看原来日志的格式长什么样:
) I; ~. V% a6 C3 w1 C! a% o( x7 `' F+ Q6 Z* l. G" D" p
1
. O2 g* B5 n9 ?7 f$ @ G2
! V9 ?: Y* V3 L" H5 B7 P8 o) q3
/ [5 e- h, u ~4 i1 Z7 [" j# H4, o% G+ L% s3 I* ^+ x" N5 D9 [
5% ]) a; ^1 s; E& ?. D# G7 z9 w
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
. l: D- i8 Z: G% I7 Y# '$status $body_bytes_sent "$http_referer" '( b7 t) J7 t7 m" x9 h$ z
# '"$http_user_agent" "$http_x_forwarded_for"';
* l6 r8 |4 ]5 J+ q. S9 n5 B 0 D( j! N. c0 \8 v% I+ z* N1 \ Z$ u
#access_log logs/access.log main;7 M$ x$ k6 S' m+ s d+ p" K6 d$ G
看出区别了吧 遇到的问题 之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查! \3 }$ T& v6 w" m0 v5 H
9 R7 M9 u3 R6 u# Y6 _" j3 ]
14 W" W9 t0 \7 l4 `; P
28 B7 }* n3 F2 }3 R0 \0 ?# M* ]
3 f& G( O3 v% b! s. W U% S7 a4 @
40 n$ v2 U* f4 P# S* d @+ B
5' [3 I1 G: m# m5 g8 n
6
) t9 D7 ~& n' l6 S70 F% N3 `; H5 w9 D& p
8
% d( V$ ]; ]9 o. }) R. ?proxy_connect_timeout 300s;7 `- D$ d1 `2 M3 M$ c* t; T
proxy_read_timeout 300s; w n- I$ ^) t% G) ]- `
proxy_send_timeout 300s;
- B1 g; x4 w: Tproxy_buffer_size 64k;
) Z, u1 @* W u7 ?6 ]/ Eproxy_buffers 4 32k;' M" [( v. A6 C" A! v; D: b' m
proxy_busy_buffers_size 64k;+ o3 ~) G; n1 |( I
proxy_temp_file_write_size 64k;
/ f* b: Z, W0 Xproxy_ignore_client_abort on;
% l- b( E8 V: a8 M4 R报错日志:+ x/ j0 j! `: X* P5 J: \
+ u8 ~, I# g3 I. T: R1 F1 |...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。
* V/ z; R2 y4 [9 H9 T! d. e
2 X* U) g& ?9 @" M' qPS:关于域名转发4 V: P; }- M9 a: x
3 F/ K/ Q& L9 F- T所谓域名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/ 的内容。/ L e E0 n1 j$ S3 ^% ?
|
|