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
, {' a7 Q! P" a8 M; H- H
( w1 Y9 l8 m* J3 \4 |( v
###更新仓库
( U$ ]0 i+ f" A+ b! Y8 H! u' k G* A8 b
$ |8 K! b% a+ A- r; ~% W0 o5 e
apt-get update -y
6 I) \5 j: R" ^- l
apt-get install wget -y
7 \& A; n7 c \8 D+ N
#下载nginx和相关软件包
复制代码
7 A- u! `+ V, J0 c( L
$ u# f0 F S/ j& G# k
pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
6 A! d/ ]# e% _2 F0 l
4 }* e9 r0 S9 W
cd /usr/local/src
- g* c4 U# c9 l
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>
) C4 v' b/ _ y8 c9 N& x
wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>
$ a3 H" C; ^' j; X! a. U
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' ^0 L5 s7 ~+ J' C( N3 B
tar xf pcre-8.33.tar.gz
1 I9 W, b& I ^0 d E
tar xf zlib-1.2.8.tar.gz
- R- G) K4 m1 Z1 {' d% u; B
#安装编译环境
4 w( h" j4 \, _* o4 U0 I
复制代码
0 H- Z6 d6 V' y6 W. x) U
9 E& l4 I" y9 Y: S% y, U9 V
apt-get install build-essential libtool -y
' L) x# _( M7 a2 ]+ ^3 ]% U9 C* v
#创建nginx用户
% y+ _3 \" s% H! u
, {' D6 U$ |/ k, |9 e$ ]
所谓的unprivileged user
6 p0 h5 a7 K+ \4 X% x1 l+ i/ |. B
' |! L6 e k1 H5 Q; \# L& v5 ~
useradd -s /bin/false -r -M -d /nonexistent www
% e. ]* T3 B/ ~/ q
#开始编译安装
9 @8 Z" x% w1 F* F ^' _
5 O; v9 X9 b$ |' ?# E8 K
/configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
8 z1 Y* z' f# s5 p
--with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
. Q& E1 M$ \' _
make
) l5 t. h2 u& b
make install
+ N* f- ?# P: z( w; X
#给文件夹授权
复制代码
( j+ \* D6 Z! Q% r0 y" t1 A
; r; \) ]+ V9 L: ^9 Q3 B i
chown -R www:www /usr/local/nginx
1 [& j' o" F# c1 l
#修改配置文件
; _ B+ I: z( ?" {4 G H# F
vim nginx.conf
; v# P5 U+ C: x/ Q% C# l
* B! z7 T# b* r E/ j# T
user www www;
" K1 j' o0 r. n( X2 Y. K' z
worker_processes 1;
# o; I7 f( f8 r
error_log logs/error.log;
! t4 }; h" S- A3 L
pid logs/nginx.pid;
V7 T3 B* S# m2 o0 i% ]
worker_rlimit_nofile 65535;
: y1 h. }5 F8 u4 b6 p5 }
events {
( e0 q: A. c4 l( n0 i
use epoll;
: S! M* _$ \5 l3 y
worker_connections 65535;
8 z. T& R. ?- Z& l6 j9 f) K3 Q9 W
}
# W! r3 Y5 g% L0 e U
http {
5 m+ f ^) U0 F; }8 l
include mime.types;
/ t$ M. x a4 ~
default_type application/octet-stream;
1 @0 {4 ~% y" T# I
include /usr/local/nginx/conf/reverse-proxy.conf;
. k; u- A& U! b
sendfile on;
: w/ g& o" H J4 d
keepalive_timeout 65;
! ?' e" ^& Y* U S* N! \
gzip on;
5 f) J. L7 S, D' Z+ [9 z5 d* K- E
client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
3 B3 [$ J6 X& q' X0 I0 a1 {
client_body_buffer_size 256k;
0 l9 n5 I6 g0 F4 d$ m h
client_header_timeout 3m;
0 {. Z# F- _+ L- x% X% _
client_body_timeout 3m;
' s8 H9 w U {4 l: ]
send_timeout 3m;
; a% `) S' s! ?0 A8 y/ x, W
proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
+ i# Y: w ~7 v; H* }" C" i, n+ a7 e' n
proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
& V$ s/ S4 H T& [
proxy_send_timeout 300s;
) t0 I, M; Q* D6 m+ w
proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
) q2 F$ O2 t, R
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
/ o6 G) y& O W
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
( w8 @+ e: C4 ~" i
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
3 }/ o {% u1 ]) ]2 \
proxy_ignore_client_abort on; #不允许代理端主动关闭连接
# P! s e* k- B( O: }
server {
+ { N) r1 } D) ~2 R* @' }8 i
listen 80;
, @ G- ^( G5 @& i- a
server_name localhost;
' E% }7 o4 i" S: F! p R
location / {
' F3 G( J$ x4 I( D+ q, c U
root html;
' ` U$ ]! ?4 u' w. T
index index.html index.htm;
1 c& U: M( ], M, _( g) R
}
3 j' _' ~% O2 f- t+ x4 x+ J
error_page 500 502 503 504 /50x.html;
8 E1 B- ~/ o! a: n/ o
location = /50x.html {
0 {. k& a A! J4 ^( C8 Y( R+ [
root html;
( a( g6 q' M; V0 n5 D2 i
}
# f7 C& d" z {6 u
}
6 x0 G& K" e$ b( E: S# t3 e9 J
}
0 C) z" L8 Z3 G0 S# @: f
& p+ m* ^9 C! E. @
编辑反向代理服务器配置文件:
# n4 u1 H, s1 _
" D+ T& ]2 ~! v" ^8 g
vim /usr/local/nginx/conf/reverse-proxy.conf
: g8 R, J3 ?) X* k
* `7 M/ a( Y' [5 ^; w, y
server
* p! p1 Z1 u% b C/ I
{
7 w E( Q+ [: }, w: M
listen 80;
! ]+ j) _! E. J2 E0 P
server_name xxx123.tk;
2 F5 e& l; z% |# Y
location / {
! e" J( H; i- o! W2 C
proxy_redirect off;
2 S% H, |- u p; N7 B; o
proxy_set_header Host $host;
$ }. Z6 B |6 X. z; Q( z2 q
proxy_set_header X-Real-IP $remote_addr;
' P; D4 t" d! B% M' I8 [2 @
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
, b. {' n0 Q7 P: f" z N( t
proxy_pass
http://192.168.10.38:3000;
* @7 Q, l' y d% b
}
# |( w H# E; `( t) L, `
access_log logs/xxx123.tk_access.log;
: V; F/ O5 h. V v
}
2 T8 n4 l7 b, L* s5 }3 F& L
% R: H; `- ?% T" ~
server
. K; z! w2 s% A
{
7 k. f) c7 N4 k, k, N, N
listen 80;
1 q0 m5 D, b; W
server_name xxx456.tk;
! Y" ^, p6 R" `; O7 t
location / {
! V- @; }/ A0 t) _1 W
proxy_redirect off;
* e- W; C) a& r3 ~+ B7 I' D; q
proxy_set_header Host $host;
8 N0 w5 z. y1 y, h
proxy_set_header X-Real-IP $remote_addr;
; a5 |! K6 v8 x7 p/ k- T
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
; F2 q r& R7 i7 m/ P# b4 F# [: V
proxy_pass
http://192.168.10.40:80;
6 S* K0 ]+ n# S/ A' O
}
6 I0 Z. P n' m. _6 w
access_log logs/xxx456.tk_access.log;
* {- t/ @) w4 P. C5 w
}
3 H& R( l( D* Z" ~
. |1 n- S9 r, D0 u$ ~
然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。
4 g) I; H6 ?% [+ }
$ `3 v- ^4 x# E# ?! N
upstream monitor_server {
! C+ I+ {+ v+ }0 C
server 192.168.0.131:80;
8 U. b$ w( U. P& a/ n, Y& ~
server 192.168.0.132:80;
% |2 G! _4 B" {5 S' }: z
}
' X% ?( [) D2 p7 T
$ M! X/ T* y- U; i' ^6 h
server
) U/ _& a7 I Z8 W" w* z
{
: ?% Q @; H- i8 I9 E
listen 80;
( k: @5 s, m3 O) P/ K( M1 V& ]( c
server_name nagios.xxx123.tk;
6 r9 k" e, E1 ` [: O7 |# f" z
location / {
9 B# G. c/ l5 h; `# D+ S
proxy_redirect off;
0 x! ], g/ S4 ]1 U/ m9 D% Q" f" h
proxy_set_header Host $host;
/ L2 K) \) i9 x; c2 }
proxy_set_header X-Real-IP $remote_addr;
5 ?2 ?. b, Y6 V- S/ ~8 R) J
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
W a0 p" f# N: z: K$ i' S
proxy_pass http://monitor_server;
' h+ t+ ]' T8 C
}
2 a" m: \- |6 ~% J
access_log logs/nagios.xxx123.tk_access.log;
% M9 Y+ g. D) \$ `3 D
}
0 |0 q$ E5 N. ~6 P
9 T5 d7 f1 }7 z: J% j+ }$ |- K
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
) z8 \+ Q. f1 L6 ?
5 [3 Z- n8 W/ u: z' j& c
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
( I8 u1 z, d [
'$status $body_bytes_sent "$http_referer" '
& ^0 A4 g/ _! x# ^7 p* z
'"$http_user_agent" $HTTP_X_Forwarded_For';
3 d9 m+ r& B% d, [2 }+ C
) J" y1 d: u6 k& h
access_log logs/access.log access;
& Z" S9 m I. |; ?8 i
- [5 I4 D. t. \- C# H9 i! {. V
再看看原来日志的格式长什么样:
# V$ v8 U! e ^3 W' `, d# H
) R! W `. X m& V7 ~1 P: c* S
1
: d9 R( f) i# u0 @! Z
2
9 v% a5 ?. | a0 X' s8 A
3
1 [* w8 m4 W2 @+ i C% Z% {
4
! _. s |4 |/ w- r6 B
5
/ b( W3 @7 _' N! l" R# N& a: E. {7 {
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
B: v1 K" R Y- b% P
# '$status $body_bytes_sent "$http_referer" '
! L8 B' z k: v4 H" x$ |7 B
# '"$http_user_agent" "$http_x_forwarded_for"';
$ l' `7 n$ A. A \4 `
( @) R+ ^ J0 E( O
#access_log logs/access.log main;
0 n. Z2 @' t+ q( C
看出区别了吧 遇到的问题 之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
" w4 U' Q, @ K+ Y. s: Y
5 A+ [- m2 z4 K: n0 c- b
1
" ]& k% T+ \* F/ S# g8 K
2
9 ^: K, T5 ]# I, X% U( T+ t5 ~% i( Z
3
' [. d# d @/ N' B
4
( M7 k! [& U% _% P
5
6 G6 ]2 c# i( w" x& o6 R$ U
6
8 ]. d$ A, R8 Q6 X& Z
7
! h4 x& n8 Q! a# Z# x: l
8
" Q& n H: W* ~/ l
proxy_connect_timeout 300s;
: @6 Z+ l& ]) X9 E% ?! Y
proxy_read_timeout 300s;
6 c7 { R8 f7 ]4 S" t& r/ {4 b
proxy_send_timeout 300s;
' n5 [3 M/ d! w8 J$ |0 n
proxy_buffer_size 64k;
2 R X. b; |+ f
proxy_buffers 4 32k;
, l& z* z+ E# D6 x# ^
proxy_busy_buffers_size 64k;
, {8 ^7 I0 w& B& Q9 _% P0 G9 {
proxy_temp_file_write_size 64k;
4 x% U5 z0 g' v4 A+ N
proxy_ignore_client_abort on;
+ h- L: |) H8 ]: f% j) c
报错日志:
& E/ P0 b; U- J$ H% K5 n. \
! w& S, h0 a8 l: ~, H& a+ m$ [
...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。
- N# [" n; \! k& V5 Z& V( ~
$ D! Q6 p4 m6 G3 j3 d
PS:关于域名转发
) E- s3 o' C( O( V. v N8 t
6 @4 q5 Q2 y+ L; Z
所谓域名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/
的内容。
% H- ^+ ~8 x2 Y8 B
欢迎光临 cncml手绘网 (http://www.cncml.com/)
Powered by Discuz! X3.2