管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
情景 由于公司内网有多台服务器的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.048 x7 m& ]* T+ O( m& q' m
* ^2 f: y& t( F( g$ [, L' w
- ###更新仓库
8 ?" k. J1 _2 F% Q# T5 ?. t - ) L4 E# ]1 [& u' l( G
- apt-get update -y
7 k0 u4 r, R. q) | - apt-get install wget -y% J& T2 T% T8 f5 i
- #下载nginx和相关软件包
复制代码 ( V h+ O+ r# z+ A) r7 [
0 l4 x4 E% ]9 o0 Y& S5 p0 O
pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
, M/ i" l! P- W% T) E8 P- @& @+ p8 S7 `' h" t: d* T
- cd /usr/local/src3 ]7 d( _& k) j# ^, h% P
- 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>% G: ]8 T( e# `0 y
- wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>
1 G+ h: _+ o6 n' H# l& k - wget <a href="http://nginx.org/download/nginx-1.4.2.tar.gz">http://nginx.org/download/nginx-1.4.2.tar.gz</a>
2 S4 m1 n: q: U+ ^ - tar xf pcre-8.33.tar.gz
- V( E1 I Z3 ?- f3 `9 x! J - tar xf zlib-1.2.8.tar.gz
, _9 c* D, J7 Q9 q8 P - #安装编译环境) U2 e% I1 o4 e* D
复制代码
9 C. o* Q T M9 L/ W" S
8 z- {- \$ c; o4 n( n0 P$ U apt-get install build-essential libtool -y4 P$ g$ B. @+ H7 s
#创建nginx用户1 S+ a( N* `: c
! ]3 Q/ ]& l0 @* w4 d所谓的unprivileged user
" X7 S, _, Q% d" E* U" {3 U
* n; |6 ^$ F. [( i% {+ s$ G# W" e4 L3 A- useradd -s /bin/false -r -M -d /nonexistent www# x4 i% u7 E H
- #开始编译安装
% u" ~4 H) ]/ }) i% [( x) y
+ U( F, E3 S+ j/ N- /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \0 Z" _$ W" T) b
- --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
5 z+ k% I" y# r% g' X, S - make
: P. D0 h6 `: C" T - make install k+ _" M+ y7 _/ [7 L3 ]
- #给文件夹授权
复制代码 6 U1 M4 u: L3 T9 O( @# a/ y- Y
9 x' a. c! ~# `. @2 q1 Z+ T7 Ychown -R www:www /usr/local/nginx
" i( [* f0 m" O) t- a#修改配置文件. o% D6 ?8 Z+ {4 G( q: a7 ]6 S) Q
vim nginx.conf! h& ^5 I9 Q! P8 Y0 C9 o' F/ X* N
, t9 H( C8 j$ W0 `( D0 v; D
user www www;
3 ?, O* \5 x7 A0 wworker_processes 1;
" {9 R& A- t1 N# ^7 q+ S( ierror_log logs/error.log;7 u" z7 [' ?& \) Y
pid logs/nginx.pid;
: o9 `6 n8 O( C# i, Hworker_rlimit_nofile 65535;
) i5 p) M4 C/ x: q# Q, W3 x4 `4 Uevents {! N* D+ y; t9 t
use epoll;
1 A- N, ^9 }1 P1 I worker_connections 65535;
5 j* Y3 u" R: Z8 ]}2 g1 Z( Z/ D1 }
http {
) i: ]8 a& o: ~0 f0 |8 M include mime.types;( R' P* m: }; P% ^
default_type application/octet-stream;# q0 E6 f! p1 D, v8 g- `
include /usr/local/nginx/conf/reverse-proxy.conf;0 S' n. k8 B9 r, T7 _5 ]6 l
sendfile on;
+ |/ {( ^# Q, H8 i7 g+ R! M keepalive_timeout 65;
2 J! C+ V7 b, X' ?0 s, L) q+ C, U. K gzip on;" N- G1 u* D* c. V* t* a
client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
7 v; C7 g7 Y7 Q( n1 w) ~; Z+ e0 E client_body_buffer_size 256k;
. T$ W& |9 m% J. j! E client_header_timeout 3m;: h0 u1 I) y' c% i7 G7 Q
client_body_timeout 3m;$ F* j7 [2 S- C8 ]6 P
send_timeout 3m;: `% ~* @! @7 p
proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
* D, X, K; T' h+ l3 o7 t proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)% z: T6 o) Z; _* v9 ]
proxy_send_timeout 300s;- q) F1 T; ^, O6 s
proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小7 P( N% ^4 X2 s
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
9 C8 S2 r" \% u: `6 o4 r, G proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)' H" x6 a0 a3 T' \7 h* r+ t8 F
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘8 E* V+ p1 ]' B9 U6 o
proxy_ignore_client_abort on; #不允许代理端主动关闭连接) A# O6 V" N6 L; |4 {
server {6 x9 O2 W- _3 b$ [
listen 80;
+ s0 ~: E# d* |' p$ g server_name localhost;( Y4 M5 i' r2 K2 K* O0 e
location / {! Q; z# W/ {4 N: {0 [
root html;
$ K% S" P9 `- F/ ` index index.html index.htm;
% N. U L$ O+ q1 s }
9 `; W+ X7 l: Z1 E$ C/ ~& V error_page 500 502 503 504 /50x.html;
+ K$ L6 K, {9 `- S* T location = /50x.html {
& V, s- e9 _4 r7 [ root html;6 m4 T1 m. S' z+ |! `
}4 m$ {6 T" }5 x9 R) M
}+ q* {- p& }1 o# l1 ^
}
5 ~% ~% e2 t6 D8 t
! M: N5 C' [" U编辑反向代理服务器配置文件:
( `) D% m" |% X: ]; c; F( i- ]4 N* I8 e# K9 Z
vim /usr/local/nginx/conf/reverse-proxy.conf
3 K% \1 o+ X/ Y D2 o5 ?# R0 K2 g4 }7 O
server
' R. E+ {0 N7 _) N{
. n+ s/ d9 Z$ I# F& l$ _: }+ w listen 80;* [, J5 Z1 q" m
server_name xxx123.tk;. K" [& W$ D& ]! \8 i
location / {7 ^4 v, f% n1 W: [
proxy_redirect off;# ^. i& Q: N, }
proxy_set_header Host $host;7 D6 C3 O# C& k1 j0 r$ e3 n; D. m
proxy_set_header X-Real-IP $remote_addr;
9 ]/ j6 L! i$ J2 V: \9 t' q proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- G* w1 W* R* I5 j( a proxy_pass http://192.168.10.38:3000;' Y. f+ L6 {) e# z, E
}
+ e0 Y! o5 e; V! [( W; x8 j+ { access_log logs/xxx123.tk_access.log;7 `: b, R! V1 V) o
}
1 ^4 j8 s! [) N: V: m: w
3 D6 ^3 d. a f0 m# gserver
. V* Q) N$ H- n @{0 h& Y" P2 m( r5 Z2 W. O+ I3 R' [0 v6 ~
listen 80;
0 w, y S# |* t) s' D' ] server_name xxx456.tk;; p; `9 O6 \. w$ z2 ?( G" S
location / {
5 H3 \7 X/ O$ V3 e& G. k. E proxy_redirect off;' \0 N- g$ y% r. H& z
proxy_set_header Host $host;0 N3 t( K+ X5 F
proxy_set_header X-Real-IP $remote_addr;9 ~2 e7 O* Q2 T, @
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;3 \" ]( n+ v+ p: Y
proxy_pass http://192.168.10.40:80;0 G. q2 [' ~, z1 K* a7 @+ r' I8 U
}
' `+ O, g) Y: u$ L, P& z1 v. C3 G5 e access_log logs/xxx456.tk_access.log;
' F. D1 F# x, q& m6 U8 C7 k}0 m; f0 z. R, r4 t2 b" @
: ^! Z! [% k2 ]7 W/ g' g% E
然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。
+ n; b. v' V* K# t8 ?( o$ L
7 J8 A( v& I8 X9 J% @upstream monitor_server {) }7 B6 V* B' z2 @+ `( K* Y
server 192.168.0.131:80;
1 a2 r, f/ y+ a7 g' f' ^ server 192.168.0.132:80;. s- Y" R; K/ u3 U+ R/ d
}0 q- i9 E" R+ h1 O7 A+ p
6 ^$ o+ I1 y% ^9 ~2 O4 K8 \3 W
server. _7 ^# g9 d7 L9 j0 @6 n
{
6 O5 E: d% g7 k2 f9 s3 u0 v listen 80;2 T8 ^0 p# M3 p2 N; h
server_name nagios.xxx123.tk;. O2 t" J# Y/ B4 [* A9 v, ~* O U; T
location / {
& h: {9 e0 s* O+ d/ O proxy_redirect off;
6 i, [" g8 j- H/ M4 I, j8 W: w5 V3 s proxy_set_header Host $host;
# l8 |2 n5 W* Q! f* Y proxy_set_header X-Real-IP $remote_addr;
) y7 w/ Z$ ]. N4 { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
' |$ M7 F8 t; }+ J% `' B proxy_pass http://monitor_server;8 m' j) j" d. ~6 q
}
: N- l: \$ G' S4 H# L access_log logs/nagios.xxx123.tk_access.log;4 k* t* l& O- A
}# r4 Y, F* _! h% s0 B7 j; f h
. T3 F/ o) @7 s" Q; J额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
2 i* |' T, q: o* i! v; C. S% q8 b& G; }! q& v
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
2 i0 G2 v' G" v5 A0 x'$status $body_bytes_sent "$http_referer" '
0 P/ p7 G( H$ O2 m( z! B0 T'"$http_user_agent" $HTTP_X_Forwarded_For';
4 h3 e2 S' x5 v9 A% s- e4 w - B) x1 R& R+ L p1 U5 t p
access_log logs/access.log access;. F" E% s$ w# j4 C& f$ ]
' h0 C/ ^( V7 V2 k& H9 i
再看看原来日志的格式长什么样:
. N1 C' _' Z, D3 S6 m: ?5 L' H# N/ w
1
( r+ _! [/ t# f9 U) f* g8 h2. p- j) u0 i/ w* @' p5 t7 G
34 L* i& u* N; P! X' I5 U! r
45 k8 X f' I7 i8 j0 Y1 E: q& R6 R
5
; t" A4 Z0 p; |9 O& V#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
: n$ k( K4 S4 y0 h5 B- ? F# '$status $body_bytes_sent "$http_referer" '
/ F4 i# ~- Q1 O; ` o' [8 w# '"$http_user_agent" "$http_x_forwarded_for"';
' Q s, I% `, v5 p4 T3 `% V2 N) C, ] $ v9 N8 {% e2 l# }0 Z' v
#access_log logs/access.log main;
7 Y/ l4 x1 J' |; y* j看出区别了吧 遇到的问题 之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
, S$ E: e3 u; ^9 ?: E
3 ~8 X* a' m9 \* H4 o& R17 A ]9 z7 O I, D+ o1 A
2
, [& }' N" H( a7 H7 G/ R30 w; P* e. j& z% E+ U4 k
4/ o, Z: Z2 ?+ h: n8 ?) {/ f
5
, Q |( s* s$ ~1 T0 V; c: S2 m6; x% ~* k, ? b* F/ P
7
" b3 S3 I' A& | x! E8
" }5 E+ j; g2 Q, H; p5 h1 t; Aproxy_connect_timeout 300s;9 I8 @, K, P X! B b3 v
proxy_read_timeout 300s;
) V$ S* s) U l( { I* dproxy_send_timeout 300s;# q5 x& q! ^) _' u j
proxy_buffer_size 64k;5 ^2 R( O$ s2 F: p i/ G1 @5 p
proxy_buffers 4 32k;) b, e1 q( t+ K4 n' T4 n
proxy_busy_buffers_size 64k;8 J) o( D- ?7 U9 G
proxy_temp_file_write_size 64k;
5 f7 X; ^, i8 i3 Q3 B" iproxy_ignore_client_abort on;9 W0 j- M: @5 b, C, f
报错日志:
& T v1 l" i" i- U \8 {* }% Y" t5 R/ s6 ]- R3 \, p+ P3 H4 }7 @
...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。
( e: a+ d$ Q b3 ?7 |0 w* x
6 K. s6 k/ k+ Q: KPS:关于域名转发
$ q, o) @$ E' Y) y. B9 D N& G+ l( z! a6 `
所谓域名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/ 的内容。
! ]- m Y& ?' z G1 m |
|