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
" F$ u( s6 k% n- \; {1 g6 M
3 ^- d$ c! i% ~- ]; N
###更新仓库
* x9 y I- u v) j3 r
" i& {& S9 _* Q! C2 G2 e" D4 X
apt-get update -y
$ D" t' ]% `7 v$ N
apt-get install wget -y
+ o) _5 w! J0 R- ^+ j
#下载nginx和相关软件包
复制代码
+ \( h8 M% v" u9 B6 H" I
, i0 ]+ T$ a* n* n: y7 g0 P5 s, p
pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
# c. Q8 _* D- l# U
' p9 M1 [: i" b- [4 Y' n/ C
cd /usr/local/src
. w) r& a- I( i- Y( B0 Y( F/ s& ^
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>
0 U) K+ [2 A% Z( k" V4 U
wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>
- d& j$ R6 L! ^: O! `1 i3 q3 N$ t
wget <a href="http://nginx.org/download/nginx-1.4.2.tar.gz">http://nginx.org/download/nginx-1.4.2.tar.gz</a>
8 D$ O1 _) q2 S, m) K0 P
tar xf pcre-8.33.tar.gz
! S5 Y1 c% w, y1 L: V
tar xf zlib-1.2.8.tar.gz
$ W4 R8 g6 g( z/ {" E7 [
#安装编译环境
' H( d1 ^2 x7 q5 e; f
复制代码
; `) t4 ]9 J7 C, h1 I" K' ?
" j4 z) T* y$ s$ s2 A- n
apt-get install build-essential libtool -y
# G9 g# W6 i$ Y" J/ T1 p! g
#创建nginx用户
, h( ~5 _; K& z1 i5 N
" g. Z) P1 ?. M/ X
所谓的unprivileged user
0 @8 Z2 x& F1 Z8 P
7 o$ ` V" r& q% i
useradd -s /bin/false -r -M -d /nonexistent www
4 H5 J3 Z9 {" C/ i
#开始编译安装
7 }0 I5 M' @" B: M- U; p
' O) z% M" {' f1 h' [
/configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
2 [1 U! h% a9 L* N6 S
--with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
9 H' H0 b: t7 Z2 {/ b' D) W; }# C$ m
make
% X, e+ d! E \9 u8 o
make install
5 Z7 `3 e* y5 I! d& x/ [
#给文件夹授权
复制代码
* R# i' n1 T5 d% j) N9 k- |* i) T9 `
) ]5 u+ B1 a; _) z! z: f
chown -R www:www /usr/local/nginx
6 w5 X' Q! M: z
#修改配置文件
/ }9 r6 @9 P% D D2 ?# Z
vim nginx.conf
# `1 d0 P0 m K- Z+ ^7 O/ c$ R5 _, P
4 a- [: h, s: `# M* b! o% f
user www www;
2 s4 f2 L8 Z+ a6 U. r9 s2 f( c3 h
worker_processes 1;
4 `" o; u+ [+ S: Q2 f& _
error_log logs/error.log;
8 ^" ~* m& m) J: d- X
pid logs/nginx.pid;
) e+ u) S- ? m9 H9 H* M* j
worker_rlimit_nofile 65535;
5 R$ [: h4 f$ Y+ c' U6 g$ i
events {
: s+ ?7 ^6 g2 T1 g# Y; M
use epoll;
& M# ?$ T5 ?1 w3 L1 x
worker_connections 65535;
% {" ^$ @- g* Q6 ~, d$ e9 h4 I. k
}
$ `, t$ Y( ]9 ^8 s9 {; Y8 i% U
http {
2 T. o x) E6 r* T
include mime.types;
" K9 I: ^1 x K& t! V/ W$ i
default_type application/octet-stream;
/ Z4 p. h, T5 K# I3 T. J- o
include /usr/local/nginx/conf/reverse-proxy.conf;
2 P; D3 N4 f0 x6 J4 T2 B. Y
sendfile on;
" k# ~, H' G |2 ]: ?
keepalive_timeout 65;
: Z8 s/ F! `( A, H
gzip on;
( ~( `$ v2 }. x8 X5 `5 @' O3 H4 l
client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
* |( x, ]- B$ t5 w6 h
client_body_buffer_size 256k;
" H3 w4 k( D& O: N, p
client_header_timeout 3m;
( F/ S, w: V, j" D
client_body_timeout 3m;
, c3 m# x/ q" A9 q0 m( s
send_timeout 3m;
4 p" }1 n! ^8 x" G# K" D, {
proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
' U4 K$ f. ~6 r7 U$ p1 n+ f2 Z
proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
5 |3 G; S. ?' ?; E9 Y$ P
proxy_send_timeout 300s;
l' Z, s. ]4 ? U% L4 k( O
proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
( ?$ U; _* g/ O, ^" P5 F" n# m
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
; r: t8 p2 c) f4 g7 l& ~% i8 w
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
7 O; @0 n, h/ ^
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
0 ^6 q) ?$ a9 R, K. X. z; q) s
proxy_ignore_client_abort on; #不允许代理端主动关闭连接
4 e. {; H9 A3 Z1 D7 x3 C
server {
2 i" v: b' V1 n
listen 80;
/ ]$ s9 e2 k4 d# G+ B5 J' _
server_name localhost;
' r+ t4 y4 P v6 [" `( R: @
location / {
, T, s* \9 z/ L% a% Z- g- ]/ n
root html;
3 u' N- S7 g- n, d4 o% r
index index.html index.htm;
9 R6 H" ]: x' x1 s
}
& l3 O A' ?( V4 q
error_page 500 502 503 504 /50x.html;
3 p- _9 E2 Z @# f- r8 o' Y
location = /50x.html {
. g. o/ ]* s/ g
root html;
, }5 H9 U0 ?5 I& e
}
1 b* p. j8 f0 _8 [% D7 @9 N8 Y U
}
3 [8 _) t h0 Y1 k' g* a
}
+ t2 y2 k0 I3 ?" N* s* J
8 j6 v! E5 y( T. { M$ r4 C
编辑反向代理服务器配置文件:
+ g& s. z6 ~, ?3 g& r
; |' q$ s `1 d6 e5 h
vim /usr/local/nginx/conf/reverse-proxy.conf
( C) H* A9 T0 K" n3 g8 z
- q) I ~3 [5 U# @4 {
server
9 V8 V5 ?, E6 p9 T9 y% [
{
$ X2 X& i" W6 Z/ h
listen 80;
, N$ O$ A- Q6 q' d
server_name xxx123.tk;
; @% \# _$ n8 ?1 {& [
location / {
5 \# p$ K* f( R1 m
proxy_redirect off;
, z9 l7 D f( w, ?! j! l
proxy_set_header Host $host;
4 E1 v ~/ Q) k- G4 P, i
proxy_set_header X-Real-IP $remote_addr;
" C* Q- f# G6 H
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
7 e) n' V4 D; R5 n8 q" g; Q
proxy_pass
http://192.168.10.38:3000;
! O, J- {2 S9 N2 I/ |
}
' s# I$ L4 ? k O3 X0 o- ^- t, R4 y
access_log logs/xxx123.tk_access.log;
$ E& \# R( _9 B" S B
}
* C5 i2 V, j! S
: E2 W8 t# h; O: J" W# A. ^
server
8 ]$ |7 a8 A- ]# ~( u d% Z8 q) K$ J
{
: [8 }6 o' b" [6 S
listen 80;
6 d6 X U( e! P
server_name xxx456.tk;
% {. x. p1 Y2 _/ U7 A
location / {
4 B {: ]- V- O5 s# w$ A' |+ `
proxy_redirect off;
8 I4 c* d' O" V% \1 y( U o
proxy_set_header Host $host;
# a# f( _# c+ ~
proxy_set_header X-Real-IP $remote_addr;
/ W$ i3 U9 L. w5 s
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
% K9 c# R& _+ H0 e; _" L) C$ i
proxy_pass
http://192.168.10.40:80;
* |# J8 F l3 f/ `9 J4 Z
}
) t: Y9 Q5 K; M: o
access_log logs/xxx456.tk_access.log;
) e4 a8 z2 I( _5 Q4 h
}
9 s" p* V7 W6 Y& ~/ K, {+ b
& O1 P/ @& b9 c4 v% q- Z
然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。
, |# O! k( b$ S+ x" O
' j5 n) n* p: q6 m H X$ g' h% x, l
upstream monitor_server {
- l% c6 Q5 l& [& R( J
server 192.168.0.131:80;
0 G" D& D, M' n* B) i6 ?. Z5 R
server 192.168.0.132:80;
8 @3 F* j' F) f! O7 a' \
}
% ]5 n$ Q; N- O4 c% [: E% @
]. D& v* e0 f' Y( J. C5 g
server
6 C( W- B: N2 d2 n9 o4 C& F, E* a
{
& j7 o3 m! b6 W8 E( [# s Q
listen 80;
* J) T9 @9 ?) `) h# b8 w
server_name nagios.xxx123.tk;
" `, \* {( B0 s9 y5 }
location / {
9 `9 s3 e, d. r- c/ l- }
proxy_redirect off;
( p, D* k: H9 U. B* B7 ^0 P: u
proxy_set_header Host $host;
3 h, S( J c, t+ K* L1 _1 U1 D4 o5 c6 J; o
proxy_set_header X-Real-IP $remote_addr;
/ |4 D6 j8 q# x% s% H& O: E. m* E
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
4 N7 D: X' ~) I" I; L& }
proxy_pass http://monitor_server;
2 |( t0 l3 ?) M$ \' l( ^
}
$ G; N0 X; S2 O; c/ k
access_log logs/nagios.xxx123.tk_access.log;
/ f; ?9 ^) l+ r+ E0 p N" v
}
; U- |# X9 Y% a2 Y+ {3 C( N
- Y# D5 o1 P2 Q* x2 H0 a) W9 K
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
1 u2 A p5 K9 D, ]
* `) X- A9 z# w% k. [2 c2 o' e5 Q
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
j+ G2 Z* j' P0 |
'$status $body_bytes_sent "$http_referer" '
. |) r' {7 X; s/ O
'"$http_user_agent" $HTTP_X_Forwarded_For';
! @( T9 ~' d4 V, C0 J
- q2 V/ J: g: n& b7 K2 b# _2 ?3 Y
access_log logs/access.log access;
: i F5 ?/ I8 R1 K- O# ]+ X
8 q3 ^8 u0 M/ Y% @. {; V4 T3 |3 w
再看看原来日志的格式长什么样:
) w4 n. k4 v, T u J
! a, O3 a# l$ K7 v" Q3 C2 D
1
7 O( I, M" C; i- c$ X+ p
2
# I* G) E0 |( n; {6 I0 j7 e( X$ n( I
3
1 a& t# e- T* m
4
3 U& R0 c, K8 U, ~8 F
5
3 S( F% `! g5 u% u) ^
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
) o( E/ l: I) W0 I
# '$status $body_bytes_sent "$http_referer" '
5 o/ j P/ ~6 _8 @2 H
# '"$http_user_agent" "$http_x_forwarded_for"';
" P" D4 G6 a3 X2 p4 n. ^; x
1 Z; H) b$ \& D. ^; ?# g+ L
#access_log logs/access.log main;
7 v9 G0 a6 m7 y: z
看出区别了吧 遇到的问题 之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
/ I3 r5 K0 e3 n- `
5 ?: t( U7 ~+ Y7 i# {( C
1
8 V+ U, \+ ?, X t1 C9 m1 Q0 I
2
% Q/ a" Y0 @0 O" D
3
3 w7 I1 K! a. G
4
( l9 b$ j0 U; R" g
5
% _3 H q& s/ @' t4 \
6
9 N+ X$ @: y. x" s
7
! I% H( c) |. X t' o% G. e
8
! r% X7 \0 J6 P$ q, @
proxy_connect_timeout 300s;
8 U# H$ E) C/ |5 o' i+ B3 L% ?
proxy_read_timeout 300s;
/ A' L' a. r. h8 q0 A
proxy_send_timeout 300s;
7 e1 h4 {" N9 {6 T
proxy_buffer_size 64k;
3 p n3 h1 C, O3 U# H
proxy_buffers 4 32k;
* E! i7 u$ c( }# N' {6 C
proxy_busy_buffers_size 64k;
7 Z& B4 I3 P0 y, o# n
proxy_temp_file_write_size 64k;
8 Q# A* W. j* f i* W
proxy_ignore_client_abort on;
/ ]# l+ u6 m/ J8 L
报错日志:
# F0 V8 X2 i8 e. E$ @' w
$ r5 Y. j+ z3 O7 ?+ q6 J3 F" P
...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。
7 _& | X G ^. a
[" G1 r2 ]6 m6 a
PS:关于域名转发
( d* w) B; Z5 Z7 ~, I6 ?$ J( Q1 x3 O
, s& V( A. J ^1 W- G. y
所谓域名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/
的内容。
( {* G8 _3 F8 p
欢迎光临 cncml手绘网 (http://cncml.com/)
Powered by Discuz! X3.2