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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9478|回复: 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
1 T, q! d* p0 ]* K# S
, H. }- @, K4 U% p
  1. ###更新仓库% {  M9 v7 }' ]" ]6 e$ O/ G

  2. * N/ t4 ^4 h. x6 H
  3. apt-get update -y( y+ c( a0 b0 _3 p. v$ T7 v
  4. apt-get install wget -y
    1 p7 I3 S8 O+ d. Q
  5. #下载nginx和相关软件包
复制代码

& f6 S8 a3 e4 q4 J9 U( e' I! z5 O& o* |' |
pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
) y9 @% _* H7 c$ V; n0 r7 S8 w) H( ^/ m( A# E
  1. cd /usr/local/src2 i1 P. |- g! g% u7 ~
  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>
    ) w- G$ a7 F1 _0 r& Z: j1 w, J
  3. wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>
    9 n; h) i- j0 g+ M
  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>
    4 F8 L0 N! i0 W  e- i0 A& J. u% q
  5. tar xf pcre-8.33.tar.gz
    6 k1 s2 ~; A5 D
  6. tar xf zlib-1.2.8.tar.gz- X. L7 b( o3 P, g' t' c
  7. #安装编译环境) X: G0 J9 Q4 D: L7 p
复制代码

" Z8 Y8 `' i  y% W : v) v1 l  T  [
apt-get install build-essential libtool -y
* V( P) `4 \, f. G3 t  w+ j#创建nginx用户
" x3 z8 X! ?& K: N$ Z. B, I9 W3 q( q2 ^
所谓的unprivileged user
4 q0 _' C1 p, X0 I8 F8 t
0 m* f4 F! }9 p5 h* J' R
  1. useradd -s /bin/false -r -M -d /nonexistent www- M0 ^5 i+ X( o" s+ P  S8 P
  2. #开始编译安装
    7 u4 m) C+ q8 ]% c  {' K5 Q
  3.   j, |5 _1 ]# D0 k, P
  4. /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
    & j) M  A) W" ~( Q& {
  5. --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module+ H2 t) h# X" e9 @8 A* H, W, u* J' ]
  6. make
      \) R4 m# x+ \+ D* l+ j. j# y
  7. make install5 D. z" N8 i, T, u3 ~
  8. #给文件夹授权
复制代码
& ~0 s5 w0 R- \3 U$ I3 d
- F& ]" n! o7 f6 P1 g
chown -R www:www /usr/local/nginx
$ C; I1 M; ^6 g#修改配置文件8 T" I+ i' F" a) d$ W  i
vim nginx.conf
: V. R% t9 E7 d; j+ Y& g) q% h" }- j. |2 d- b& T2 \0 i7 w: ~
user www www;
) o7 x* s# a+ \. @4 l+ I" Gworker_processes 1;2 y( j  I' i) g1 y) B
error_log logs/error.log;7 N/ D8 w9 |5 y
pid logs/nginx.pid;
5 }* W7 ~; V) I% {8 v! F# Gworker_rlimit_nofile 65535;
. w1 ?4 n: O! k* t) _" I4 H- vevents {' A8 c$ Z, Q. h. m; l* k2 t
  use epoll;
) T' U$ H: \1 X4 b, i  worker_connections 65535;# n& y' u2 u9 q2 d
}; E$ s, [4 u2 K5 Z
http {
- q' T, m* F  V2 E# y  include mime.types;3 `! {# j9 J7 c  m
  default_type application/octet-stream;
7 D; n# q, W! N& o  include /usr/local/nginx/conf/reverse-proxy.conf;
3 `7 u' L  W; b! Q  sendfile on;2 z8 p$ ~+ v' f$ m+ N0 [
  keepalive_timeout 65;' {, e$ L5 E. z0 T) K8 V
  gzip on;1 d3 h5 ]0 Q7 L1 I& B4 W% H
  client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户1 ~& J- z; {* z& t
  client_body_buffer_size 256k;
! U' ?7 v3 x4 k1 z0 O- }  client_header_timeout 3m;
, r0 S: f* ~. o; {  client_body_timeout 3m;
# W: a) }7 w. W  H0 K: D0 A  send_timeout 3m;. U' F" U2 ^% ~- _% Y
  proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
7 Q. E. i* w+ j# e3 c' o0 W  ?6 B  proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)4 ~: }+ K4 |! `" C+ k
  proxy_send_timeout 300s;3 F  h+ j  m; a; o& d
  proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小' H! M1 @  {; C  Y1 M$ z% l% n
  proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
9 L$ c# M6 ~4 |$ Q, f. O- B  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
- n6 j1 Q0 X3 ~( b) u9 B9 A  proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
+ Y6 J: T/ A/ k  proxy_ignore_client_abort on; #不允许代理端主动关闭连接
, F( N! x6 u! k. n& V9 R  server {  [, v+ M. ~8 {- E3 M- T
    listen 80;
. c5 _  G; K- ^! I& S% ~3 ^; e    server_name localhost;
( X$ m) n7 t! u) I' \    location / {
9 S+ W& e# j; c& z. c3 r1 |4 e      root html;
2 `9 \1 E0 a! x, b9 L      index index.html index.htm;
1 c0 [2 b" c+ q( L3 O    }
6 K9 l& }* g! a+ J; ]    error_page 500 502 503 504 /50x.html;
; C/ J" `; G, x1 I7 g9 J    location = /50x.html {
* F% v8 j2 {' v      root html;: K% k7 c" S2 l
    }
3 N0 `7 M, E: s0 r/ ^3 |  }  ~; t* s0 l! @5 {& l
}
9 [0 g: p4 P0 u5 W* o2 l' \$ S6 k( q8 N# _
编辑反向代理服务器配置文件:! W# e+ h) `8 F  p0 z# `
. ~9 H. @! \/ J2 f
vim /usr/local/nginx/conf/reverse-proxy.conf
! Q. O, h  a2 r# w5 ^9 `/ ^, N
+ o5 D9 x  p! E& [server
! q/ f, h7 Q8 f$ {; _{9 w% f1 b8 ?$ s2 c, W, L' O2 `3 ?* K) ?
  listen 80;  x/ P9 ^+ G. U& d; e2 Y
  server_name xxx123.tk;
! ^1 P0 [8 o" _5 f  location / {
$ C8 {3 v  u1 t" T" |    proxy_redirect off;
$ X# U- d  q0 `9 D0 u    proxy_set_header Host $host;
  y5 Z# S0 [) n, G/ j& m0 u    proxy_set_header X-Real-IP $remote_addr;- P7 Q, |- U. f) e9 ?
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;* f+ C& _, X* G+ P( p- G
    proxy_pass http://192.168.10.38:3000;' Y. y# p0 x) G, l1 n
  }9 u  R# C) B3 _
  access_log logs/xxx123.tk_access.log;
) R! R7 `6 p/ k: T6 K7 t. W}9 u) v1 t3 G" d0 L& H
  4 D7 {8 F  g, k' y) J8 p
server
' B2 {. w, a3 X# T6 `: P2 L8 w{5 L5 I$ _) |: x
  listen 80;
; g4 y( Z) I: }1 g  server_name xxx456.tk;
9 {( ?% q) z  `3 c+ _0 t7 P1 }; X  location / {
6 b+ b& l- S/ L( J8 e( |+ m    proxy_redirect off;. F8 J% h! K4 k. z0 y. M; C
    proxy_set_header Host $host;7 c. }# O& g! ~0 w0 f) z
    proxy_set_header X-Real-IP $remote_addr;
; I: U$ x! p) Y8 B0 L9 {3 k0 h; n    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
! k7 ?" G" f* `$ ~  a    proxy_pass http://192.168.10.40:80;
8 x& W! @: c/ D1 M9 O% o  }  ^5 @4 M0 W% C7 F! J
  access_log logs/xxx456.tk_access.log;
+ O- X8 E% n2 Z5 u}6 c# C; `& v$ ^
! }) y$ [/ j$ M5 G" v+ t
然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。
& k$ R0 Q/ a* I) u- n8 ]  ]/ h, d6 L  [( @. ~7 X
upstream monitor_server {
8 v6 c0 `6 A5 f3 |  server 192.168.0.131:80;0 W% Z* D2 M: w
    server 192.168.0.132:80;& c# |1 G4 h! W: y; u) e
}
+ [# P  X1 x% y  
* d* M. l% ~% G/ Y, Gserver: @$ `4 ]$ i* o; x, f7 `
{5 _6 B5 d+ I" ^- D: f
  listen 80;9 J7 z. |$ }1 j5 l0 p
  server_name nagios.xxx123.tk;
+ A1 P( m6 W, O! P+ t% q/ K  location / {+ z$ M) A4 X  w! F' O3 M
    proxy_redirect off;# q. Y2 i- a; e9 w; W
    proxy_set_header Host $host;* W! u8 u, O$ E" J+ L: z8 m- I8 R
    proxy_set_header X-Real-IP $remote_addr;4 |" [6 E( w: m2 U( i7 j# H
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ( o  G8 a3 A! c( E) O$ a+ r" a7 q
    proxy_pass http://monitor_server;
' R' ?3 ^% k5 J. C/ G+ }! h  }& I' p7 h7 @' w6 Z1 t
  access_log logs/nagios.xxx123.tk_access.log;
; j1 J# m; |8 R. a}
* y0 Q- |/ L/ e0 e) ]1 z4 ]2 t$ f) @1 ^) ?! k* y
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:+ [) K# `+ E+ F& i# V$ z" W
9 _$ B6 L& \, E0 D
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '  d! E/ a9 v6 l7 I) ^; k
'$status $body_bytes_sent "$http_referer" '" s4 X1 d: V1 P
'"$http_user_agent" $HTTP_X_Forwarded_For';6 e$ D: q; j" b
  ) ]/ U) ?6 U, I$ B; v
access_log logs/access.log access;
$ _1 i% v" g4 k: h: E
4 i! v3 `* g! u% D9 `# X再看看原来日志的格式长什么样:" [6 M/ _* @' t/ Y* K4 K
. |" c. M5 p) v) O8 P5 ^+ h8 _
1; B. D; R4 y) B) ]1 X. R9 z' p
23 l. N6 \1 _, H  m" T
3$ A8 c$ c5 ]0 l  X
4
0 Q  Q7 \3 H' E5: [0 `) g8 |9 ?3 U8 H
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '  S1 H( Z: }' M) Q
# '$status $body_bytes_sent "$http_referer" '
/ V5 Y* x* G, B, @% d% ^7 o# '"$http_user_agent" "$http_x_forwarded_for"';$ Z  M, ~# d8 `* h( ]
  - \, N4 N7 ~& ]5 `. a
#access_log logs/access.log main;  D" q" a7 Q' o/ e8 d* m
看出区别了吧   遇到的问题   之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
0 ^. [6 e- a( P. }( t0 P7 K  v: _8 v7 H4 q( M' L  ]% F
1( h5 e+ c1 w0 V, Q/ M9 a! u4 j
2" a) \( q/ W5 H" S& {, a
3
# C, p+ B+ a! R4$ P/ }5 X4 U; Y% x' S, W5 r1 l$ Q
5' Y: A  }5 z* B0 f! }( {
6
2 L4 Z. s2 {) m3 l7+ n, T! p, c3 ^4 Y( c$ j+ u
86 Z9 F! a6 S8 {) k
proxy_connect_timeout 300s;# o* T: [( m  i- v& k
proxy_read_timeout 300s;+ J; Y" I) B6 C7 B
proxy_send_timeout 300s;; F8 _9 X/ s: U1 Y! M
proxy_buffer_size 64k;
% ]% v% W2 ^& w4 {3 ]& Y  Oproxy_buffers 4 32k;
7 m$ m, d$ Y( T: g+ N; Dproxy_busy_buffers_size 64k;9 o+ O' K' _' ], g8 X  j( {% {
proxy_temp_file_write_size 64k;8 B' b0 B- K* L
proxy_ignore_client_abort on;# j# @7 C( D" ?; C
报错日志:
* E% {/ m. ^! z- M8 D: U  K- g
& o- ~+ C2 O  F" [' b4 |1 Z" D...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。' t" M  b  v, J, a2 d( I  S' Z/ _
+ O" {  Y1 `$ y) T) H
PS:关于域名转发
; q) [, i+ w* M' V  k! K2 p3 O
8 {5 n0 g; V1 h+ M7 N0 C所谓域名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/ 的内容。$ C. l8 g9 N, H* l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-7 05:32 , Processed in 0.118276 second(s), 20 queries .

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