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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9666|回复: 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
6 u! r9 x! Q- O$ O0 M: u( ?0 ]( j' Y, v) T/ B+ b( }# w
  1. ###更新仓库) w& d1 |. {" n3 S$ ]

  2. & y, Y; r5 V+ Z! k* j' B
  3. apt-get update -y
    / b! E/ ], d# T
  4. apt-get install wget -y
    - Z3 ^1 y8 H! d: h
  5. #下载nginx和相关软件包
复制代码
) D9 d' m2 X& u$ S2 s: _

# ^$ K# I' \& f* n$ vpcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
* G/ ~) c- v5 u9 N( d4 X6 I: r# F8 n+ P8 l. i) d
  1. cd /usr/local/src$ a, X* d7 p  r" e0 F4 h
  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>
    + i: D7 s  Z, Z
  3. wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>
    $ Y' R, n) Q$ U) j1 N0 l' |
  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>
    $ P3 N1 e. r! p/ X" W& i
  5. tar xf pcre-8.33.tar.gz5 b2 D7 ^' C1 G4 v
  6. tar xf zlib-1.2.8.tar.gz
    " F4 N" E5 J; d6 i
  7. #安装编译环境9 i5 n6 d/ e- p7 H$ f$ Q
复制代码
# h9 R- q) I' ^6 J2 p
+ m! K/ o* O! I8 D
apt-get install build-essential libtool -y
* H# E" E8 Q: z' ?% ?! o( S  [#创建nginx用户  P# V4 Z' d. x. y. N
* q# E% p9 ~4 w, w( t6 K& {
所谓的unprivileged user
. n9 l+ a- X7 h! \8 m) A+ y; j) r  L& X( @
  1. useradd -s /bin/false -r -M -d /nonexistent www. f' W. p5 v8 i! Z2 W9 _* ]: o
  2. #开始编译安装- d4 \4 ^' D+ W. B6 e7 q' c5 r

  3. " `7 v; X( l. K3 s# O7 v/ i9 A0 Q
  4. /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \/ u1 k; S* @8 l) Y1 p! t
  5. --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
    7 [7 h5 R/ P/ x
  6. make
    - y0 R. \. u. E) A
  7. make install
      \& L$ X$ ^$ l% G2 o9 {/ n3 a
  8. #给文件夹授权
复制代码

2 K8 H% N* L' k   [& Z9 r5 M* b7 M' x; T
chown -R www:www /usr/local/nginx8 x" T3 O* |6 ]- J0 n8 O% b
#修改配置文件& b5 b. g2 c1 E# d
vim nginx.conf6 Z2 |& m# F9 A) X" Z
. x% }0 z% l8 x2 J! Z; V1 {
user www www;9 d* b0 Z( R  m' k4 i9 Y
worker_processes 1;1 R: V! A+ b( S* p& J9 {
error_log logs/error.log;; W  G% \, I) G! u0 X
pid logs/nginx.pid;
) P/ l* F9 b0 X5 N0 dworker_rlimit_nofile 65535;9 t: D, h4 s5 i- R
events {
3 V" L3 ~  s7 T! M3 Z& n  use epoll;
( y/ g# s" o; Y2 M  worker_connections 65535;. g# F0 K) x2 O- A# ?0 c; N
}
/ k  \% i: r& n- S# }http {
0 v) P& Q$ C4 x& `  include mime.types;& c( D5 y! A5 T; x
  default_type application/octet-stream;
* b5 P$ g& z" _0 O! ~3 f1 }& c  include /usr/local/nginx/conf/reverse-proxy.conf;* b# W8 g4 E% a* L- p9 m
  sendfile on;
  P( B/ g" I  k1 I- E  keepalive_timeout 65;& U6 _2 n! n# }3 ], R
  gzip on;2 N, h9 R1 ~7 f. B
  client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户3 G- a% {; }0 c0 C/ y
  client_body_buffer_size 256k;
- ^, e" c) Y' h& ]  u  client_header_timeout 3m;3 p2 I$ s' y5 S  p- I. l( g6 {3 A
  client_body_timeout 3m;
9 w  r* E- s! q4 O6 ?6 \  send_timeout 3m;4 W' @# H- v' a5 P; D: t" _
  proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)! b. v7 V" _3 `( l6 W* v
  proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)9 b( U) p/ P: c( @  u! S4 O4 A: F
  proxy_send_timeout 300s;: }* o0 r2 @, @4 B; R! X! d# h
  proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
! h) Z: G3 U  ]8 D  proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
( y9 L( g: M5 _3 {/ _2 l. Y" T  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
- I2 x) O7 B7 u6 u  proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘, t# o% z$ j0 G$ [1 G
  proxy_ignore_client_abort on; #不允许代理端主动关闭连接" R7 W7 h8 G% G" X4 e
  server {
7 }, s+ R; N! `    listen 80;
- ?+ v6 A3 m  f- Y7 N) L0 e/ h    server_name localhost;3 E4 P, Z3 }$ y
    location / {5 }3 a$ m; S: `+ C& H  |; b* o
      root html;* v# f/ F3 f9 b' t+ T
      index index.html index.htm;9 Y. L, x  ~6 T( ]
    }1 n/ u. P( V( F) R/ ?: G/ ~
    error_page 500 502 503 504 /50x.html;
2 _8 a6 H; W+ [    location = /50x.html {. I  h8 r  V; W3 ]: U2 N0 K- b( M
      root html;
( s- u# K7 g7 }" N+ x    }  Z% W$ v9 h7 e' V6 ]1 R; i
  }
0 H# ]% D, b2 g. J2 ]}
9 K+ m3 M9 @; z6 }* ?4 b
* |. r7 _6 W- @+ i; {编辑反向代理服务器配置文件:
' E$ [# {$ i$ r: K( ^
/ G6 K$ R" n8 I* p# k( o. V9 Svim /usr/local/nginx/conf/reverse-proxy.conf
' t, j4 a5 ]; W4 \3 x
$ v2 u* {6 y; xserver
9 Z: C1 Q; z  g3 A$ f+ a{" x8 T" p6 ?7 H( H: d5 v) a
  listen 80;' D& r5 y2 f6 ~+ |: R5 H! W
  server_name xxx123.tk;/ Z) t1 g- c2 z9 S0 h/ r
  location / {5 i3 p. ?2 }9 `/ ?2 W5 L
    proxy_redirect off;
: U; n5 X# G0 Q& }4 p0 z5 r! s  c    proxy_set_header Host $host;
, x) W: r" Q! F  e0 y9 y    proxy_set_header X-Real-IP $remote_addr;
/ G- W4 \! ]3 B3 k% P' h8 s# b6 J    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;) J* s# f$ U( {! y! n; M& O
    proxy_pass http://192.168.10.38:3000;
: L) x/ m, R4 D2 d7 Z& ^# L+ X) O$ ~7 d# f  }$ _' y6 |4 F) O2 A* f" m. B1 T
  access_log logs/xxx123.tk_access.log;  B& D$ m- v, j" _( ~! b# k) |
}" L- T" P1 Z2 h: c( _3 V
  / a, f) G9 E* d# Q( a( H6 O, o
server8 g7 c% H& _. P  X
{& X2 x/ }$ e$ C; u) x
  listen 80;5 I) j: E- Z. o' D9 Z1 B  B- n
  server_name xxx456.tk;0 a: U+ O5 n! A/ T
  location / {
5 u5 O: ^, F, _5 u    proxy_redirect off;
$ @$ h$ P7 \  e4 m# y( ?  y2 V    proxy_set_header Host $host;
; v: e$ R! l6 C    proxy_set_header X-Real-IP $remote_addr;+ l6 l$ q# d# c
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;2 s1 G5 w& P9 Z8 F! H
    proxy_pass http://192.168.10.40:80;
! S+ p: {& C: G; d  |  }+ F! v- j: r5 g2 U
  access_log logs/xxx456.tk_access.log;/ ?8 N! f4 o, C9 t
}6 Q# ^) B, L" B0 J- r$ w
8 v  R0 _. O0 C) Y
然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。3 t  d0 x7 x$ C5 c, |3 S
  d4 f+ r4 i3 n. J5 a
upstream monitor_server {% H: R  s. c/ M0 C
  server 192.168.0.131:80;! U0 d  A* j- i7 q: b* F' {. {* A7 Q
    server 192.168.0.132:80;
/ C8 P  ?3 Z2 V, x4 l- j+ c3 |}' S8 f5 ^6 A' X
  
8 D2 }7 ]: B( Tserver0 A0 d$ ^9 h6 R+ N% Y" r& E- ?6 k
{
5 b: i; v3 ]3 f- V& O+ V& f  listen 80;
/ n+ H4 v% W0 s  server_name nagios.xxx123.tk;0 ?! C& C0 i5 r- ^6 s2 ^8 |/ k
  location / {
# L1 M  H# ]9 u3 Z    proxy_redirect off;% k4 |7 E% F$ q$ J- X
    proxy_set_header Host $host;
& @/ e6 M: J- b- H8 _. _2 S    proxy_set_header X-Real-IP $remote_addr;0 D# [. }% i' V/ V
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
$ ?8 U( L; L9 r" U) R    proxy_pass http://monitor_server;- `6 R; \1 w. j% q! @
  }7 x* w+ m! Q) o# u; g5 k+ l5 m0 Y
  access_log logs/nagios.xxx123.tk_access.log;
' v2 @- N9 K6 J; d" n0 s}
  _. L$ w6 i' d- \2 r" ?) [: b. k$ ?( \3 J4 [% K
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
- P4 n7 Y  V3 w) D
2 h1 Z3 H6 e% b0 n4 h1 q; Blog_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" ': G9 X' o+ a, t, K
'$status $body_bytes_sent "$http_referer" ': G. Y0 w) T0 ]. Z6 b+ @
'"$http_user_agent" $HTTP_X_Forwarded_For';+ J0 n4 c$ W# o% s# j# F, }
  
5 s, r7 F2 V1 x0 ~access_log logs/access.log access;3 a. A5 R9 ^( n( @% a2 t* M

/ U% B# P7 G# E9 w# U! B再看看原来日志的格式长什么样:
. c7 [) G1 f* j. B! k7 e' f: `
& g/ w) x% g. a* `5 Y, n1
' W" s2 S2 v& t* f. O6 m" M% H25 y1 ^5 U1 O/ p4 Y; Y. g; ^& X2 ]
3
3 d+ X; D7 h) B) }8 K+ G1 s# z4
% {$ ?  A* t; b1 I; O/ X5. R5 X7 R" }/ t/ C+ {1 \
#log_format main '$remote_addr - $remote_user [$time_local] "$request" ': R9 c1 c0 u0 ^
# '$status $body_bytes_sent "$http_referer" '
4 d$ C3 H4 M& b$ p! @# '"$http_user_agent" "$http_x_forwarded_for"';$ L* c* d0 h. `3 A$ `3 X
  
# c9 P" ?. W! @) C6 ?) }. B#access_log logs/access.log main;
% k. X9 v% m! `/ Q' ^7 G% D看出区别了吧   遇到的问题   之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查$ G# D$ ?' Z0 u. n1 c$ c& i

1 i  I. R) f4 |% B4 A. c1
, k0 i8 l/ }. l$ B; B. B3 L2- l! a. r: D  Y+ [2 \
3' ~$ _. c' x9 d9 T& ?2 S
4
  u8 J" A" z' L+ h9 g8 C8 c5" |4 Z3 p2 c8 X2 R7 h
6
9 X3 g9 C; g9 S) I6 @5 c) F7
# x! b4 ~+ f, X* y1 i8
* x+ r' B9 {5 X# Sproxy_connect_timeout 300s;7 S% u; s% U6 M7 t4 k  k$ @
proxy_read_timeout 300s;, v6 L, t9 U% F/ V
proxy_send_timeout 300s;/ o, q& u- L0 e! S8 V
proxy_buffer_size 64k;
4 ?7 L$ |, |* p, f- z' Wproxy_buffers 4 32k;) w! s8 H# t3 }) u- g* g3 B
proxy_busy_buffers_size 64k;) f) ]5 ]; l6 ^1 Y0 i, ^
proxy_temp_file_write_size 64k;" f8 H0 ?+ |3 |( A. X
proxy_ignore_client_abort on;3 N* S! |. ~9 w! h1 j( m" }$ b% A
报错日志:$ U! y0 ?* k  r# O, Z9 d( Q( x

5 u: q, @1 q2 @1 Z1 Q- g+ T...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。( E0 B: c; E/ B2 j: M
7 r8 ?  d. f. I3 i: I
PS:关于域名转发$ d# C% ?8 m0 D4 n, E
- c5 Z! x& w3 i
所谓域名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/ 的内容。
2 u& c" M- L9 j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-20 15:41 , Processed in 0.113389 second(s), 20 queries .

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