您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9242|回复: 0
打印 上一主题 下一主题

[centos] Nginx服务器作反向代理实现内部局域网的url转发配置

[复制链接]
跳转到指定楼层
楼主
发表于 2020-2-25 04:54:09 手机频道 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
情景 由于公司内网有多台服务器的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" R# H7 M7 j) O" w) i5 g4 J, u& l
) @8 x1 e0 T2 M/ U1 u7 p
  1. ###更新仓库
    . d$ ^, U; D; B( G

  2. * Y3 A* V  H3 e" G8 s
  3. apt-get update -y
    9 s6 ~( q: G4 i
  4. apt-get install wget -y
    * {# }. `' I; n: A# }+ Z: W
  5. #下载nginx和相关软件包
复制代码
: M  u3 Z  g8 f* N

" I; ~- |, @9 i# _3 [3 M% T8 r7 Opcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
  M) s1 g4 m, e0 P
/ _8 f. h6 q0 K9 C8 p! q+ s
  1. cd /usr/local/src" b- h! v7 `8 }
  2. 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>5 X% L+ R6 G; R) |) ]0 g
  3. wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>
    ) E# H6 E, h8 N1 C
  4. wget <a href="http://nginx.org/download/nginx-1.4.2.tar.gz">http://nginx.org/download/nginx-1.4.2.tar.gz</a>: w# P2 f4 g* p
  5. tar xf pcre-8.33.tar.gz! \4 s$ D. ?7 b2 I% x
  6. tar xf zlib-1.2.8.tar.gz7 [# r# ]' ?/ ]3 ?. `. d! d: X
  7. #安装编译环境& Q3 B2 R& t1 ?! _8 ~
复制代码
6 |3 n5 J, _$ t5 z2 u
0 @9 _4 K# ?- H# ~1 |% T
apt-get install build-essential libtool -y
- N+ A* l- d' V- [6 m; p#创建nginx用户) W  f. b' }" F  ?8 M! D& }% i
: L0 m  A1 B6 _9 z/ h4 J
所谓的unprivileged user
  d( ?) @3 r8 L8 Q4 L: N: K! `/ A1 s
' a& g& X& ~! d8 i8 K9 L+ ]
  1. useradd -s /bin/false -r -M -d /nonexistent www
    4 ^% N! X( z$ n
  2. #开始编译安装
    : b0 Q) V" K2 h8 W$ P3 U/ K! k
  3. 9 L" e6 ]1 d9 x/ ^8 k/ `4 f- Z6 L
  4. /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \; E9 N$ T; I  V$ E% C) m
  5. --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
    ( u' w( P- [1 z) P
  6. make" G2 D5 G1 w! n  K3 v4 |2 _
  7. make install5 q% U4 m! T' B
  8. #给文件夹授权
复制代码
# q  N$ `$ l! S+ P3 C) @

: j; [% c1 C; S$ Lchown -R www:www /usr/local/nginx
$ k" e$ P: M7 V* x: f#修改配置文件3 G! J# T8 _5 ~3 {) L7 |6 z) u3 @
vim nginx.conf! i, R% b# ~5 n. O2 U) S' \

6 J3 h! m4 ?+ R4 y! H- luser www www;
0 z3 o+ O" O* l" d( k; n  D& Kworker_processes 1;
- U# ^! @( v' p. p: ierror_log logs/error.log;2 U- P7 J5 m  k4 J( w
pid logs/nginx.pid;
2 X8 w4 b( p8 X; |1 j7 g4 Zworker_rlimit_nofile 65535;
# d) g) w3 L/ l: s" k' F. Ievents {- k6 X' L& u( h3 R1 i3 t
  use epoll;. U: E8 T9 R" j' m5 c
  worker_connections 65535;
8 ]. W3 P, _- |* a7 e/ F( X}
0 P: @& y0 U1 l, Ehttp {5 }) v* D/ X/ X1 m. n; q; O
  include mime.types;
( r' V" W& _! r! B  default_type application/octet-stream;
3 x9 H. j- h' I: ^0 ~1 H0 |  include /usr/local/nginx/conf/reverse-proxy.conf;
( W. J; g8 w3 c4 `! y  sendfile on;
2 D# F; K5 Z2 L1 q/ c) }  keepalive_timeout 65;5 b; w, S8 a. n0 x8 x
  gzip on;
1 D  U% R6 r; i; j1 k8 `  client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户1 N  ~9 d$ T" r5 }% F
  client_body_buffer_size 256k;
. T8 i( T8 d, S  client_header_timeout 3m;/ K( Y0 {7 j1 x, ]" `! i
  client_body_timeout 3m;
9 i% S" ^6 z2 I' B1 @5 o& v! X1 ~  send_timeout 3m;
( u5 t. U, S+ }4 E1 B  proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
. f* R' D4 D% Y' }  proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
6 P9 Q0 u% k+ l$ D. ?6 N0 _7 m1 f  proxy_send_timeout 300s;
2 l% r3 h+ Q8 n  proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小' X: P0 [# l6 E7 H
  proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
( r/ x5 o1 {' _: j1 I7 {- M  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)  K& g- ~( }% @" |
  proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘. V+ l0 Q  Y/ p3 D* ], F9 j9 X
  proxy_ignore_client_abort on; #不允许代理端主动关闭连接
4 J. ^% [# Q2 h; v  server {5 D2 L+ [2 v$ ?2 S9 Z2 v5 W, z
    listen 80;! j7 r9 J& X0 n0 F- t1 \' s
    server_name localhost;
2 B$ N3 P5 E. J+ d    location / {
$ ?0 p9 F' s- ^# X- M+ H5 K2 e. O      root html;* K; M; y; h5 E& R6 Y9 P. W) q, f
      index index.html index.htm;$ F! r: u5 C$ d2 ^
    }
7 t7 d7 K% E- U    error_page 500 502 503 504 /50x.html;
) ?, u( z7 T' {6 ^, p3 o    location = /50x.html {
9 d; M- D) W: m* k( m      root html;. N' u- l, n) N1 A
    }
1 d. M2 h+ i0 N+ f  }
3 _3 @" q8 {& a+ x}9 o. n5 S* U! y4 Z$ z; X

& N- S/ }/ \# H& y/ Z2 q+ s$ R9 A编辑反向代理服务器配置文件:# v% \3 N0 y& V1 p7 |

- U) o# G2 i$ [* Y& O+ }vim /usr/local/nginx/conf/reverse-proxy.conf8 G+ D) t. t' s& M2 l
# a9 p+ ]$ {) j
server
2 I! S6 A2 W' }' N{7 X- }; g5 W  O% \& T
  listen 80;
; {! [; p- @8 v4 \  server_name xxx123.tk;1 j2 o" h$ M2 r9 @
  location / {* f$ @  W* `7 r/ e7 D
    proxy_redirect off;% N1 _1 U. A$ l( v
    proxy_set_header Host $host;
  Q+ e& e+ L4 M& |2 G7 D" j    proxy_set_header X-Real-IP $remote_addr;& B% ]) p: ~" r+ }% ?
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;/ [3 o  _( Q, D2 I% t
    proxy_pass http://192.168.10.38:3000;0 R2 H9 D* v3 ~& w, j; K8 k& ]
  }) O* u1 h9 N1 b7 v5 l5 N0 e1 n
  access_log logs/xxx123.tk_access.log;% N) M. p0 z7 x7 q+ v0 ^4 B
}7 t$ _- P5 W& r! t
  
! ~, H; x8 K/ Q  mserver- Y- z9 }( Z& o" N
{# `! w' M; }  {1 ^3 X5 N: j
  listen 80;
) ]$ ~5 ~2 G& b( P' j4 @9 s8 D  server_name xxx456.tk;) T5 m& X# J* d) n
  location / {
! F9 y4 A5 z7 `3 [    proxy_redirect off;! W' Q% U( G  G  s: L
    proxy_set_header Host $host;
3 ]9 X# u% X* ]  c7 M. G  \: j2 S    proxy_set_header X-Real-IP $remote_addr;
6 G& z3 P  i' y) h; ~, ?3 R    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;) f8 D7 |% P4 Z9 M0 f
    proxy_pass http://192.168.10.40:80;
' e. P: Q8 i' j% i  }
' T/ ~& K1 ?1 b- \/ P9 O  access_log logs/xxx456.tk_access.log;
9 P% H( }6 i+ w% B) j}( a6 k6 s1 u& Y: T* ?% m7 n2 ]

; {& E! f3 h/ {1 z然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。
) l0 ?) e1 `( @8 F- H
* @) c9 f- m9 Z7 Y8 j9 T3 G$ supstream monitor_server {, N+ A5 P7 y6 j
  server 192.168.0.131:80;! V0 U* T) @9 Y+ T
    server 192.168.0.132:80;1 F1 y. c$ h/ x1 y$ l) W8 q4 g0 ^
}, m9 u# S: ^' x8 a2 I7 d) F
  1 j& w. |2 e; T' l- ~+ ^- P
server8 w. J" S1 W; ]( a. T- d9 d' I
{
! N, u9 D7 Z" h7 a0 A4 s  listen 80;  C' U9 A6 ^; J6 q: ?: f- c  i
  server_name nagios.xxx123.tk;! _$ `6 z9 j# G7 S' c, @% C& P
  location / {
/ }2 D% [7 _) @# q! ?    proxy_redirect off;
$ K9 Q$ u8 ^  _' n* O' W$ s1 s    proxy_set_header Host $host;
3 N- r7 L' y% j" `# J. N, f% l) O' E    proxy_set_header X-Real-IP $remote_addr;9 m2 h7 ?! c7 B* p
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; " e+ M6 a7 S  Y% ]
    proxy_pass http://monitor_server;
+ I. M/ i6 ^" I. G9 q% u+ ~' d" j  }: _+ _1 \; N1 c+ j/ U
  access_log logs/nagios.xxx123.tk_access.log;2 r8 c) g! x. |+ n+ n# G4 M+ q
}
, h+ ^9 R( W* p  }6 f' k. S9 G3 P7 g/ L0 a! K
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:5 g4 N/ M8 o# Z; \5 ~
- d* G0 S. i0 K, [
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '! ~. l9 C/ ?! Z4 D+ f( ]
'$status $body_bytes_sent "$http_referer" '
/ v3 j0 t( U& q6 Q! P9 P1 L'"$http_user_agent" $HTTP_X_Forwarded_For';/ O1 \# ?( @0 e+ U7 L. h
  
. d4 Y; Z& y# k4 T2 H9 w, R8 y$ gaccess_log logs/access.log access;
8 \9 C3 Y* l/ v3 P0 V: _
" q. o4 a8 g6 p$ B' d, D再看看原来日志的格式长什么样:
1 O2 S$ [/ p( c* m$ g4 D" T8 k$ i+ ^2 _, \4 S7 ?" Z. W1 j6 v  I; B
1& P* d8 y& q/ J' X
29 \9 k5 M9 C7 ~$ ]6 b# J+ g
3
  z9 R2 O+ P" B. O2 h+ S( Y6 q44 x. }1 k. @/ Y
5
% L! K0 W( n# L& v#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
% N" S: R/ g& C  e4 l! P# '$status $body_bytes_sent "$http_referer" '- m! P  x. P% y, i$ O
# '"$http_user_agent" "$http_x_forwarded_for"';
, w8 p4 J5 ^) Q" ?/ H/ @  
- H+ s' u6 d, Z8 {#access_log logs/access.log main;) K4 r4 n  o7 F/ G5 L
看出区别了吧   遇到的问题   之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
; H: Q2 l' i, f5 {
1 u& i9 Q, A* R+ L% F& ?# A% A1
! ]- ]9 U7 s% x  N2, K+ b) y: j" K2 b. `$ j
30 ]" s; u! A) U* ?- b, n
4/ S; {1 o- n0 @; p& U
5
% Z3 A& g7 l2 Z2 Q+ U6
! `; G4 T) [: {" K; I7
$ P2 K9 L# Z6 |7 R0 j8
0 X/ ~7 p' R3 ~2 G% B. Lproxy_connect_timeout 300s;
' z, e1 P9 s( m7 bproxy_read_timeout 300s;* E, g! W, G  L6 t
proxy_send_timeout 300s;7 N+ k* g" o. ^1 z
proxy_buffer_size 64k;
- T2 m8 i. o" n, U2 I0 G- Mproxy_buffers 4 32k;
2 q( \$ d& \% r. |2 Fproxy_busy_buffers_size 64k;
5 A# B! O* J+ y# ?2 gproxy_temp_file_write_size 64k;6 E" r; @2 P* x! a1 D
proxy_ignore_client_abort on;
4 i- o& O( W' \3 y, ^) x报错日志:- S/ _9 N* C( m3 [5 H7 H$ r5 E
! ?0 H0 q0 j8 C& u. B
...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。9 x  ?$ U0 I, Y0 U. \* B- ^) A4 z2 {
6 Q& O. `1 I6 G+ p
PS:关于域名转发
9 B& O# K, k  v6 M, m* I  [+ c
' L+ ^# [# z; w: @! q3 J: `所谓域名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/ 的内容。$ A) w8 t  ^2 ^9 i
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-4-26 13:18 , Processed in 0.116071 second(s), 19 queries .

Copyright © 2001-2024 Powered by cncml! X3.2. Theme By cncml!