管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
情景 由于公司内网有多台服务器的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) I& y( r9 G9 ?6 V/ [3 P0 m
' @7 Q/ h! J. i/ l3 W. n! ]- ###更新仓库1 T' _/ [: Y9 J- {4 @' x
- 5 i+ f$ ^& y. s; h+ ^
- apt-get update -y
- H- a% x$ J, z( i) E+ D& T | - apt-get install wget -y3 a* v) q3 y: f' w# C* b0 Z f
- #下载nginx和相关软件包
复制代码 + e0 U- H& L8 A4 g: t5 g/ X
5 V4 N9 v6 l! L8 W- f# h
pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。6 }% i2 G; r+ d, P! E% a5 f
0 P! Y# e* F# n" ]) x( D' v
- cd /usr/local/src
2 K: s. V; L" o5 |+ m; \0 t; ]) V - 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>
+ y: L7 T; Y" J - wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>
* O" _1 @5 U/ ^. l0 s6 s - wget <a href="http://nginx.org/download/nginx-1.4.2.tar.gz">http://nginx.org/download/nginx-1.4.2.tar.gz</a>* }3 j' f. c* d+ b' P% ^/ F
- tar xf pcre-8.33.tar.gz) w! W- n _: Q! q% |2 v# _
- tar xf zlib-1.2.8.tar.gz# _6 L* O. O0 l
- #安装编译环境+ C! M8 `' A) i2 z* l, ~( z
复制代码
7 u/ O. g, Q2 S# I* B* e 4 R0 i# P. F {! G
apt-get install build-essential libtool -y7 G; k' l* i' }5 s; ~& O
#创建nginx用户0 p+ H0 j) y# F! V. ^
: b, E4 z9 X* g! Z7 P9 G9 J所谓的unprivileged user
2 C$ q& {+ Q# E2 D- @! M
b# O+ E: i5 X! z$ ]4 ^# w- useradd -s /bin/false -r -M -d /nonexistent www
( J' W. ] z! N5 `3 t - #开始编译安装
# {" `" C, B8 f% P2 f- K
) L% ^( H9 l' E! \* W2 g- /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \4 o# M2 `( b- y z' w
- --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module* Z C6 g7 z5 i& `& H, D
- make, f3 r+ h5 J7 P% ?; X1 J' K% r
- make install
: ^. M% q: {1 g8 W8 @0 ?/ Y5 ] - #给文件夹授权
复制代码 % ?5 {1 G5 X" u. [6 ~, d
9 f; x, @9 x/ N( _, ochown -R www:www /usr/local/nginx0 W! f0 F8 G8 c. r
#修改配置文件
! y7 _5 S" _$ V( Pvim nginx.conf" D/ a, u- J( d2 g5 i
6 x7 r- i4 y8 f* D4 b) l
user www www;
2 P3 k, r# q- T9 @worker_processes 1;
! T# P1 }+ D; `; R" xerror_log logs/error.log;7 m% x% o r: n
pid logs/nginx.pid;
; \7 C# M M/ E3 C0 `: a+ P# Qworker_rlimit_nofile 65535;" e- A% i* S' [; Y
events {) P K1 u! C: p
use epoll;8 G M* _3 d- J" K( A" v5 {* S
worker_connections 65535;! U4 M9 g5 x% g; i$ X/ D" R
}, r8 H6 @( o2 |1 F! C& b, I
http {! k1 y0 C, Y a L
include mime.types;
; _! K1 ?4 `7 b0 i. H default_type application/octet-stream;' k3 s6 O2 E6 T4 K _8 n$ f- o
include /usr/local/nginx/conf/reverse-proxy.conf;
7 E$ f. N- P8 `) P7 u sendfile on;
* i1 l- l" \# P* N keepalive_timeout 65;9 f+ E# D3 w- f4 q, ]3 N6 V
gzip on;
+ m/ `9 c; G/ J- ~, D8 S: f3 j6 b client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
0 b) S( a+ C, X$ W client_body_buffer_size 256k;; E/ }% m! f: {" T
client_header_timeout 3m;, T. w/ g# m' M( A* Z, O2 u
client_body_timeout 3m;
& S$ r$ E+ H6 g* I- ` z) s' [; k# x send_timeout 3m;
$ K& a6 l1 w; U: A8 E proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
+ `1 ]; D! L& T( `4 D+ ~ proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)+ \ v) F! K( m
proxy_send_timeout 300s;
5 y( |( n( {* ^+ `, @1 l! Q A proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小" J+ U! ` I8 X1 t/ i- q
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
0 k' {5 J: {6 G proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)2 Q) `5 j" {5 {& a5 a7 W- y- k
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘8 z9 j- C' s! w( X3 J
proxy_ignore_client_abort on; #不允许代理端主动关闭连接
7 r0 i9 Z# c2 E- c1 g3 F- U( @ server { w% s3 Z2 S8 M! ~0 o
listen 80;! Z" _0 M1 M$ R% ^3 w( R
server_name localhost;
$ o) r5 e* E( u/ I location / {) k2 j( \/ B1 O
root html;+ i' W4 ]" p( Y( _2 ?
index index.html index.htm;
9 \5 X+ b) p. X6 u5 L1 ?2 b0 i4 g }
; P) C% }1 U! A" ?& n; {+ M* o# e error_page 500 502 503 504 /50x.html;8 T3 `% n1 ~* [8 ~! y
location = /50x.html {3 K) I R& w3 E9 c) @/ I
root html;! d& H2 { n+ S+ V- o# g( z- [
}
. U5 h& ~! [, O2 O$ N4 D( z }+ b! W3 I% G/ L9 i# z( r" \0 l
}: S9 M$ v9 F: S% K5 E: g- Z% x, y2 p
# W o- X; g D9 `) E. E编辑反向代理服务器配置文件:
' Z2 K b1 S3 U! i2 C8 K9 L6 Z( V6 a4 f4 c" w
vim /usr/local/nginx/conf/reverse-proxy.conf
' I% U; u% Z( U- ]/ Q7 C" I, k7 {' ^, L
server" ?; a1 L! v. Z- J9 ]7 E" }$ a. K7 d
{0 p, ~0 P( B1 F& r
listen 80;
' X" M) y7 ^# U. g* ~- o% { server_name xxx123.tk;
A* `' T7 `! g# o% W, h' o( W# Y location / {
, T2 J. v% G$ ?$ P% @ proxy_redirect off;
6 i6 z2 z$ M* ~ R+ b% ?& r. O- h proxy_set_header Host $host;$ a: D4 t z% N3 S9 c5 n
proxy_set_header X-Real-IP $remote_addr;
& o# v1 r% t3 P1 _- s9 B proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
3 I6 ~3 X% O6 f# B, N* m4 R proxy_pass http://192.168.10.38:3000;
2 C; L4 x. g; u9 y5 m0 n }' d( g5 U. D# I7 Z, v5 ~0 G$ {
access_log logs/xxx123.tk_access.log;7 {7 p4 y8 o9 ?/ h) q
}8 u1 x0 H/ k+ X
8 \3 q! j8 o, b/ I3 R, C: t
server
$ J# k- f# Q! ]2 U! Y8 E3 G4 K9 h{% T$ J, T0 J2 d& c6 W- U1 _$ U4 b
listen 80;
6 h8 b4 }0 [+ x0 p# v server_name xxx456.tk;" T q: ] S2 |5 U1 L) E* Y
location / {- Z6 r1 e7 N2 h7 k. k
proxy_redirect off;
; w1 a5 F: ~) w+ t proxy_set_header Host $host;& L( j' X3 u V6 I5 m" D: m
proxy_set_header X-Real-IP $remote_addr;
( z9 Y" T# Y! U+ @ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
; s6 e1 L' r8 P7 Z3 W, L! C7 A proxy_pass http://192.168.10.40:80;
: g$ f/ i! t4 q2 S }6 X3 J1 N- g& b7 F6 V
access_log logs/xxx456.tk_access.log;2 \# V8 C& W% V8 P x3 f* Z! t( N
}1 |8 }# n4 J _0 S# C: @
5 s+ B* w4 r# K5 ]& \然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。
, a6 |1 p3 R- g( i6 \& v" a
~ z- a8 ^7 Uupstream monitor_server {
. W- J0 P# {9 e$ @7 Z server 192.168.0.131:80;
9 E2 q3 D, e( N3 l. p4 e6 i server 192.168.0.132:80;. ?- C. v: J' k: W2 H$ S' t
}4 [( D' U6 k1 r- S' E: C
# k# l' `+ K6 I& y: @/ b7 o
server3 {; i: Y2 `1 _0 i4 z
{
/ ~6 ]2 ^, Q; c4 R listen 80;& U8 m! t- Z& a) u+ i% U* w
server_name nagios.xxx123.tk;
% e: y7 B3 ]4 D; t# G5 E4 ~, u location / {6 v2 _3 W8 g0 ^. m) Q3 ?
proxy_redirect off;3 ~5 ~' h: [* U1 G8 ~9 g9 ]# V
proxy_set_header Host $host;
( o; T5 P2 e" p0 O; x3 O3 V- Q d) d proxy_set_header X-Real-IP $remote_addr;% S" a$ s/ ]! h. N9 K3 p: U9 q/ F+ t: f
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; % B. a! P q8 p, a2 ^! @, g6 ?
proxy_pass http://monitor_server;# X, v& ?0 s# e) p' U# r' e" X
}
; D9 W% R* r! ^; B- J3 o+ g% D access_log logs/nagios.xxx123.tk_access.log;
Z" z t, N: `}
1 S6 F Q1 x( E+ o% S {# ?* Y7 O5 Z3 ?8 ]0 \7 g, L
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可: y' W* l/ l* s# [
8 R( L5 g$ ~( J- V
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
/ n3 E" I6 n: S'$status $body_bytes_sent "$http_referer" '
, O- A% G+ Y" q' M; g1 ?'"$http_user_agent" $HTTP_X_Forwarded_For';
, p$ ?" Q( {7 L$ T 8 R: Z- l/ L9 A7 J. {
access_log logs/access.log access;& {9 P4 I- |" w( ?/ t
9 U8 e* C5 O, p2 ^3 r: T) i再看看原来日志的格式长什么样:
/ C0 i2 n" N* J5 N" f& a8 n* T9 I
' m% A! o# z7 Z7 }5 |1 q/ B: K1
* H0 E. a, s& D+ o24 W0 e, n# Z: g
3/ e# f; |0 e' o8 I
4! U4 z( Z/ M0 U8 h9 Y
5' L$ r' A X. {6 `
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '* n. g, G. [. Z
# '$status $body_bytes_sent "$http_referer" '
1 ~8 G: }8 Q# M# '"$http_user_agent" "$http_x_forwarded_for"';+ q& R- o$ u& J G$ s
7 `5 F N7 c! ?' _' L#access_log logs/access.log main;8 {- [' M' _- ^1 u$ H# `( E
看出区别了吧 遇到的问题 之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
% O7 u: S$ ^0 E: ~! }0 A' Q. g! ] Y) u% B9 j8 g4 E
1
9 z$ }" z4 I& j7 W: |' F% c2
0 g2 {' J1 Z0 N/ M) p2 ^5 U4 i3
: E2 [$ t# T; P$ T7 Q4
" u% p, V% d( K- f' a* [' Q! H6 L5
" R, j2 @( a1 p! L6) d* q1 y' k( C8 C& J! `
7( `* i- W) _3 O, I! q
8
2 `9 `4 x5 o8 E3 @proxy_connect_timeout 300s;( {# x0 |6 }- b$ G
proxy_read_timeout 300s;+ }3 Q! a9 w8 n1 W
proxy_send_timeout 300s;) b, n5 H3 `/ a9 b& T+ h
proxy_buffer_size 64k;
5 [1 o) v) j: O" Q" L+ p3 h1 fproxy_buffers 4 32k;
9 P2 m. o0 P+ J3 P3 hproxy_busy_buffers_size 64k;' S( x% a8 Q* l1 O. f. v& S
proxy_temp_file_write_size 64k;# u! V4 V- a' H& S4 @0 s
proxy_ignore_client_abort on;9 z& H, B/ a' o6 i5 R1 m7 A2 Y
报错日志:# h+ k: s s8 d
) U s" E: R; H8 z) [6 _" j
...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。
3 w' U# S# ]1 _- \' I% w7 V# h- |% z
PS:关于域名转发
6 z0 j3 }7 k9 |& Y, t
& [& `6 w6 |- T( A/ W所谓域名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/ 的内容。
$ p$ e, j' n3 c1 @: x |
|