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
- m7 F* k1 w- d* d, c+ n4 q
) H8 [8 z9 H: F: k! {
###更新仓库
5 k: L# i4 d* Y9 A/ D' f; {: x
: x/ v6 E. i. L
apt-get update -y
* v: m" |+ N. B1 s X
apt-get install wget -y
' C* W4 R# K8 V M6 a. ^& S& a& G' U
#下载nginx和相关软件包
复制代码
0 Y Z2 L5 Y9 P5 |
0 |! Z Y" R' @
pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
# h% x3 k) d4 M; O
6 t) e) Z8 K* ^3 ^! E
cd /usr/local/src
% @. V- C" N( J# t. a; T4 O! `
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>
! a9 P- ~* U |" o: G2 i+ t8 F7 x
wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>
4 v0 D; x& `% U: x& D
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& v8 S8 c- ^
tar xf pcre-8.33.tar.gz
" g, i; l2 L5 v2 @' [: @% N5 E
tar xf zlib-1.2.8.tar.gz
5 |! }* N( F$ m9 L. }$ _4 ^; U- {
#安装编译环境
- r9 k: R; `( i0 X9 P% v5 ^
复制代码
0 U. E F! f6 G% h
4 z" K @! k' Z9 c2 D
apt-get install build-essential libtool -y
. G& b4 w, B- F1 K2 ~% t' u
#创建nginx用户
2 C* O7 F6 w' {' Q) R$ X* c
+ C2 J4 ]+ ~8 x" ?) q
所谓的unprivileged user
i! J$ }' Q# q* M
& ]5 \9 y0 h- x/ ^! s# W+ `
useradd -s /bin/false -r -M -d /nonexistent www
+ s7 g3 `' a& I& G
#开始编译安装
: @, F; h7 \7 l3 c, N
6 ?- ]) Z& E: Y1 k% G
/configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
/ ~* C, b! V. {2 ]. `. @1 k
--with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
; J t8 h% T3 P2 V+ ?
make
# e$ m! u3 E& t$ z3 \8 y. X
make install
/ X( x# b$ Z: j2 b
#给文件夹授权
复制代码
& w% s; l9 L" a7 B
7 H" U2 c5 a+ R# V7 `3 e' ~
chown -R www:www /usr/local/nginx
S& s! U+ j4 z. x
#修改配置文件
" E2 `( [* B" B; m! E0 A3 }
vim nginx.conf
3 m- {; e' H \- z
3 V5 l. F$ W" t- L( G( ^ |% P
user www www;
8 a# j5 C% s3 `, H
worker_processes 1;
! i x6 m8 n9 i6 i( L, S. R8 L
error_log logs/error.log;
0 U9 \. s/ c, Z% Q1 [
pid logs/nginx.pid;
0 U9 {6 ?2 J& h2 ]2 M A
worker_rlimit_nofile 65535;
! @. B& ]+ A/ N# L& C& m
events {
! |* ~* Y5 S* u9 P& k2 [$ P$ ]
use epoll;
: s7 l/ _+ x H0 k2 L
worker_connections 65535;
% ?# h, t z1 ? }! [* E
}
; y6 j8 q: M/ i) U
http {
& g4 M6 J7 D0 z& k
include mime.types;
! S6 O3 ?3 \* F4 L$ p3 g# @- Y
default_type application/octet-stream;
9 d3 K: B( C4 h' m5 B+ K
include /usr/local/nginx/conf/reverse-proxy.conf;
8 Q1 X7 j" b) v" n. ?
sendfile on;
, n7 `( ^) r9 N' c. x( a
keepalive_timeout 65;
% p; k3 E V: u" o1 p$ H
gzip on;
0 y7 q+ u* _6 B8 `7 }8 V# o
client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
7 `6 a/ y* l2 P" m+ ~6 H/ n
client_body_buffer_size 256k;
5 i: J% R* {4 y, ?
client_header_timeout 3m;
5 _: D' J: i9 s9 k
client_body_timeout 3m;
# I% V0 S: Y _& R p; w" U* x/ \
send_timeout 3m;
. N k+ ~7 _9 S+ R9 |
proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
+ ^1 ^0 Q( [/ n% c
proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
1 \6 K3 |( K! B4 @
proxy_send_timeout 300s;
5 R9 j5 D# s, Z$ H1 O2 C
proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
; c k/ d) I! k7 X6 M/ o! o1 [& f
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
' Y- L! V& D1 |0 F$ |3 z0 c
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
5 U# B1 `) O- X. I# ~
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
1 d" [' Y9 \; m2 k# a8 d
proxy_ignore_client_abort on; #不允许代理端主动关闭连接
7 Q. U8 w; c' @6 B5 @3 ]
server {
* j7 c1 W( q0 a3 M0 x9 ^
listen 80;
0 d! q" K0 [: ]) h G+ V
server_name localhost;
/ h! I( w9 K3 f
location / {
% F1 c- K2 b# H: N& t% t
root html;
$ Z/ h e! _7 k6 W! N
index index.html index.htm;
& b* F+ r. F- R& Q& |, C
}
1 E9 h P! r- |( K/ s' z
error_page 500 502 503 504 /50x.html;
' w) e5 }7 `; |( j- h
location = /50x.html {
- }. k) v0 [1 `$ T$ a
root html;
) ?# ^' p0 g4 |, B7 t8 j2 v8 E
}
# a2 ?5 w2 y! S
}
. N9 k" [) [1 _3 f# b. }
}
1 ^1 p+ ?' g4 t% \% H% q) ^2 m7 H+ U/ n
2 J5 Z# E( j3 t2 `6 k) d
编辑反向代理服务器配置文件:
. U# q- @* \+ n0 _
* Z& E# Z( _( {$ ?: y
vim /usr/local/nginx/conf/reverse-proxy.conf
0 s0 X2 X. c" l1 M# v
9 }; |# |# r2 S& Z/ ?$ V u
server
+ @- `. n% t( B- a" @
{
( {/ q3 {8 d$ L) @) ~7 P
listen 80;
5 D- h; e1 P! w' v. q9 C
server_name xxx123.tk;
`5 M$ L6 Z' b3 s
location / {
. {. N/ J" K2 I/ {1 b
proxy_redirect off;
# V5 u: k& \3 d" s& v9 P
proxy_set_header Host $host;
3 l7 H0 e- Y3 a5 R6 E6 s. u" F
proxy_set_header X-Real-IP $remote_addr;
' T% Q8 q0 E' w' d& ]
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
) L+ Q) R* W% V$ }* m+ R+ D
proxy_pass
http://192.168.10.38:3000;
$ p( ?# t1 H* s/ |
}
' r1 }' L' V: A! ^
access_log logs/xxx123.tk_access.log;
9 I2 k& `1 N ?( ^) o
}
% d Z3 {; d0 y; X9 e8 l8 G
# N8 Y C2 e3 R
server
% P) X# S3 a: ?5 Q2 L, n4 K( L+ \
{
5 {- g4 @( ^5 j; `$ Q; ]
listen 80;
' m; T9 R2 U8 A1 |0 w
server_name xxx456.tk;
9 F o' }* t3 ~1 n: ` _0 Y
location / {
% |( V& W; R% J4 P
proxy_redirect off;
) G; U4 e; k8 n& m; l, J$ }
proxy_set_header Host $host;
8 D" ^6 G( t" u/ d1 ~9 t& k3 ]
proxy_set_header X-Real-IP $remote_addr;
8 W9 P- q3 K8 d B+ o1 S% v3 \' F6 M, u
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
: y) z9 }1 D/ \2 m4 P( m9 a3 g
proxy_pass
http://192.168.10.40:80;
+ L- e$ x5 s2 [9 x+ z; N
}
4 C( |4 L5 k7 p, f9 h: m
access_log logs/xxx456.tk_access.log;
_- F+ G( m( d- p5 \# D
}
5 Z e; [2 }5 x, x; \" j3 U8 d
4 s* {+ _8 E i. I, t+ w. g
然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。
) `" D; j# w; `1 d6 p Y @
# t6 ~* A& i1 b+ n
upstream monitor_server {
1 V7 W3 ?& w* U
server 192.168.0.131:80;
- _" [/ d9 q2 F& A, A
server 192.168.0.132:80;
( ^* a# B* Z2 {- u" p
}
2 x4 P9 K9 r3 p8 s% n% ^% e
. P+ b; m2 g) D+ M
server
/ F# t: h9 U+ U( [
{
& y9 }" [# Q( W5 H5 Y6 n3 X6 a/ M- D$ h
listen 80;
& B2 j6 T9 \7 J% W3 a
server_name nagios.xxx123.tk;
& p B9 }3 S' C+ S' }6 y
location / {
5 w4 n" q* p+ Q
proxy_redirect off;
' `: U1 w7 U3 {1 ~0 \# ~
proxy_set_header Host $host;
0 j' y0 G" H6 l; }
proxy_set_header X-Real-IP $remote_addr;
9 k) R1 e. Z- z% i8 z9 H$ C) S0 j
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
( c! H) {. @' f2 |8 ~- A+ y I( X
proxy_pass http://monitor_server;
& Z0 w8 U% J1 r3 s. w, @
}
, ?; G9 F- c1 V3 l' D3 Z
access_log logs/nagios.xxx123.tk_access.log;
' Y9 @3 x N8 X, N- q$ S8 C
}
8 P; J1 t" A" l3 \, `& _
) |" `( p) Y6 ~- z: D6 [- @
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
0 l' q& S3 [- C9 _
) Q H6 k2 g! y3 m0 }& q
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
$ ?$ h8 N. h* l- J. `
'$status $body_bytes_sent "$http_referer" '
+ Y5 }) F1 |3 w6 [; w
'"$http_user_agent" $HTTP_X_Forwarded_For';
! j4 C7 g3 ~; N+ \2 u: ^* C8 b% l3 c
; c2 Y4 t6 ?6 {, a, O" W1 |) b! G
access_log logs/access.log access;
/ ?) s4 `$ @" I. }2 r/ z# Q
# f. I- ~8 f/ {
再看看原来日志的格式长什么样:
. i6 P: u' q [. I, ^1 }; ?4 H9 T; f
, ~! G1 S) X# l; M6 E
1
$ Y2 u7 Q, E& ]/ @# W. O4 L
2
& c, T; e5 L5 Y$ k0 R J- h5 X
3
8 m3 L8 s4 ^+ D. ^! T
4
: h! Q& V! q9 p7 E6 ?. b
5
6 T3 r$ c" X" ?1 s
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
" N/ \0 O4 J+ s" v, N) E4 a
# '$status $body_bytes_sent "$http_referer" '
7 C3 x w4 D4 n9 P+ M( P8 n
# '"$http_user_agent" "$http_x_forwarded_for"';
/ B9 s a* G/ @( R1 \/ z! c G
; U7 y, T* s' m6 n7 F; w
#access_log logs/access.log main;
6 |- A* G% N2 }; y, X
看出区别了吧 遇到的问题 之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
: D v9 i6 h5 z) P2 j/ y) k6 s7 Q
( I' m/ B$ z3 {$ @7 R6 `
1
6 b, I" j4 M6 z" A/ h S- v) L
2
( V0 w: n4 g, [2 ~* d6 T! t# R
3
8 c; Z. ~: v; i7 \7 y# b* ~2 M$ I
4
0 U( `, k6 t2 K2 u; i H# O0 R
5
7 O" {2 u+ \( o( K/ c& M
6
- n! b n9 ?, l( @7 \- @/ H; {
7
) R y, q) }" z* E* G
8
! s$ U! d3 T" J5 m
proxy_connect_timeout 300s;
5 [& `; b; o$ H; ]9 c
proxy_read_timeout 300s;
2 P. ^, X, Y/ f8 f: C
proxy_send_timeout 300s;
U- v. R6 E& w
proxy_buffer_size 64k;
n: O% E! g6 W* h w$ G* Q
proxy_buffers 4 32k;
0 r( V2 q- |/ l& j' O# J
proxy_busy_buffers_size 64k;
/ T! T! k, i. l: J& F. Q
proxy_temp_file_write_size 64k;
: @; m& v& l; W
proxy_ignore_client_abort on;
4 P3 h u/ \, z* x) U8 t
报错日志:
+ ?* f; e$ {6 w7 S
: @5 F9 Q1 b Y
...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。
P2 P" U% X% m1 ~
! v- O4 _3 x" F& C, S
PS:关于域名转发
& t- k# A4 q8 F+ f9 o# V
/ K0 G# k9 O# a( S
所谓域名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/
的内容。
, r$ I8 T8 q9 U+ k# C6 G' |' u
欢迎光临 cncml手绘网 (http://bbs.cncml.com/)
Powered by Discuz! X3.2