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
( G4 Z! U# N+ F5 I
) c( V5 n j- K) t! n5 B8 p8 [$ _
###更新仓库
' u& X% O) Y3 B! p2 v
' I8 j C# u9 }$ w: B c( ]' O7 r
apt-get update -y
1 E2 k7 |' A1 X
apt-get install wget -y
+ p+ _! G8 R8 x% P4 {1 s6 X
#下载nginx和相关软件包
复制代码
8 [: V' @5 Z0 ]! _: e
' @7 L+ V2 S8 E, u' h
pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
5 R' p/ b. Q+ `9 m8 c
6 A4 ]: _( U# V3 W, I
cd /usr/local/src
5 v$ L8 S" ?2 p0 T+ o" I, ?/ Y
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>
# o2 ]3 U8 y3 p% L; e" y% p
wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>
; o9 r2 e, U0 ]) @" u2 N
wget <a href="http://nginx.org/download/nginx-1.4.2.tar.gz">http://nginx.org/download/nginx-1.4.2.tar.gz</a>
: B5 }2 x6 ?7 ?0 o7 h- [/ _! O
tar xf pcre-8.33.tar.gz
: ^. m5 D1 r1 V1 {: \0 {
tar xf zlib-1.2.8.tar.gz
/ T6 a% ^9 B" {6 g% W+ B
#安装编译环境
: x3 S) e; I0 V. {" G" r* d0 V% p' X
复制代码
$ w, R5 P# p R& i4 k
+ T& E# {" d7 A" }! G) F
apt-get install build-essential libtool -y
2 m; J: H4 Q, M
#创建nginx用户
, C% M! @: _: A0 d+ P% x% q
* A% H# T* T: u9 k; ]8 Y) @
所谓的unprivileged user
: ]4 O4 n1 ^- S3 u) N7 M
2 D2 X- z- U$ E( @, s7 s
useradd -s /bin/false -r -M -d /nonexistent www
+ @; A" V% s( r; M
#开始编译安装
y& \" Y/ X1 M3 [0 w
' q( c+ J% D1 T2 E$ |- |; |
/configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
n4 a/ H3 M4 E* r0 e0 ~
--with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
( ]( F7 m4 {+ e2 W; P
make
6 }- @4 m) N q7 }' h
make install
2 _8 G$ q: I, P
#给文件夹授权
复制代码
1 x$ g; }1 k8 _( c
' ^" U. D# j) g' F
chown -R www:www /usr/local/nginx
& Y1 s+ }; V6 Y l; W
#修改配置文件
3 N# ^4 x0 u7 R1 D
vim nginx.conf
' h( M" Y7 K/ v5 g1 v
2 E4 t! T( N; N% K) J5 _
user www www;
) j& f; v5 C" t$ Z! i3 e
worker_processes 1;
0 Z; q7 x0 p+ r2 |. L
error_log logs/error.log;
" P7 E8 [; m$ g* X
pid logs/nginx.pid;
$ e8 W8 [) \7 q: |: C# k3 a, ^
worker_rlimit_nofile 65535;
) |9 [4 L t3 z' R3 d" }0 U; H
events {
, m- \% K! N5 R2 K5 U1 X1 i
use epoll;
: J/ w. Y5 g* X7 w) n
worker_connections 65535;
- X$ t/ ^7 q! k( m5 R; u! a
}
6 _& y$ D9 T |7 F
http {
- d8 U2 d. E$ p. L1 x0 F
include mime.types;
$ E- n5 n( \* c6 b7 o
default_type application/octet-stream;
1 Q/ ^7 V6 d; p! C% t5 N2 g
include /usr/local/nginx/conf/reverse-proxy.conf;
* l) S2 a* u. P6 j
sendfile on;
6 h+ u/ t: {% k+ I9 p3 e
keepalive_timeout 65;
+ V* B" z! h0 f6 Z$ E, V- N/ a7 ^+ U% d
gzip on;
, R% ?8 C1 j! m8 J" s; R0 V8 t
client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
% U7 _% y5 C- q: g
client_body_buffer_size 256k;
+ v3 h! ~/ N0 j
client_header_timeout 3m;
( ?1 b# C6 p$ y
client_body_timeout 3m;
0 _4 d9 }4 v% O, u1 m6 r0 E
send_timeout 3m;
" O2 i* J7 U8 O: H3 b
proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
1 ^5 ^, D {3 y& H1 C# R D- V
proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
! a' S8 _/ [- ]: Y, S$ g
proxy_send_timeout 300s;
" H t* H. G7 J
proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
7 E7 t, x* W% F3 ^
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
4 ?. q" N4 L1 z* S/ r
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
* r) w6 l1 k5 [/ J$ c# `2 n; E+ |
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
0 B, O7 p# ^, o5 `8 D+ p8 e3 h2 g
proxy_ignore_client_abort on; #不允许代理端主动关闭连接
( e. T; a# f3 @1 }+ ?0 h# v
server {
8 d6 }1 K, {1 @7 V9 l4 q" ?6 p
listen 80;
1 B' k/ G8 j; l, i) W8 i/ f
server_name localhost;
$ i2 z! Q& u$ f
location / {
& i. [9 A, e. H( G: g
root html;
( [: B, A3 g& u9 k' p+ G& _0 G* c" V/ P
index index.html index.htm;
: |1 Z6 B1 l" K' w9 Y2 X
}
" y p( O. ]: C
error_page 500 502 503 504 /50x.html;
7 `0 c2 J+ t5 p+ Z' [
location = /50x.html {
3 K. M C- X- R# h) g5 B# t
root html;
% u. Q8 `% ?! a; e6 {7 f
}
3 w. W/ a1 D$ Q, q; P% T
}
: J0 v5 F- k1 N4 A+ C
}
d E2 s9 I& k% e' w& f0 E
2 c& r8 M7 M) j6 z1 n
编辑反向代理服务器配置文件:
3 B6 D- y, V5 \. A+ w
; D4 l- _8 K/ j: Y. a2 F
vim /usr/local/nginx/conf/reverse-proxy.conf
/ K, \6 h7 f3 w5 P& s/ q) W8 |( c
M* d3 V7 |7 B) J/ \, r
server
8 J* d& C$ i# y1 [4 g
{
- s. H8 p* x7 e1 ^, Z
listen 80;
: Z; v( J- o- G d7 h
server_name xxx123.tk;
0 s( {% ?6 Q/ X [) e
location / {
) {3 i T/ F0 l5 Y2 }0 `: _( A6 L
proxy_redirect off;
9 |2 p" ^" A8 x" N: t
proxy_set_header Host $host;
u" \# \' T. E4 L8 E# Z% I* f
proxy_set_header X-Real-IP $remote_addr;
# ]* y1 g y: x. c, R
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
/ L- q7 Z2 B/ B( ?2 d) c
proxy_pass
http://192.168.10.38:3000;
6 K/ C: `1 R7 U' g. e. s ]
}
0 n6 Z6 s% P) g$ F5 s, P5 n
access_log logs/xxx123.tk_access.log;
1 l$ Q% n0 |* E( C
}
) ^6 x& m t: E4 s) d
& R ^2 x3 z, V7 F+ ^, h4 \$ J
server
4 O8 l) N* c. K" B5 Z( d
{
7 H+ x* K# O) a v( i
listen 80;
W, f n8 G# ^
server_name xxx456.tk;
1 I: r2 _) E; `8 T, `7 [
location / {
; b" u9 G$ ]1 t X( @8 A1 o- h
proxy_redirect off;
0 E! r! V0 {* q- V
proxy_set_header Host $host;
% e9 d' @# H Y( j5 j
proxy_set_header X-Real-IP $remote_addr;
' d/ V3 o" R8 q \% B
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
1 B( L- l: h3 B. \$ J% E
proxy_pass
http://192.168.10.40:80;
# C W1 P1 N! h2 K4 c0 w
}
: s- g5 b* d @8 W0 M: g' Y
access_log logs/xxx456.tk_access.log;
" m) u, z; }( ^' ~! W7 l1 {
}
8 g6 j" `7 v3 V0 c0 _6 K
% K0 {/ J3 P) ]3 R; j# I) c
然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。
' ~0 P! L1 i$ c* H
" G4 H* p9 t7 i8 p6 P( C: [! m( v R) ~
upstream monitor_server {
# s" Y$ O' |* k. s8 P
server 192.168.0.131:80;
: u+ G% M1 I7 `9 v3 m; L
server 192.168.0.132:80;
7 W& n9 P- ^% ~* l; P3 K3 E
}
0 y2 w9 U; w4 }# l& V7 U) }3 Z4 ~
9 |9 F& k _ T, B$ c2 T
server
0 J& E( R7 F9 M( C5 ?; E4 c }) u) u
{
5 g f8 l- C& q* `& F( O. W: E6 G- t
listen 80;
9 n$ I; [/ X: I
server_name nagios.xxx123.tk;
! N. W- D) E+ |1 M# p9 a1 ?- ]
location / {
9 q. q. m7 [5 I
proxy_redirect off;
8 y4 }* ?7 n. T2 I6 e
proxy_set_header Host $host;
( D, ~# }& B* [9 l# X
proxy_set_header X-Real-IP $remote_addr;
( h& q0 m% S+ I$ i! j& F
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
, I, A3 C' ?( o0 y
proxy_pass http://monitor_server;
* u @6 X) a# }; @- c
}
+ Q. L2 D0 S* @( U/ ?, X
access_log logs/nagios.xxx123.tk_access.log;
' I/ }4 d1 l) |+ ]' U; Z: Y+ V0 B+ F
}
& c- u' q+ @5 {& `! _$ c
& _/ _0 w0 H+ Z5 M& L. c) e( _/ c
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
4 n6 V$ X6 p9 g) O: J$ X1 g7 ]/ N
1 [ f- o& h' M
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
7 H0 k8 `; N: }
'$status $body_bytes_sent "$http_referer" '
w; V0 S) P. N) \
'"$http_user_agent" $HTTP_X_Forwarded_For';
% e* n4 Z) w& t$ P5 ^' w3 V: \
- g. N6 [" [ H7 V
access_log logs/access.log access;
6 M! x" d1 r- b* n# k
3 i* u- w3 a( Z7 A! i& m5 f
再看看原来日志的格式长什么样:
- g: s+ j- n) a5 g N4 y
0 r% O7 n% G6 r
1
( ~+ E$ A' ~* A* V2 K- @) t! [
2
/ n1 F8 s& o% [
3
! |' A0 L$ v" l& ~+ {' U. u* ]
4
5 W% D* P! ?6 i! p! ?
5
0 P- B4 ] U, ^6 y6 b, j7 v
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
" T5 T9 p+ h; b% e3 m
# '$status $body_bytes_sent "$http_referer" '
9 o" E' g: F2 W$ p0 B2 T# Z
# '"$http_user_agent" "$http_x_forwarded_for"';
' b" G. \8 h9 ]6 y& G8 O
3 k% f+ \ g% c; ~
#access_log logs/access.log main;
8 }5 R$ G/ v$ s' i8 j* E
看出区别了吧 遇到的问题 之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
+ D& K0 m" d: j/ |* L
2 ?5 V* E7 m7 Q* P# K
1
, q0 r, w+ A* j9 ~
2
( p+ z( I7 ~. @) d1 m
3
" {7 M" x% J6 D5 O9 W
4
8 i- Q" S" a$ I( r
5
( \/ }7 A3 [3 f9 r5 f+ X W7 r
6
- @2 |! o, o, \6 f" K5 b
7
+ y7 ]; Y) J' e
8
1 a0 }3 t* g+ l T# `
proxy_connect_timeout 300s;
, C+ S! H- ?* L+ L U0 I Q3 v8 B. m0 n
proxy_read_timeout 300s;
( c. E" k3 s5 |9 a7 ]1 o* Z/ R q
proxy_send_timeout 300s;
5 F- q% D! I' x+ E9 O1 f: W
proxy_buffer_size 64k;
: ~: j: M4 k) a7 G
proxy_buffers 4 32k;
7 _; H9 T0 R* B! S4 @, N" [
proxy_busy_buffers_size 64k;
/ R2 b5 |2 F! j1 v: q$ V9 x
proxy_temp_file_write_size 64k;
; ^+ P7 D; g5 I
proxy_ignore_client_abort on;
, f- M: ^. C1 y4 w
报错日志:
t" c3 {4 k9 ~0 S# W; \# f
4 Q$ l4 }. Q( e, B
...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。
* s/ M# T2 W- c6 K
2 ?; X6 u9 a& Y; B
PS:关于域名转发
8 `( g1 ?: Z0 y3 c
0 ^" F4 T2 V1 |/ a( b
所谓域名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/
的内容。
: b3 ^5 b! C7 b" z
欢迎光临 cncml手绘网 (http://www.cncml.com/)
Powered by Discuz! X3.2