cncml手绘网
标题:
Nginx服务器作反向代理实现内部局域网的url转发配置
[打印本页]
作者:
admin
时间:
2020-2-25 04:54
标题:
Nginx服务器作反向代理实现内部局域网的url转发配置
情景 由于公司内网有多台服务器的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
+ Z0 L6 T" q9 N7 _
! J+ w. _' g, L K5 V
###更新仓库
F! {$ L/ ?" h5 I: H# t
$ { |1 y. f4 F9 z
apt-get update -y
8 o; h) ^) g& n) r, A6 F8 r, j
apt-get install wget -y
, U9 `* K* I0 A* m6 h% F
#下载nginx和相关软件包
复制代码
# i1 u. ?+ L0 u) b: S
9 W/ `0 s/ U) q; p6 v' A- ?3 A
pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
9 R8 l3 n q& z1 {. u! B( z, l0 ?
* A: L) i6 S8 c! W$ N
cd /usr/local/src
2 j* R- E. {5 @3 M
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>
! q+ w8 A7 u) e- } y& q
wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>
' A' F& x- B2 f: A, X& H
wget <a href="http://nginx.org/download/nginx-1.4.2.tar.gz">http://nginx.org/download/nginx-1.4.2.tar.gz</a>
/ X7 {9 [4 i0 A2 N }
tar xf pcre-8.33.tar.gz
) n& f- u7 Z) l; q
tar xf zlib-1.2.8.tar.gz
6 h5 N8 o) a" o7 \1 I0 o. G
#安装编译环境
6 |7 f% N' n1 m' o
复制代码
2 _0 g5 [5 P; }" ^5 M! Z
8 E( D% f* I5 O8 W! ~; _
apt-get install build-essential libtool -y
+ I9 B& I g3 B, \' K5 J9 @: f. y( P" @
#创建nginx用户
" J* J5 |6 u- I$ r0 S
9 N; E H3 Z+ p( g
所谓的unprivileged user
0 w G7 J2 e) p, v2 r2 ~
, W t# d* z6 [8 e: {6 f
useradd -s /bin/false -r -M -d /nonexistent www
" A/ |/ D# m# |" o+ n7 V
#开始编译安装
8 q7 v a, p R0 s
+ M- z5 _% s! T# n) T) V
/configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
( U1 B$ k/ i7 L
--with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
% I4 ~. F9 a3 }0 g5 j' B
make
7 G X" R i; e. r
make install
$ j) F( E5 @! O" T; ^9 D
#给文件夹授权
复制代码
# i. l8 G4 z8 T) {. [- E) N
]# I9 V3 x- e8 j& r1 w
chown -R www:www /usr/local/nginx
' q4 v* f( z; ]3 `
#修改配置文件
; C5 h M7 I4 q6 s
vim nginx.conf
. |) c" B3 r4 G+ R6 G
/ ]' n$ r" Y7 t7 Y8 E* a
user www www;
( m9 L) l4 \6 s. B! P
worker_processes 1;
8 a8 a! S9 A+ p+ t& K
error_log logs/error.log;
9 a$ d6 x+ ]/ U! |/ e
pid logs/nginx.pid;
4 l6 b- ]( v6 y6 J& z% g, B1 P. a
worker_rlimit_nofile 65535;
8 y& f* ~. S W& c/ B
events {
8 g# [" W+ u2 i- ^/ ?
use epoll;
5 p4 q. m/ z+ F" l' |5 ^8 P# _ F! o
worker_connections 65535;
' F% i6 u7 Y! z2 v. X
}
6 A+ B+ y* P3 t8 E+ F$ F* P
http {
/ R# d) P) E6 v8 F: o* U t
include mime.types;
. V) q: B! ~+ J% s: U
default_type application/octet-stream;
3 P( E5 @% x" m
include /usr/local/nginx/conf/reverse-proxy.conf;
- E, u+ b! y. A6 C7 |
sendfile on;
3 C# P+ X5 I8 U O3 r5 g5 e+ w( Y- l
keepalive_timeout 65;
b4 k. L, @ M& ^: ^
gzip on;
% \( |0 V% M: n: K7 o6 W; F' T
client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
/ H: Y& Q" X1 I9 g3 O; C% I N
client_body_buffer_size 256k;
( C4 _% U! k' U4 o
client_header_timeout 3m;
* \. ~& ^! c4 p& F
client_body_timeout 3m;
" D4 Z W8 a8 r" d @
send_timeout 3m;
7 x8 b8 f% J7 ~" j: s
proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
8 A& P% k3 R% d( t( A. e
proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
5 A6 p+ {1 S1 v6 [- g
proxy_send_timeout 300s;
. s- Q! Z& D' g: N2 {3 T H
proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
+ w1 p" a( e- f9 X, N6 Y ?
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
& x7 k2 k* r2 o+ q. p! r
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
3 [5 n4 K. L$ ?/ _: Q" z
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
R- [! A, v7 z4 {8 K2 p6 g
proxy_ignore_client_abort on; #不允许代理端主动关闭连接
( s4 G* i- v0 o: O" F; H7 p) z
server {
; R- l4 e& N; m$ b9 C
listen 80;
7 T% g( @& d1 [$ r
server_name localhost;
" `0 A7 \8 a( [
location / {
* v$ h; ?7 D1 W+ j8 g0 r1 p! } D* c( I2 e
root html;
$ [/ ~1 C- E$ L6 [1 r G2 L+ W4 ?
index index.html index.htm;
5 k s, ^; z2 u8 |6 ^2 h. H
}
* ^8 W( K# E# t# T- D
error_page 500 502 503 504 /50x.html;
4 r9 B, {) j" D* |/ L
location = /50x.html {
. N$ F& L+ e: S
root html;
4 \& n- \: U1 Q7 H5 L3 l; K' j, d
}
: n# t7 `8 o8 s8 B2 z
}
# a2 t8 Y2 M3 S! F8 L8 F8 S( l1 e
}
% f7 v$ ~2 z8 M
' P6 o6 A6 F+ B* p) c3 [ v0 k
编辑反向代理服务器配置文件:
$ v, O: R. ]' M5 _; d2 V
, i6 B% o) m& X0 x9 z' d) r$ G. T
vim /usr/local/nginx/conf/reverse-proxy.conf
. M* q( G3 L! r
9 E7 g1 L. `8 b. ^: R% d3 G: `- [' Y
server
3 c/ D* q. E+ \$ J0 b1 [' ]( ^
{
! ?8 O3 G) m( o
listen 80;
2 F& v! J% f3 W8 S5 `1 `
server_name xxx123.tk;
# O( S# `1 T5 e F' m! ^; g: P1 ~
location / {
# m" a0 M) r" l' L8 D1 b2 b0 g+ Y$ Y
proxy_redirect off;
# b0 z8 p) ~4 t; g& W: T1 {3 s
proxy_set_header Host $host;
1 ^0 N3 p7 E( d& a8 [7 ]! H8 \
proxy_set_header X-Real-IP $remote_addr;
/ c6 W# I( ^1 O0 J8 e# j g7 z3 ]) t# X
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
: A1 v# \) U& X- B' A. I) l6 Q V' V
proxy_pass
http://192.168.10.38:3000;
?: N6 [" t( a7 l
}
5 x+ B E7 z) h9 i. Y N7 G
access_log logs/xxx123.tk_access.log;
9 c' {! ?. m# F# k
}
/ Y& B. t9 M5 L
% E( Z* i3 Z& ^+ q8 s! f% [5 x
server
; }6 I1 c3 Y8 I [( q1 Z; t( |
{
/ [! h5 |4 q! O8 X' ]6 g/ ?$ J
listen 80;
6 K9 j4 V; `; \
server_name xxx456.tk;
* O3 ?" y% B2 w& O1 ^* L: J. R
location / {
' ]* j4 y: _& I
proxy_redirect off;
" ]5 p3 l5 g1 d( b0 o% q
proxy_set_header Host $host;
! b" j4 v' s m3 [
proxy_set_header X-Real-IP $remote_addr;
; w! j1 h# J0 K) k) r- G6 A8 S& c) F6 m
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
) B- h5 f+ B* j2 c+ v8 p! U4 {
proxy_pass
http://192.168.10.40:80;
1 S: S- j' ~! y
}
$ [( I5 o* Q( A1 L; O
access_log logs/xxx456.tk_access.log;
* F3 O- e$ [9 H: n; V0 }
}
0 E9 i2 g% b p! y9 M% c
) U. R0 t/ w7 I
然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。
( M. t8 G# G% o a0 o* s0 f
* r6 _, q4 c1 y1 s) {+ }
upstream monitor_server {
' A/ j, V- ^6 [0 X
server 192.168.0.131:80;
1 ]. Y6 T9 J/ R& q" _
server 192.168.0.132:80;
+ j1 f3 Z4 L/ h& e+ G
}
1 _, G d. _) G. u
! G6 i: s4 H' |) W# }* L. z
server
3 T7 p7 L2 r6 k0 @/ B
{
: `4 b( ?# }- a" U
listen 80;
4 O8 s" O, ]; O7 ]# \" H) l. L* @
server_name nagios.xxx123.tk;
8 ], _2 ~" G( Q1 Q
location / {
. G4 C4 {. j' u7 p
proxy_redirect off;
. W3 \8 x# ~: b9 A
proxy_set_header Host $host;
/ q4 T% I2 `! q5 N+ D6 a1 b S
proxy_set_header X-Real-IP $remote_addr;
x1 g# n$ `- d2 r
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
9 Q3 N. N; R. c2 v
proxy_pass http://monitor_server;
5 j8 Y& [( _, T _3 E3 T0 L4 a
}
9 |( z' m& e" m1 X' B4 Z
access_log logs/nagios.xxx123.tk_access.log;
0 ?$ Q, h" E& v1 u
}
% X8 p8 A4 c) N- R* ?
% S# p8 I3 h: o+ p
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
+ H2 ~9 G1 m" f3 B0 `, Y
& P2 G5 G# k9 \* s6 H* g
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
6 \! {- s$ U8 P& ]% Y
'$status $body_bytes_sent "$http_referer" '
. Z, m. d! D1 A" |. h
'"$http_user_agent" $HTTP_X_Forwarded_For';
! j7 H$ @0 M" O2 E* T1 q
9 X' ~ ~5 }. c
access_log logs/access.log access;
7 Y ?+ k. L' l, a8 h8 B" ~
) K4 _4 h' K! c, C$ K- _
再看看原来日志的格式长什么样:
0 p* J; C5 {( y2 x& U) V) x! L- d1 T
* f0 o0 O- c! d9 H3 r5 X5 u
1
1 N- U7 n( c/ u+ y4 E
2
3 {) z" [& r6 L
3
' _) `, X h1 y" w( j
4
, ^1 Z. v @1 W6 u1 D3 T& {6 E: Y
5
" \& P2 `2 `2 p, s1 H! e) N& O
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
; W, e1 f) d; U7 N, O( `
# '$status $body_bytes_sent "$http_referer" '
& t5 s9 D, E, Q1 g9 b0 v
# '"$http_user_agent" "$http_x_forwarded_for"';
! X; Z/ l) X _8 |% d
& o% d2 Q' }5 ^, R1 o1 e* O* C, S
#access_log logs/access.log main;
0 `2 u* `% k- {6 K+ h: D# Z
看出区别了吧 遇到的问题 之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
4 F9 n) |* o/ D. W
, S* b/ |/ C( s* W
1
" M$ T. g3 h! S8 A/ e9 X
2
; }) }& N8 A4 {' Z: T
3
/ Y& ~) J' ~1 {% g& q
4
( P( D6 ^2 i3 K* w, y0 X
5
& ~5 H& z0 Q: `$ v& W# P5 ]
6
$ ?1 F' Q4 U: g* ~ m
7
?/ k. W/ A6 m* G
8
5 e/ s, `& Y% d- G/ D& ?% {
proxy_connect_timeout 300s;
: y5 x0 ], ?( L% G% ]
proxy_read_timeout 300s;
1 x! h3 G; V! I6 `( ]
proxy_send_timeout 300s;
4 f9 r3 Q6 m" ]* A. s9 z
proxy_buffer_size 64k;
7 d" |9 }* G4 q! U) u
proxy_buffers 4 32k;
6 Q Z7 j' @8 |) c$ f/ c5 A
proxy_busy_buffers_size 64k;
, o- [6 \9 K9 D# e$ C# W0 e }
proxy_temp_file_write_size 64k;
+ E, R" Z: }' A! l6 g
proxy_ignore_client_abort on;
' ?/ `: [ v2 t0 @4 l
报错日志:
5 B$ u, v4 H; }0 m: F, C, H
" m2 d8 M& x1 x C( @0 S# F
...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。
9 y" z7 u7 W& N5 D4 o4 x
- r% K$ M ~: ^5 w8 u
PS:关于域名转发
. L( B: M& L9 n7 v3 N# D% L* y* r
; [5 t2 p+ L, y& _2 F/ 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/
的内容。
" O5 I w4 [: N# s. Y) x7 P( V
欢迎光临 cncml手绘网 (http://www.cncml.com/)
Powered by Discuz! X3.2