管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
情景 由于公司内网有多台服务器的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.041 L& B9 R7 [, Y, y5 g; X8 ?
$ O/ {6 n6 K2 i' c
- ###更新仓库5 p) w( e3 |0 u$ `! z, `
, t: s. H: N9 z- apt-get update -y
A5 R% e2 z9 C2 H( ^# c$ X - apt-get install wget -y
1 ]3 A6 [) h! O6 M5 E - #下载nginx和相关软件包
复制代码
5 Y( L1 t9 X4 G4 L3 B/ l
+ i" U. _8 a, L, y0 upcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。6 o3 N1 q. ^) D
1 O3 L7 s. p" t, C9 s! N) n- cd /usr/local/src1 j2 N3 z7 k# k+ A
- 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>
6 x3 r3 }! I" c! ~1 z - wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>, t: Q& c* l# R1 R0 p9 J- T
- wget <a href="http://nginx.org/download/nginx-1.4.2.tar.gz">http://nginx.org/download/nginx-1.4.2.tar.gz</a>
' `. ~, j% g- b4 j - tar xf pcre-8.33.tar.gz4 f4 @6 V. l& k L8 ~, K
- tar xf zlib-1.2.8.tar.gz
" P) D R: }6 y - #安装编译环境7 \* B! q% ?6 p/ Q
复制代码
" J$ o7 G0 G' p7 f9 L' U X+ \: j/ j% g: j
apt-get install build-essential libtool -y
/ f% o9 i& {6 w2 ?& P#创建nginx用户8 z7 l) U; J6 L" \* Q1 L
- g( P9 W0 e* A9 ] L4 F& h
所谓的unprivileged user5 r2 P& ?2 f/ J. T: l
+ }( T, h2 {, w/ u& t" [- useradd -s /bin/false -r -M -d /nonexistent www
3 n7 X, q$ I3 f$ R1 d - #开始编译安装
, G" p1 J% l% @" C$ I) B9 D1 c E - $ L0 y$ q# [0 i% d- @' [
- /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
# W6 _6 z& V* q' d: A - --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
9 [, L# O% g& K4 T# F! l - make! Q% w4 B; W1 C R1 k
- make install
" b+ L: c c+ L' z - #给文件夹授权
复制代码
2 w Z# S2 b% u( o: D5 b) L( R0 C
5 f4 B6 ^$ n1 ^chown -R www:www /usr/local/nginx/ D$ A0 g4 C( G
#修改配置文件& D( h! J- f7 X! _8 T
vim nginx.conf4 U5 t/ F1 r$ S/ ?. R
0 c5 ]8 o9 {2 M' fuser www www;
! R8 _" |% ?, O* gworker_processes 1;) l8 b; E( S, c9 U5 i- U
error_log logs/error.log;
( C! y k# @& `0 F% }pid logs/nginx.pid;3 w0 }5 S* T! b2 @! b
worker_rlimit_nofile 65535;
( P$ F3 \' q' Z5 cevents {
. Q+ }9 E! X: R) M use epoll;5 Z$ a3 ]2 i( j3 O+ c
worker_connections 65535;* R" _7 y# o# I: E/ W, a8 k
}
. f" Q7 C. x' d; P$ V. Rhttp {
' b% N4 Q8 e' |- W include mime.types;
|/ v1 E" z/ N- e8 ?# v default_type application/octet-stream;* S3 E* O$ T+ p: G- }4 l8 t
include /usr/local/nginx/conf/reverse-proxy.conf;
/ r# y* [9 c) V* C4 N+ c: a$ b7 P sendfile on;. t+ P, `+ T/ m: Y- [
keepalive_timeout 65;
9 n3 T6 J+ X$ c' { gzip on;
1 s! G& u, ?% G9 d1 ] client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
; V. E" ]+ Z, O4 ? client_body_buffer_size 256k;: ~6 o9 Y, b9 Z
client_header_timeout 3m; Y$ K3 r" X; A) V7 p
client_body_timeout 3m;
, }0 b; |# r J$ j send_timeout 3m;* O7 R5 M# \) e5 F
proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)9 H+ X: P+ j: b$ G
proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
2 q' E Z5 _" N6 n1 f proxy_send_timeout 300s;* I8 r' y- d( F& {$ m3 z
proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小) w* p9 X) d" R5 g* P/ y# W( y
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置 b/ J3 ^, l9 z! i/ @
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
# d8 f6 L* {& J# F) @+ [ proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘0 Q# D! u X& u9 P4 `
proxy_ignore_client_abort on; #不允许代理端主动关闭连接
1 r4 ]6 H8 \6 k6 ^0 \ server {1 ^# M2 e8 c, c, F+ {
listen 80;& o* Z' ^$ {; ]6 h. C
server_name localhost;
& [' J; r+ J& a2 H location / {
6 F) f# H1 a1 |4 A- g( d root html;
) A& i7 f) I z; }. W' x5 L1 Z index index.html index.htm;
3 y E; j$ J: S5 h- Q }
( W# a, r0 W" h- b P& Z/ d | error_page 500 502 503 504 /50x.html;
% `, {) z0 X+ b" y, p0 [ location = /50x.html {
- o+ S" Q# f& w. D6 j root html;& x9 f) J. y; m7 r% \7 I
}* ]0 l3 [6 h6 [: z$ P1 x
}4 D, P9 E! V D G
}$ ]' W( C P4 f! l
+ m [4 h& c1 p
编辑反向代理服务器配置文件:7 p9 B# L9 R9 j t% M
# K: B- [, S7 @
vim /usr/local/nginx/conf/reverse-proxy.conf- e+ r, {' G4 z: w
( ^) U' N2 x e9 A2 ^, rserver
& |; z! b% k$ S6 d2 w{
2 j- W: N: Z9 e; K$ p3 [ listen 80;, t5 A+ E7 {; p( T3 T
server_name xxx123.tk;
/ n3 E6 V0 m2 L. U4 K location / {
6 Q3 m ^! B8 {6 f" B. i proxy_redirect off;/ y. p, u4 y' h4 r
proxy_set_header Host $host;
- G5 t0 W s9 S) K, N& ] proxy_set_header X-Real-IP $remote_addr;' N, P0 I8 L/ S& u# {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;- Q% t3 `4 |: p4 x& D% a- n6 Z B% F# B
proxy_pass http://192.168.10.38:3000;- C& p2 Z2 j/ @. M! _0 P
}& A: ^" q: |, G! r& B5 V1 ^3 L
access_log logs/xxx123.tk_access.log;" A+ _( ^9 u* l. b
}" w5 ~7 k2 K& ^1 L0 a3 y
E- d, p1 n) Z; o$ ~! O5 J) vserver B, o5 b" N- y8 M- r
{; E+ x6 b E y% S
listen 80;
o+ ~4 F" w( B. m2 u# v server_name xxx456.tk;
8 m s$ t$ R( I2 Z location / {
5 L v7 _ V- T' w) l proxy_redirect off;, }* ^: s# R/ ~3 X" _) _
proxy_set_header Host $host;) v" E i3 u- s3 F
proxy_set_header X-Real-IP $remote_addr;
$ C& f+ ~: t$ O proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; [- w% y/ o+ \+ e' w7 X: u
proxy_pass http://192.168.10.40:80;* i/ r1 Q# U% `
}+ J* T! G$ S+ [$ q% q
access_log logs/xxx456.tk_access.log;* t# v5 T9 L2 r4 x
}
; C! K* I: m+ G; I8 I2 N* S: I5 U) X L* i$ }
然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。
( e1 Y- L' H3 ^5 {# L! {
% l; \# f- ?: mupstream monitor_server {
3 i9 J+ W% m; N& t3 l server 192.168.0.131:80;
5 `5 i3 d3 g5 ~; y# T* w/ s9 U1 [ server 192.168.0.132:80;
: O4 R+ v& Q, A# U0 u' N1 N}
2 t+ M/ D3 e: _8 d
6 I# D) ?0 `* \8 f% O# ^% oserver
' d9 N5 K+ F" x# F" x. p{+ w0 n; o$ |) N4 O& m7 X
listen 80;; O" ?% F0 L3 i5 m: Q) F" t% Z
server_name nagios.xxx123.tk;
4 m* e. b" m5 [* m( r location / {! K/ f. ^; S) a6 Q
proxy_redirect off;# Z1 C; s, T3 M
proxy_set_header Host $host;
! X) t/ S3 N0 {5 ]$ p9 T proxy_set_header X-Real-IP $remote_addr; L- J& B9 y* ?
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- q( ~5 r; q; w" c+ \ proxy_pass http://monitor_server;
$ ?! S) {; H4 L" x: O' j4 @ }
4 }1 R$ B. N5 @* T0 y access_log logs/nagios.xxx123.tk_access.log;
' c( Q$ C; x5 k}
T* \7 v3 j n% h# l3 P- `, _6 v$ S/ A6 o0 M: j
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
1 k* z0 G2 O# k3 T8 t' t* _& X8 u" M. P: E& H
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
) d$ y S% k- a4 A'$status $body_bytes_sent "$http_referer" '8 ]2 N& b, j* [ A5 q
'"$http_user_agent" $HTTP_X_Forwarded_For';
: L, N ~& I- c; ?/ t$ R! w
. b! U/ D8 ^3 I. c* f* @$ aaccess_log logs/access.log access;9 z/ E4 o0 _2 s
) n! [) u; K" x- I% ^- d
再看看原来日志的格式长什么样:
2 B% s: {* T& }
/ x% o& q! t3 P( \1 @4 H a) U1. W2 d' r9 r0 ^# M
2
/ Q: H9 f( F# _. r$ _* k3
) F/ l, _ m6 C- w! {5 y, w4
4 S6 n& i, i( S& {5$ T8 c3 ]( f1 i a
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '( p3 ]% V6 l5 S
# '$status $body_bytes_sent "$http_referer" '( E; P9 W1 j: k2 r& l! u9 M/ o
# '"$http_user_agent" "$http_x_forwarded_for"';
# f/ G; P z$ W7 e; W- V) J2 u
& M& {# S1 A$ b' p d+ x2 m#access_log logs/access.log main;' B, d0 T) J8 G1 H8 D; \. ]6 ^" d6 z
看出区别了吧 遇到的问题 之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查 e4 D/ L3 q8 w, C8 U3 ]# T
( F, K. x6 e; U- Z7 _8 B8 O$ j( |1
" @7 h# U' ]0 @& Q# M2
% d9 O3 d2 N( `. ~ [1 o; @3
9 _' D: Q9 n2 B, P4
4 }9 P2 A8 \7 z% Y" R51 a. r+ U: z1 ~
6
( I) X& ]8 p% a8 E2 I6 {6 O" U0 I q7 Y7
/ u0 s9 b& k$ E. \2 j" M8
! ~0 J3 `7 Z7 F7 `* O/ Vproxy_connect_timeout 300s;# x/ H; L6 |4 B1 E& D U
proxy_read_timeout 300s;
- ?$ a G& P7 k1 Y" l+ k9 Y% bproxy_send_timeout 300s;1 e6 F' @6 b$ R' _8 A- O
proxy_buffer_size 64k;
2 k. r. u3 ]4 r S" J: U5 g) U+ Yproxy_buffers 4 32k;
* Q$ D: i% @4 w) O( D$ iproxy_busy_buffers_size 64k;" F/ Y' X% J6 V# n4 j9 D2 y& d
proxy_temp_file_write_size 64k;1 o: }- T4 R/ L, r# ~( J
proxy_ignore_client_abort on;
9 p$ g- D3 G1 C" e报错日志:, ]6 Y9 d- l: g1 S3 G, Z4 T, b
$ N9 \. ^4 l4 n( T6 R* |3 m5 P...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。
2 c+ d9 M, F- B$ u
3 n. t6 N- M& a1 K1 A: T9 g* q! KPS:关于域名转发3 J0 Q& T/ `( r! e$ z. b8 A4 D* N8 j4 s
9 y9 k8 M) c9 s- T5 u
所谓域名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/ 的内容。
- w. u H& _& M: T |
|