管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
情景 由于公司内网有多台服务器的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
2 P/ V& S6 [& ?8 H7 C+ \, u
% x6 U% S) ^/ n6 e# A( Q- ###更新仓库
' V/ F9 F6 C" @0 w# T3 w
; M8 w! k+ ~% \2 ?. U4 ^# n: k& r) Z- apt-get update -y( K+ ?( p) a5 _: {2 `7 d4 k
- apt-get install wget -y6 s; U! E( u3 c, y. P
- #下载nginx和相关软件包
复制代码
0 s: M* r. l9 f- V0 z3 t1 K% b' X, e! Y9 X2 j5 L: l. n& G
pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。$ Z5 S6 @7 q% M, \6 o
0 o' F% j; j8 V9 ?% E# C- cd /usr/local/src3 l; y; H, ?) M0 `4 m3 |- D
- 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# u7 ?$ g) M, X1 t& U/ k - wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>
& y; R: m: ]3 l) ]: J0 J - 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% c4 N7 u& Q" w8 ^: K" T! K- U
- tar xf pcre-8.33.tar.gz% {, k8 P" H8 t
- tar xf zlib-1.2.8.tar.gz' S2 P/ ^, V# F# c- a& a
- #安装编译环境' Z1 d+ D! Z- v" W3 R- i. \/ O9 L
复制代码 4 v2 W4 d! q! \) M9 W4 p9 [2 ?! Z/ c
" i% Z" t" q! J6 ~- z4 r8 q apt-get install build-essential libtool -y
/ M f7 j+ V/ |5 c2 H: P- Y#创建nginx用户
) W L# c' m' t2 T3 E$ C, H! F! L7 D3 h* M; h e
所谓的unprivileged user+ e& K) A$ C' h) r
3 _# L; G, M) Y. N- useradd -s /bin/false -r -M -d /nonexistent www
3 ^7 Q8 @7 J) ^" ^" u - #开始编译安装
# ]7 z) [+ N% h* s: d' [+ v - ( j/ Q1 S+ `, ]# s
- /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \" ^ B, T& A% r3 g1 i j/ Z
- --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module0 C& Q: k/ b& A8 _8 q: q9 k/ {; L
- make; r _6 f" Z ?* r
- make install& m/ \; X# w4 M$ p
- #给文件夹授权
复制代码
! X( b9 Y: B4 S8 c# D: d h 2 P9 l* {; a6 R
chown -R www:www /usr/local/nginx
4 T# F. }! V( c6 K- [# T#修改配置文件
3 n! |; w% c- v& q! tvim nginx.conf+ I9 d4 R! w% A# H
% k( e. b. M! a' _- {8 [+ M
user www www;8 W$ J5 y/ O6 B
worker_processes 1;
3 ?; P8 c; K, P$ e. h2 J9 aerror_log logs/error.log;
. G& @$ }* a( Y; Q0 U7 w5 X; Gpid logs/nginx.pid;
, F/ o* P, T5 _7 m) ~* B6 T5 aworker_rlimit_nofile 65535;
, w# `: R4 y- Aevents {
: k: Z( g" X8 p9 O# F, e use epoll;
$ p e9 b6 i7 v& ` worker_connections 65535;0 o0 A$ K, V5 H+ n$ e1 {
} b/ v2 _( p/ U6 |7 }9 x
http {0 M! F- O5 {! n- @
include mime.types;
' j3 m/ M' ^8 K& ^+ \" N# L A4 q default_type application/octet-stream;" P% d3 @: k3 E) V
include /usr/local/nginx/conf/reverse-proxy.conf;
! c: g, r/ g6 B% T% w& C sendfile on;) B8 {; P" X1 G3 h* P) c
keepalive_timeout 65;
# Y$ ]* [% @" x% v/ M: s g) R gzip on;
; B; Y/ ]) L4 }/ F9 ?" \7 g6 h client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户& o, L. ~, V( U) j( r; \" V
client_body_buffer_size 256k;: x8 W3 f& ~' l# v
client_header_timeout 3m;% p, z7 D+ Y# a2 ]- A# V' F
client_body_timeout 3m;
$ K& v7 I7 `4 j _ d send_timeout 3m;
) J' Y, s O* T2 D' Y proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)( G5 ?. c6 J" X" D1 r) p, x
proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时): O4 s9 G; L! j
proxy_send_timeout 300s;
! y2 r2 i0 M: x* D) D* ^ proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
) S: c0 j- {2 A% j: t1 u proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
7 R1 D% x- @, t5 J# S+ p- h, C proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)+ I5 B( I. i# k! Y6 x( {
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘( s) I7 b! ]4 W# N. `6 K
proxy_ignore_client_abort on; #不允许代理端主动关闭连接
3 Y' M0 p0 m x! W( B J- s" w4 `) w server {, R" A, ]1 M0 O6 S
listen 80;
' o0 D( D `7 z* Q( L% p server_name localhost;* w5 H' u6 ^ H4 ~2 `
location / {
% G+ c: \& ^2 I7 L root html;
# ?, a9 |5 c% `5 E4 D! \$ k0 H index index.html index.htm;
! o0 `- J" k% s }' d9 x5 F5 a/ {
error_page 500 502 503 504 /50x.html;
4 M/ T0 K& y q3 X; \ location = /50x.html {1 d6 N' K3 U5 x. S2 m
root html;
" U- ?+ R0 v% P) [! C }
. R; O9 i* M) R5 g9 R! { }2 t6 }( O3 I ?: n3 b2 p1 l
}8 q) B0 Y) Q j' ~* _- d5 e
& ^# W' B8 ^. x2 u3 {& W- x
编辑反向代理服务器配置文件:
6 D- S& u: `3 O4 M' a, l1 b3 Y
1 w5 h; j# Q3 i. N5 D* {vim /usr/local/nginx/conf/reverse-proxy.conf j+ b2 F O9 g, @# o
' k% i' c% M; Aserver
( W$ }6 s& |+ d{' W6 E2 k1 g2 q5 U' U* C, T
listen 80;, s: d( v# B5 i# `1 L. w! R& j
server_name xxx123.tk;4 c3 p) R$ F7 G
location / {
$ K6 w n$ L* s# _, F3 M proxy_redirect off;
1 n" Y/ e' O5 Q' O proxy_set_header Host $host;
2 a8 [ {/ S1 w& ~ proxy_set_header X-Real-IP $remote_addr;
1 S) k% o) `1 p. F. w* \ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;' l8 y6 M8 L+ t. Z+ x/ m
proxy_pass http://192.168.10.38:3000;
; h [ k8 L h. ~ }$ R3 a# A1 n( A7 c; h$ v
access_log logs/xxx123.tk_access.log;
& C7 Z' R& G8 ^4 e}, t3 q5 C' W7 H; ?; f$ }
4 T6 \% z6 z$ b" H
server
" X4 t; b- H$ ^* U{
% `. W& R7 X$ b; R6 n6 p% _) v listen 80;
4 J9 i' C5 Q) d5 |2 V server_name xxx456.tk;
2 U! ]4 F' q8 o2 G0 E0 x location / {5 d o( c7 J# W5 |5 `! O
proxy_redirect off;
. g) |. p; B. r proxy_set_header Host $host; M6 q4 l$ ^+ N2 Y9 S# `' z/ R0 _
proxy_set_header X-Real-IP $remote_addr;9 B' v# ]! @- h4 f/ |9 t1 D
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;1 @% v3 U2 Y2 ?6 Z4 K7 O
proxy_pass http://192.168.10.40:80;" K+ p% O# J! u. ?
}; c0 s8 \9 [" i# G
access_log logs/xxx456.tk_access.log;
$ m% q8 B0 L8 t}
/ q# \0 }2 ~. E A3 X8 e6 t* ]# O5 R
然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。( n, p, L# D6 h2 M
3 e8 E3 `: y& F/ k
upstream monitor_server {
. c& p- E. J9 s# f$ P server 192.168.0.131:80;
& W: r0 m8 x# u) F8 S1 h server 192.168.0.132:80;$ i: k- i- A8 L+ r7 I
}
4 W0 u! {$ j: @- N+ }5 j 8 G0 W* z# T7 Z
server
: n8 x! x3 g# s, U* p{
2 X; _. ~& Y4 E: D0 Z. ?2 E listen 80;
% p# }$ F. Z% f6 w% @; r server_name nagios.xxx123.tk;5 l) x* B+ N# @# p
location / {6 R7 C7 ^7 G' ^( y. t# L' y" c$ g
proxy_redirect off;: u- G( u) @+ W i( r7 n K/ V
proxy_set_header Host $host;
4 c5 @2 W; [& z; ]: t) K proxy_set_header X-Real-IP $remote_addr;1 \, k- M7 \! T! L2 a# B' A
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; % ?! m6 _' c5 t' O+ R! d; |
proxy_pass http://monitor_server;3 ^3 \$ G8 S4 v$ ]9 z
}3 p& R" u9 c2 {+ o- |/ R
access_log logs/nagios.xxx123.tk_access.log;
2 h% v& a( _! |% A- a}
9 n' o% K5 N' ]( ?. Z" E0 N
1 x U+ G$ ^, Y* [ ?额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:: T% B/ x& l7 x6 f- Z6 ~) r% c) U
6 U' ^' L+ ^! H8 y
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
' K& D$ V! y9 z! }& e2 V/ Q$ E4 B'$status $body_bytes_sent "$http_referer" '
6 _8 U3 {+ h+ S! o8 n8 r# l'"$http_user_agent" $HTTP_X_Forwarded_For';
/ i1 E* V; ]; O. o& d$ {% P
* T% I8 l! L( o! r: aaccess_log logs/access.log access;
3 i% _2 P: W( M( K* t7 V: S4 {6 M' {0 ^) ^7 B
再看看原来日志的格式长什么样:
% R& _ y9 N$ Z6 C) h
3 n: Z. S( n* a8 e: |1
; p7 E# j7 K7 {, G( I2
: H( E G* V" d: I3' y6 o$ j3 L# l, S7 |4 ?
4" }4 b5 v8 Q; F3 n ?5 V% ~9 J
5! G* a8 W- c: J0 F
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '* d. }) }1 |: e' ?+ E
# '$status $body_bytes_sent "$http_referer" '
" @, f: `3 w% S" c9 A3 Q9 f# '"$http_user_agent" "$http_x_forwarded_for"';
, I6 @9 B$ p, f2 q$ \- E1 ?# B $ N, W$ B z1 P5 q2 r
#access_log logs/access.log main;# @& _! m1 G; j% w
看出区别了吧 遇到的问题 之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
7 l7 }) e2 e6 }: W8 @) ^. C! l8 z/ k' @8 o4 w. H( Z! b" b) K* j
1: M) t# L i7 c
22 t7 y- J& `4 Y& z( k/ S o+ q
3, m( E$ M% j% @7 s1 N! w. W6 R
47 s1 Q$ C5 @! }1 w4 s. Z+ o
5
$ _) d: C! y" K% ]0 ?2 T7 Y2 W, M6) f- q# `. J) d% W9 @( H
7! ^% y" z3 r$ D; P
8
7 U; J) d. F3 ]* Y9 Gproxy_connect_timeout 300s;. f: M8 ` x" k
proxy_read_timeout 300s;; H+ r! t* r: J1 h0 z6 x
proxy_send_timeout 300s;4 ?' l1 G! g4 p( d6 C: X6 R
proxy_buffer_size 64k;
- D- D4 V; n- j8 Zproxy_buffers 4 32k;
, Q& A" p* H% K5 Cproxy_busy_buffers_size 64k;
2 F0 c# L7 d8 S+ j7 ^" {8 Qproxy_temp_file_write_size 64k;
a' u) M% N- A: L/ X: ?+ }( T7 uproxy_ignore_client_abort on;8 V7 }& [5 X2 B6 B6 O- V
报错日志:
/ N$ k2 Q# `5 }% y. s# t
; G. R$ i& f2 l9 |) \9 v...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。+ k% D/ j" Y" a3 ^5 Z# h: Y
9 g3 ~: d9 N; c& h v5 W1 y6 o
PS:关于域名转发9 i: @2 A1 n" \( G
6 t/ g T: R. I8 T5 V# x1 f
所谓域名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% h* `$ ~, p! s+ q" U" p" G2 T |
|