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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13685|回复: 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.044 C" p4 c0 `) K, r) H) b- Y3 U! b
0 m1 I6 T- g1 |4 M
  1. ###更新仓库
    7 s. P0 T# Z/ O" U
  2. , u5 t8 m4 {6 q9 F
  3. apt-get update -y
      m. A6 ^6 t8 T* k3 W% m2 P& k' Y& v
  4. apt-get install wget -y
    ' b+ r, Q+ N, y
  5. #下载nginx和相关软件包
复制代码

0 K- g7 y" a' l% r- f3 w. X5 B' @" `( |) j" @" F# {
pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
  @! ~2 z3 u% }7 l: u9 \7 Y( J
- F4 v1 @: R" N& D# j
  1. cd /usr/local/src
    & I8 W* s" _! ^
  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>
    3 r1 Q  A' V. Z6 ~* t
  3. wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>5 k% k, D+ Y0 j2 T
  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>
    ) I$ ~' `7 g' C- F/ C, e# d) a
  5. tar xf pcre-8.33.tar.gz
    : g1 V5 m! C9 |8 Z; }  {7 Y
  6. tar xf zlib-1.2.8.tar.gz
    ( ^, K- R: y, s' ~$ ?+ C+ X
  7. #安装编译环境
    ( W, t, h# Q+ |' B9 \3 }
复制代码

/ w6 d2 b$ D% ]7 i
6 {3 Y5 ]4 f% o  [( T apt-get install build-essential libtool -y8 s" S8 P- \7 c+ R. W* k7 a: }
#创建nginx用户
* V) N" y) P% ]. y- ^# g$ ~6 B7 G4 ?
所谓的unprivileged user$ y! [+ f, r7 l! u2 \* n: ]1 c

$ a* m- z% g6 h1 S' V
  1. useradd -s /bin/false -r -M -d /nonexistent www
    3 ~4 A5 `5 G1 D8 H6 D
  2. #开始编译安装
    & r6 `) z- q1 }

  3. : }2 j' D' _' D
  4. /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
    1 x' K1 z9 p! E
  5. --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
    1 R. Q( m/ `# w% b
  6. make7 G' v" x$ U9 `( {
  7. make install, X+ p1 s- o2 H
  8. #给文件夹授权
复制代码

( a9 B4 P( G4 Q + g) Q! |5 X8 u0 O) ~2 A2 H# H! n5 F
chown -R www:www /usr/local/nginx
# T7 E% A8 J; H4 V9 q2 L/ p6 t4 W, H#修改配置文件" T* E8 b1 H; S+ g7 c; ~& U
vim nginx.conf+ Y* ?/ ^8 X; H& g

- P8 D$ u& f8 y' T" z$ O+ K3 |user www www;3 u; h$ w# w! I+ t1 K+ m# Z
worker_processes 1;. z+ w  P/ V6 [  l0 d5 B' p3 d8 h# k
error_log logs/error.log;) J- R, y, [  Z( d& O
pid logs/nginx.pid;
% z  x/ C, D2 ?% iworker_rlimit_nofile 65535;/ R$ g8 f$ T0 T, r; m
events {: A, F9 z- U5 \2 C
  use epoll;
$ q; M) j/ I+ V- T7 q  worker_connections 65535;% V/ |  E  S/ G5 ^/ q& S( Q9 x
}: A/ @6 p! w( y. |. x% ]. }
http {
; O8 x2 R( o  ]  include mime.types;! ?: C  E6 d/ ~7 A- A
  default_type application/octet-stream;
1 o  l: J) [  N  include /usr/local/nginx/conf/reverse-proxy.conf;+ [0 }: l  k1 W2 ~+ r
  sendfile on;
- O: K5 D5 H' t$ c5 B  keepalive_timeout 65;
3 B5 L  B0 e# x* I; a4 [! P  d' ?  gzip on;6 b$ O( E2 A8 L: ~7 m
  client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户9 }5 v1 ~1 T5 ?6 F8 k0 a
  client_body_buffer_size 256k;
5 J& y- {' J! I9 O! l  client_header_timeout 3m;
# ?8 ?4 x4 z+ _% x, R3 S5 P; Y' U  client_body_timeout 3m;# j: C' p) \* T+ _
  send_timeout 3m;
/ a% S0 _5 H( Z8 H  proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)- M6 i; x7 U! M  i- M! Y8 P4 b* t
  proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)& B9 ^% a; [) n& a( y2 h
  proxy_send_timeout 300s;
0 K& d  J' z  J% y+ `4 E( t) g  proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
5 ?( j! H. o( D$ \  proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
8 ~8 w& H* V" A0 K! J: i  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)* k( }. D3 h- U# e( R4 }
  proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘6 O' Y" J/ b! |0 b) f
  proxy_ignore_client_abort on; #不允许代理端主动关闭连接
  r* b2 P0 ]+ n" k5 Z  server {
5 l& M+ G3 V. u& w    listen 80;% p6 m8 N! C2 N2 b
    server_name localhost;
% _- }' C. ~- n: {" V+ u/ Y% x    location / {
$ S4 x0 X. m( o      root html;" A- Z& |- k/ D
      index index.html index.htm;( j6 Z, q$ M& b4 k7 \
    }2 N- n) P$ v1 W  e% Z9 h8 N4 Z$ g$ C
    error_page 500 502 503 504 /50x.html;, k# b3 E* _- N' E/ Q
    location = /50x.html {6 y& D# ?6 F# v) ], _
      root html;7 N5 h7 e6 G1 F6 \" v. G% _
    }
6 l8 e3 R9 k4 \# |  }& {  i9 _  `# a& L
}
% b+ q$ W, p" ^7 J
( i: Z+ D" F4 M6 C8 O! }" t编辑反向代理服务器配置文件:  R+ @" X4 L' k/ c! }& R
) \- b4 ~* q5 c1 s( h, `
vim /usr/local/nginx/conf/reverse-proxy.conf
) ^  ?6 P, Y8 b/ d( d& M$ g  z& D% v2 f6 `; e! b' {
server  }. j+ W+ @2 h- k% e
{2 G$ Z* ~6 d+ G* `
  listen 80;
) E6 ?  b8 r( p7 y  server_name xxx123.tk;
9 U% V6 U% T! L  location / {4 u% {) A& c+ B8 e0 A; _5 g- V  \  i
    proxy_redirect off;
* t2 Q! R3 ?7 [    proxy_set_header Host $host;
5 L6 C0 X, ~1 R6 c: r6 A    proxy_set_header X-Real-IP $remote_addr;
, d2 P( }  H) h    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;* ^6 i8 K+ P. @4 h7 T
    proxy_pass http://192.168.10.38:3000;5 X# Q% }4 m2 U* s5 b
  }
5 ?; o9 X& |, l, I$ R2 |  access_log logs/xxx123.tk_access.log;
( j- I5 P( K* Y6 l5 m- g}
0 h( A5 x1 G! |  3 J; N9 b# x1 B" o& O
server) K. F% l: j7 Z# w4 p. Y$ q# Q1 l  `. e
{
. x+ m* S1 D7 s6 d0 c2 \  listen 80;8 p3 z) M  Q6 H
  server_name xxx456.tk;* y- @( L% @- ^/ }. z: l
  location / {# s9 `  X( S; n, c: W) y
    proxy_redirect off;- s3 ]  q2 c8 |3 B/ l
    proxy_set_header Host $host;9 W8 e! d$ `8 S. _- N4 r
    proxy_set_header X-Real-IP $remote_addr;/ }; Z% \& l& M& u6 a/ I# p
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;0 ^4 z" a% d) y4 m" J4 q
    proxy_pass http://192.168.10.40:80;; y% U) Q2 s6 }5 j6 }# F
  }
* `2 s3 [9 P/ ~  Z0 a; \) w  access_log logs/xxx456.tk_access.log;9 d( _$ V& o3 {
}
1 i0 B5 }3 j) d0 w
* v; O1 v/ `$ |1 B* z3 B然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。6 a* O0 N! L. Q/ G$ t* ]6 q

( h" B* G" u9 Q3 Iupstream monitor_server {
" P( y9 O9 ]! ~% n2 k5 d  server 192.168.0.131:80;0 g; H. `& V0 h, h/ v
    server 192.168.0.132:80;
' v5 W! C/ p4 {- B2 g. D}' O: Y/ H7 T3 |2 `$ C0 `- q" ^" s
  
! F- L7 F, v$ |2 f/ aserver
5 ]& i) h8 ^4 j' f  c$ }{1 A9 I0 S) e2 I8 J% L  A6 v  ^
  listen 80;% K& Z' a5 `$ N! `& S
  server_name nagios.xxx123.tk;& ?, i) N8 I9 h9 |+ |" ]3 W; t
  location / {
0 K$ \, u/ l2 p! g    proxy_redirect off;
+ ^/ _. {. ^" R* P, a2 |7 a8 o    proxy_set_header Host $host;
+ e$ U- i! S. `/ ]8 ^    proxy_set_header X-Real-IP $remote_addr;' M+ A& A7 b5 H! Q, [6 D) W; |$ c* `
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; $ u0 D8 c* D% K
    proxy_pass http://monitor_server;6 G% X$ [4 H8 K; A  n3 a# ^
  }
' p' J# M4 j' }/ v0 m" [6 x# e  access_log logs/nagios.xxx123.tk_access.log;8 ]; O9 @0 D3 F' C/ U  i
}
' |2 f3 s' ~& z2 |' d: Z: n7 Y2 |0 j& v* T7 `
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:+ U# g5 `' q5 F

+ V; K( @. t$ K3 T+ ~2 _log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
% r. Z* A9 }4 J( p+ P3 m'$status $body_bytes_sent "$http_referer" '
0 j( h& b8 E( S/ |6 \& A5 \'"$http_user_agent" $HTTP_X_Forwarded_For';
% L3 A% ~9 o; q1 P$ y( x  
5 z* ]. t7 \  D1 r7 jaccess_log logs/access.log access;: b9 y  k  c5 H6 U9 V
: K5 I% i8 \- T! Z4 {. G* \
再看看原来日志的格式长什么样:+ {# n0 C" z$ \5 T
- H0 d, v0 z: p0 o# \+ {
1
1 N9 {9 ~( u5 J/ F8 b8 [2, l+ \0 c7 ]- U
3
8 p6 h  B( {, s' C% F9 l5 V4
8 Y. b6 o& Y# q3 Z/ C5; e4 [" h' {* V5 s. p
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '2 w0 {. q7 x, Y+ M0 _5 R
# '$status $body_bytes_sent "$http_referer" '
( ~2 M' d9 w" f  C1 T# '"$http_user_agent" "$http_x_forwarded_for"';
( Z3 C5 \( G8 i; ?  
- S. T( ?7 U0 i: V#access_log logs/access.log main;$ D( l6 Y$ H8 N$ ?8 a% G5 ]
看出区别了吧   遇到的问题   之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查) v, D4 E1 o7 B' w2 M% h

( S0 M& A" J9 G) R! c& J* E18 V7 [9 @' N0 \& z6 A7 ?
2* }0 x: J$ `* q3 z  f. B5 w
3
1 f8 h: R/ C4 a) X0 y4
0 G3 a1 u4 s) x8 \, i0 R9 I) p5: M( b# \* z- s1 W
67 Z, o5 }* n, a4 W# d- P
7
) G% X' T5 m3 G& ~: ^85 B3 E, ]+ ~2 T# O( A9 Q  m
proxy_connect_timeout 300s;9 }2 x) R& ?: u2 N- z& Q4 W) i
proxy_read_timeout 300s;0 P# X" I' F  M) T" W4 Z  J* |
proxy_send_timeout 300s;
( W# ^. f' w1 W1 Q/ ~% f& o! aproxy_buffer_size 64k;
) v# z: z: @3 o  u6 d% vproxy_buffers 4 32k;
2 a6 N/ j7 M9 ?* j5 X7 c: P9 oproxy_busy_buffers_size 64k;- G7 H' l/ f9 ^1 E
proxy_temp_file_write_size 64k;
( s2 z/ ~& s  Hproxy_ignore_client_abort on;
" u7 C7 O/ P  v$ D) S# ~8 `报错日志:
% E- R0 A; [% K2 D1 `9 t. d2 W
6 U$ V1 z: v$ d+ S...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。
  Q4 P  G; P: @; d' O& {  D+ v3 J' p/ D
PS:关于域名转发
3 G) o$ ^( x3 t* f5 N
" \4 w, S" O# n所谓域名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/ 的内容。4 F' u& h8 f/ T! L5 ^$ H
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-16 18:44 , Processed in 0.062910 second(s), 20 queries .

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