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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13556|回复: 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.047 F, S; S% n5 \  I

8 F, q8 J6 C% \- W( V
  1. ###更新仓库, R; t& H8 a2 @% t9 j" k3 H

  2. 9 S  A6 e7 ^5 y0 E( M3 z% W
  3. apt-get update -y
    * x3 W7 y7 N6 N" `, d
  4. apt-get install wget -y
    4 q; w8 U3 E6 o& O% _# X( w
  5. #下载nginx和相关软件包
复制代码

2 h9 _& B) F0 M* }! U& J6 F! H+ _- d# i- B
pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。3 N3 M2 `% u' g1 I8 _' X

  o9 K2 g( i) }
  1. cd /usr/local/src
    ) L+ S4 e5 T7 J& [
  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>
    * u" q' G4 T& V% C) B4 o
  3. wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>
    & B+ m/ I  S) t( \. y' e1 I
  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>7 v% o/ {+ }4 s7 p& k' a. d
  5. tar xf pcre-8.33.tar.gz$ \3 y. `! s- Y' u% w  x
  6. tar xf zlib-1.2.8.tar.gz
    - o5 u+ h2 @  t! l9 E
  7. #安装编译环境
    7 x+ S2 M/ W" q* o
复制代码
& M* A0 X. \( d% r' A
2 _  K  K" c- {; v
apt-get install build-essential libtool -y. y: M. n9 E" \4 t
#创建nginx用户
' i0 f' R8 Z% M/ E- r: \$ S) m% v+ P4 d8 J; w; J9 f
所谓的unprivileged user/ O5 {7 |* Q% g/ ~$ d6 i: c

% N  o% e& C/ s/ d( Y  I5 `
  1. useradd -s /bin/false -r -M -d /nonexistent www0 F& y+ b" q3 X8 |
  2. #开始编译安装
    + X% A7 e- {/ P; V+ z

  3. 0 w8 e* @1 v& ^; C
  4. /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
    : K: y* a1 t( z4 k( R
  5. --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module- ^5 ]4 U  L' o8 @1 q% f
  6. make
    / |1 J8 ?$ B5 q) I5 w
  7. make install
    # h$ J6 x. q; j1 @3 m
  8. #给文件夹授权
复制代码

+ {) |6 v4 \) P" K+ ^* u ) X) ?! e' G% w7 w
chown -R www:www /usr/local/nginx
! ]) j+ I, I$ ?4 q4 i  m, y. W$ V8 x4 {#修改配置文件
% [3 Y# X) X! o/ l2 D: Fvim nginx.conf, B; _& E$ o2 E4 c  S
# _: l4 O% ^7 R5 U) A: g
user www www;
! d2 @7 R8 A) V9 S. Q4 ~worker_processes 1;
% B$ T6 c" c- G9 y( ^2 v& lerror_log logs/error.log;) [( L. q1 X0 }& E5 J
pid logs/nginx.pid;& w, \. g  U' d) M+ @
worker_rlimit_nofile 65535;
- a! x2 G, x5 M  n4 k* Z9 Z2 bevents {& i6 \% S% f8 i0 ^) w/ w& l& R. k
  use epoll;
1 p# R7 n! {8 O6 ]  worker_connections 65535;
2 n/ w/ O6 z1 c1 G  }" E, h}7 [' S: y1 q5 g3 }( m
http {
  ]! @, |1 ~7 V: D6 t  include mime.types;  t& p! a. d% W
  default_type application/octet-stream;( h6 R7 h& J3 T- I
  include /usr/local/nginx/conf/reverse-proxy.conf;
% V: O. D7 w) T% [! }9 M! o3 D  A2 B0 F  sendfile on;
5 u% b  Y4 P0 y5 [1 U- j, K4 W  keepalive_timeout 65;
% z6 b1 z7 r! k* `2 D* q0 c5 h  gzip on;( u/ `6 `9 u- a
  client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户6 [8 k$ Z; S' u# Z; @: Q4 V
  client_body_buffer_size 256k;
) R/ G9 F! g1 ~0 q' b0 y  `6 C  client_header_timeout 3m;: k2 `, ~( ?) l+ j0 X3 B6 `9 D
  client_body_timeout 3m;4 b% p4 l7 J5 F6 X
  send_timeout 3m;7 ]! k& P' O% I7 O( h
  proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
* E6 J6 L& O8 d1 T8 L  proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
2 y# |# V2 m% e  proxy_send_timeout 300s;
2 _# D) M, a9 B9 a" p6 o  Z  ~  proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小+ a; W* p1 ?( z# u$ ]: `
  proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
2 |4 \$ y1 @: S! v  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)% U0 J; R5 u  Y' n4 ?5 G
  proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
. E5 W% m& ~  U2 k+ s) }; R  proxy_ignore_client_abort on; #不允许代理端主动关闭连接
- Y2 B; g* J3 w* I; T. `! g+ ]  server {  w" H# c6 z4 `
    listen 80;* L2 I( w2 U  ]3 d; T# w/ `
    server_name localhost;6 Y: M& X  m: }- A
    location / {5 Y: p- u, ~/ J0 G: H9 @
      root html;4 P& C9 ]3 s6 G1 ^4 K
      index index.html index.htm;7 s. S9 i2 q& d$ W' |" s
    }
, r" ]; J* L; w2 R" x. R/ ?    error_page 500 502 503 504 /50x.html;
7 Z- E0 Q1 ~( F5 {' z6 ^    location = /50x.html {
; ^& X* n& g6 f" O. M9 t, w! [  a, L$ s      root html;2 t4 c* d7 ~8 ^* k+ A; j
    }
( ~5 b% p: p# }/ U3 [4 [, q. ?  }1 x- i4 B( q8 @7 E' p/ C& P6 _8 _2 \
}
, a( l% G; {: H
5 U& i! C# @5 `2 g8 @编辑反向代理服务器配置文件:, P. l3 Q6 j9 w- {; n( z( G
3 m- W" g" e2 w$ U/ @0 o; M
vim /usr/local/nginx/conf/reverse-proxy.conf
* {6 |) }8 L+ W
: q1 u! p5 u2 ?/ q& Fserver
6 W8 }, e2 `- ]" j{0 t# V: }6 \2 O( F/ \/ X
  listen 80;
- }% s" `1 i$ u+ E4 B  server_name xxx123.tk;* p/ F7 h6 N0 ]" \, v4 p  n
  location / {
* X, R; ~. t" J$ W    proxy_redirect off;$ P) E$ m/ S. s) d& b& m
    proxy_set_header Host $host;
, y; X9 Z: G: o' H" A$ o" _    proxy_set_header X-Real-IP $remote_addr;
1 l- C/ w( n! ^( v9 r  V& n) V    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
6 c! `) J$ v* B/ N3 \8 W- z    proxy_pass http://192.168.10.38:3000;
/ r% a& O) q  K3 h; Y! Q+ @! ]$ q  }; w' b4 E, h4 {6 y
  access_log logs/xxx123.tk_access.log;
5 n5 D8 C+ d7 V8 D( O}
/ l9 i$ Y% z9 O/ z  v  
" `$ Z0 Y' t/ Userver
+ L6 O3 w& q- m2 g$ K. s; ]{
' z  n0 Y( M* Z7 I& a+ u  listen 80;* g  M' U! T! T/ ^- n+ I, K) x
  server_name xxx456.tk;
; E$ U, V2 {/ n( A9 T  location / {
$ E3 U! b/ N% D: F( u$ W    proxy_redirect off;
% _& d& n% Y( G0 f7 o    proxy_set_header Host $host;$ A  ], L& i: P3 j* h0 |/ O
    proxy_set_header X-Real-IP $remote_addr;
# W; U9 G( r) i    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;" g3 \: }" Z9 r0 K; |% H* V7 @
    proxy_pass http://192.168.10.40:80;0 V% Y: I! Z& h' U! U* ?& \
  }. ~# S: E- f# C" O3 B
  access_log logs/xxx456.tk_access.log;
( b  B& B  Z/ U3 X! g9 N}% i# }1 Y. r- g, L5 M- b, F' g
, F) P9 P2 e' P/ _3 r+ G/ b
然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。
2 ^. Y' \$ B0 _0 |1 k. ~6 ?' h: A( x3 K. Q, p; e
upstream monitor_server {* b, s! g- }9 S) U: [3 m' L
  server 192.168.0.131:80;
: R% p; K  f! V9 I) }    server 192.168.0.132:80;
; h) d$ I8 `+ ~}8 j+ P  i( s1 v6 s
  ! R4 O. I! u3 X" ]0 x. K( @
server
/ Y" b; Z9 j  D' V{" @- J. }; Q& s) k. L% A2 n( @$ I
  listen 80;
* g  h3 C; R- W$ [0 l) f  j8 X. I( u9 x  server_name nagios.xxx123.tk;
' a2 M8 r* U4 w5 ^( O4 P+ `  location / {
5 h8 l# q8 ]7 a6 ?$ A# [+ S    proxy_redirect off;5 ^7 Z$ C$ A- t2 `6 [- w) `# C* \
    proxy_set_header Host $host;/ [3 |; l5 J  v6 c
    proxy_set_header X-Real-IP $remote_addr;
5 S: T+ P4 F( C9 [7 Q    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
% L2 j) O3 h; p: K8 D/ m    proxy_pass http://monitor_server;
- T& a- k- s3 b3 ^- W9 K. |  }
8 p. A* S: s; R# X& R1 `$ B4 L  access_log logs/nagios.xxx123.tk_access.log;5 ?. ~8 L; f$ [, w
}% b+ D/ Y7 A5 |. Z( k/ T+ t" Z

8 A; ~  E% S1 y额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
9 z6 v7 \, S* e+ s
' {1 J) d7 d0 X! {" Llog_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" ', J$ S' D3 [% J3 }& u9 I2 V9 f
'$status $body_bytes_sent "$http_referer" '
2 P8 p% U% w! h1 i2 M$ U'"$http_user_agent" $HTTP_X_Forwarded_For';' C" V: ?7 E3 k$ W/ ]
  1 A0 f( S* l3 W, M
access_log logs/access.log access;
2 e7 I5 \: f8 x7 f& C/ _6 F+ \6 j7 ?
$ v: m, A0 D/ l" t再看看原来日志的格式长什么样:
1 e# p4 B7 J. z" U( @, {# X- \5 O8 V- `* [# n
17 z! d: `: e1 c. e- y; U* d* n) P; W
2
7 D& A8 l! J/ N# B. h3% r4 t$ \4 S# j# V5 |5 E) }
4
! O& v1 l4 x; J8 p, w. H5: f* [( h2 w0 \$ i8 X
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
: f% `/ H6 h. d( \# '$status $body_bytes_sent "$http_referer" '4 {1 e: o4 C+ Q' r
# '"$http_user_agent" "$http_x_forwarded_for"';
' e# g0 d# k5 M5 }% C  ) e9 \3 l. v5 l: W: b5 z
#access_log logs/access.log main;2 F- a+ W. k0 u& m
看出区别了吧   遇到的问题   之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查5 o. n/ @2 Z- ~# L1 g5 P8 q

& Z: T  S! e; w0 y1
- {, i! Q; d' u+ C3 v  V26 u. h( n% T! f! D
3
) z4 O9 N1 u: I8 ?4 m6 T4/ U# Z# h" n. v* w
5
/ r; P- J5 t1 W0 z( D( C  O+ \7 {2 J( \6
! D# a- K5 j7 Q5 M% C7
% X: V, Z% V7 U7 J- d$ X6 ?83 P0 W- {) m; K3 t5 _: H# [
proxy_connect_timeout 300s;
! p5 L7 m2 _/ s8 T9 d7 Eproxy_read_timeout 300s;" w; O; Z9 B  N, c2 A" t% Z: j
proxy_send_timeout 300s;
, Z8 ?7 G- @1 {' P3 ?proxy_buffer_size 64k;
  K, ]. S1 l2 L- K$ Zproxy_buffers 4 32k;
' n4 @, M+ [" q1 Y; D( D1 D( w; U5 _) yproxy_busy_buffers_size 64k;4 s* {4 x% ~6 ~( V; S: t
proxy_temp_file_write_size 64k;/ F) m' b0 m! n6 F; k
proxy_ignore_client_abort on;
6 }1 v: K5 C+ I. E报错日志:/ w* Q# D& {1 u; V8 Z5 P

& j% O0 K: ~( M( b8 T8 r& j' E2 Q...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。& O; P7 y7 F/ F# h2 f  x
1 q' A) d: k0 ?* e. x6 U* U% T
PS:关于域名转发
# y9 O$ h- |9 X# Y: O1 i2 U5 E+ C: Q
所谓域名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/ 的内容。. q+ V! H9 A" M% _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 14:28 , Processed in 0.060237 second(s), 20 queries .

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