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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 11286|回复: 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
  E) O9 R3 O5 @3 _) K3 V$ }7 }; Z7 Q' |2 d$ q
  1. ###更新仓库$ N, u3 S6 h- ?6 n4 h$ D
  2. 2 O2 a7 o  E, v# }* s; t) Y; r/ [
  3. apt-get update -y$ S; _& n+ e$ }
  4. apt-get install wget -y( E  \" e0 a+ K! w2 K7 L+ Z
  5. #下载nginx和相关软件包
复制代码
1 R: {/ v( U2 a7 c; @

( [: z6 Y! u8 f: L' Q7 ^pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。1 T) B" ?3 R" {0 p9 R7 {
+ i* @7 c+ ^; T! ^: k9 a
  1. cd /usr/local/src
    $ y3 p/ e3 b5 u4 \& Z
  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, t* p9 |- C1 }& s
  3. wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>
    1 T3 T$ P3 }- I. w# [
  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>/ Z: Z' r6 X0 B! _" t
  5. tar xf pcre-8.33.tar.gz
    5 j4 P% K5 O- w
  6. tar xf zlib-1.2.8.tar.gz- y' ?( j4 _# T7 P( \, U* ]
  7. #安装编译环境4 X- a8 `! d; w
复制代码
! y- M- y$ k5 }5 k# k
( z) F9 H7 G* [' m, Z
apt-get install build-essential libtool -y$ \: w. R" K! h/ a# r: B
#创建nginx用户: }- F8 h% d' W: r
# d6 }/ b; M: r) c
所谓的unprivileged user# F' ]5 K6 C  G$ O8 A

. [& q$ b3 u" X
  1. useradd -s /bin/false -r -M -d /nonexistent www
    # `' b, A- H& I% [, e
  2. #开始编译安装
    . i" X7 {: o. \; r7 r4 h

  3. : M( T3 D% _# }9 Y6 Y/ G. \6 M. ^
  4. /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \$ S8 p+ i! G) F/ c$ L
  5. --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
    # Z: z1 \, [! f, [" q  N) P9 X9 l
  6. make  d4 u4 i0 `0 G- u: z' |6 z
  7. make install$ T1 F0 A5 q$ J) ^& t+ f% j
  8. #给文件夹授权
复制代码

. }- n1 x. d7 v+ v4 y
4 P$ I- I" s, q. @$ ?chown -R www:www /usr/local/nginx! j2 P8 Q/ f" w3 [. _* D0 I+ K
#修改配置文件
* z! E4 @* _- fvim nginx.conf
6 h" |+ f1 E( a$ z8 f" D3 f! T2 I& \5 d# N' \% u1 o& y
user www www;
' J- n" g& _& u7 Jworker_processes 1;
0 B. S; v3 L8 t# D% perror_log logs/error.log;. [: ?2 ]- K2 e  d+ x; L
pid logs/nginx.pid;, @. f% H9 T2 r; F& ^1 y* V
worker_rlimit_nofile 65535;
, k, ?/ C) k' Z" s0 ?  e, o+ I) `3 U* {events {( [+ G/ f8 q3 y2 x) T# M
  use epoll;8 L4 W8 K  \" I" T6 Y3 b2 a1 R) L
  worker_connections 65535;+ B5 [7 V8 V$ Y1 c
}
0 `, m4 A5 u9 Y# Lhttp {8 V. y& \- c, f  P) i& n
  include mime.types;
6 ~! A; |0 [( F4 u; P% V1 h  default_type application/octet-stream;
9 F) {- E, d: p6 V  include /usr/local/nginx/conf/reverse-proxy.conf;4 P* f3 b8 Q, ]# c4 T
  sendfile on;
) \' D! x0 g1 O# U$ P  keepalive_timeout 65;" Y" X1 e- m) E  q& o
  gzip on;) j' F9 f: h9 m! C& A) x3 A7 E
  client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
8 A5 F0 R5 S/ k0 l8 ]. J/ i/ d, \  client_body_buffer_size 256k;
* i1 O3 S, P/ H, q. t  R4 a+ u2 M& V) K  client_header_timeout 3m;3 X6 W5 {+ S% s. U9 w
  client_body_timeout 3m;: ]2 ^1 M0 X: k/ U* k
  send_timeout 3m;' U0 F& j4 ?* R- e4 J2 o
  proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)4 A4 R( y  U$ {9 K) a
  proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)& R, B9 ]% d2 c  Y
  proxy_send_timeout 300s;# O$ j4 Q3 E5 x1 z! F
  proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小9 Y: T: j  g  E1 c9 s
  proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
# `9 X, P: S: D# n  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)! d, W( G$ V2 ^7 O
  proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
' a+ ]0 k3 g' T1 C& _! u3 `  proxy_ignore_client_abort on; #不允许代理端主动关闭连接
$ e2 s9 J0 J0 h: e& D  server {
$ M% m% E3 @( o4 W8 p9 k. O- j" F( v    listen 80;
( Q+ [" R5 }( {! T$ S( n  ~    server_name localhost;
8 u4 W2 G+ p  D1 ~1 H7 m- }    location / {: A- R+ B" y# M3 Q% Q+ x" s
      root html;
8 f; D5 u! o4 q7 Q3 }      index index.html index.htm;
# h  a* f2 b; b5 @0 O7 u    }% W' |8 u: h0 Q6 i
    error_page 500 502 503 504 /50x.html;
/ h( g/ w1 M3 U    location = /50x.html {
* q: V( ]6 X' j# O      root html;
2 n& A9 O+ c4 j& W$ w3 V! C2 L; H    }
) N: W# R4 E! g- w) Z9 @" ?4 o  }
' O; T6 @6 q  m  M% r/ E4 I}( j& {! L" n& N0 u+ h( u
: F+ c( b; W# [
编辑反向代理服务器配置文件:6 t2 H2 p( k. j5 M1 \! I

8 P  M! Q& n+ p& q7 U  tvim /usr/local/nginx/conf/reverse-proxy.conf
' @3 M/ a2 Y- R# n9 Y# F9 H
0 \' ?* I  g6 T! kserver
7 j1 ]0 Z6 L' F4 s! ?{
$ A. p) \8 r' K* V  listen 80;
1 O4 s4 [3 `0 R( i" g$ H" s  server_name xxx123.tk;
! x& Q4 d0 c5 U) I  location / {7 k0 _, j9 j0 I/ q4 `! N! O
    proxy_redirect off;
9 u) o1 p$ {9 H. m' O5 [4 B    proxy_set_header Host $host;" W0 I8 |- g5 W" y/ L# _
    proxy_set_header X-Real-IP $remote_addr;* J" p7 L. g% J0 E* ?9 S, f. G3 Y+ l- J
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
" H9 e: J, Y. a% q    proxy_pass http://192.168.10.38:3000;
; ^- I9 p6 p+ Q: K# o5 |  }
! `4 a5 K! \, z7 d" V$ E  access_log logs/xxx123.tk_access.log;
% ]  I9 ~/ C, a}
( e, h* \" P$ D+ c& Z* P  7 j( G0 Y5 H' z2 b0 b. ^- b
server
0 U) v0 r% X3 m- k/ l' w0 e{2 Y) I! p) d6 P" [1 k2 S
  listen 80;0 O( U' c. |7 ?/ F% B
  server_name xxx456.tk;2 k" R: C, d& ^# D+ B& _& c5 y# G
  location / {1 `5 E6 {- L2 P1 U
    proxy_redirect off;
4 E3 d! z6 E( d1 l9 Z# Y& l    proxy_set_header Host $host;( `! d; v1 w0 V* U/ p
    proxy_set_header X-Real-IP $remote_addr;' F8 R& ?* K) e
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;7 z7 g) ~+ ?6 D. j1 S4 E0 y5 H2 R
    proxy_pass http://192.168.10.40:80;
% ]! @) r8 V3 `; S- Q  }
9 Q! h$ ]9 L: m- c1 h  access_log logs/xxx456.tk_access.log;' x8 T7 q  x3 j/ {! ~
}
/ S7 q( u0 B/ _( g: e; R9 o; e
4 L, t1 ~$ s% n( V, u$ f然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。/ g" ?; G( w! j% s0 V& L
& f6 h3 g1 c* n0 J
upstream monitor_server {5 }* A; ]9 L! y+ _" T
  server 192.168.0.131:80;
, b: ?. T5 z: i    server 192.168.0.132:80;
2 T4 N. I7 C2 |* U( e5 L}+ Y) Q+ b: d1 t1 j! \$ f- T
  
' o/ p0 Z1 d3 m2 B- l5 b  k$ rserver& X$ E5 t2 m' N8 o6 o- g0 n
{. B0 @: G# O; r9 L. o6 O: ~
  listen 80;# F4 f5 h' J7 V# i0 u& x
  server_name nagios.xxx123.tk;
. r9 r3 ?. ]0 n, ?6 u  location / {
5 e; `+ A( `2 y8 v' b; e- n    proxy_redirect off;7 X* f8 B& v$ w& d
    proxy_set_header Host $host;
/ u+ V1 D! [8 ~3 t: }! Q    proxy_set_header X-Real-IP $remote_addr;
' }% B: ^- e8 c8 |    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; * ^$ E9 s% y# g
    proxy_pass http://monitor_server;- E9 S& Y1 {; T% a& p
  }
  T* `1 W, J. ?4 R  access_log logs/nagios.xxx123.tk_access.log;8 ]! i1 M0 V+ @/ {; n  P
}
8 w) b3 ]. l. S% D4 g8 V% O1 d3 W: |4 y
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:" `. `0 Y( Z( }* T$ u% h- s* N9 f

# A  [/ Y( T; Q- x3 flog_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '& w. B2 t6 L: y! J/ Z; ^
'$status $body_bytes_sent "$http_referer" '
$ I/ M9 x4 g& B) d/ g'"$http_user_agent" $HTTP_X_Forwarded_For';
. r9 x! ~" I& |/ v  
1 ]' c3 [( D7 }; s3 P  N3 ^* ?access_log logs/access.log access;. Z. X" E, }* E& L# U9 ^
2 ?* q& b! U* S+ a6 ^
再看看原来日志的格式长什么样:
% I- ^) y0 \& d* D0 {5 q7 T) m. r9 E2 T5 j: g3 f
1
3 A0 x& |- u# O# X: a; [: V( S5 @2- Z# W% W. R$ v. B, D
3; ]2 {# Q8 X4 `+ k+ z3 D
4. s4 r6 V( \* \0 r' |9 M, Q
5/ N2 I1 ?1 p  Q$ \2 ?# i, }
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
6 n, p# o1 A$ |5 e5 f# '$status $body_bytes_sent "$http_referer" '6 ]4 ]# H$ ~: n& M+ c
# '"$http_user_agent" "$http_x_forwarded_for"';' W  M& ]2 M% h( @! f0 ?
  
2 L6 i9 e  P1 j$ y8 m' J' y4 {#access_log logs/access.log main;7 I8 X5 o+ J) n# g2 d$ x% W
看出区别了吧   遇到的问题   之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
" H' f" H/ s! [" u0 e* y
! Q0 }3 ~( k* ~5 |! {; a4 U4 O" L1
1 `# w3 }2 Q) W8 f2
1 }- l/ g* p; S5 J3+ p6 x. q% n0 ~$ Y
47 ~& X! p( o" G
5
$ g9 f2 h$ y& B6
) ?& \: _1 x- ]2 u5 r0 R78 q% ^  N- I# V3 e; m* Z
8
6 C1 R3 I3 U! jproxy_connect_timeout 300s;; A) C. E0 V9 F$ q" v; \) P
proxy_read_timeout 300s;
# G; d: @1 c0 J8 A, J4 Dproxy_send_timeout 300s;
8 }. ]5 D$ W0 o) S# G+ Sproxy_buffer_size 64k;
; h( E: X5 R7 j. h' aproxy_buffers 4 32k;
* z: ?- U8 }) |( D8 cproxy_busy_buffers_size 64k;( ~+ o+ ?# Z; R
proxy_temp_file_write_size 64k;
2 b. O2 e0 O& o% {proxy_ignore_client_abort on;, w4 @+ O; b/ Z. s5 {# X( t
报错日志:( |; @) ^4 j: N( `4 b) V

& q( n6 L* ]: E9 a...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。
" w$ w! ^% J- i# s4 z, E
0 D' Z% g% _" A7 M! {9 y- g4 oPS:关于域名转发
; M& _7 H2 N( M6 N7 D0 F" \# u% ^$ `) l8 [# ?/ o( |7 p
所谓域名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' t  R& S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 16:50 , Processed in 0.121784 second(s), 20 queries .

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