cncml手绘网

标题: Nginx服务器作反向代理实现内部局域网的url转发配置 [打印本页]

作者: admin    时间: 2020-2-25 04:54
标题: Nginx服务器作反向代理实现内部局域网的url转发配置
情景 由于公司内网有多台服务器的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
( G4 Z! U# N+ F5 I) c( V5 n  j- K) t! n5 B8 p8 [$ _
  1. ###更新仓库' u& X% O) Y3 B! p2 v

  2. ' I8 j  C# u9 }$ w: B  c( ]' O7 r
  3. apt-get update -y1 E2 k7 |' A1 X
  4. apt-get install wget -y
    + p+ _! G8 R8 x% P4 {1 s6 X
  5. #下载nginx和相关软件包
复制代码
8 [: V' @5 Z0 ]! _: e

' @7 L+ V2 S8 E, u' hpcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
5 R' p/ b. Q+ `9 m8 c
6 A4 ]: _( U# V3 W, I
  1. cd /usr/local/src5 v$ L8 S" ?2 p0 T+ o" I, ?/ Y
  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>
    # o2 ]3 U8 y3 p% L; e" y% p
  3. wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>; o9 r2 e, U0 ]) @" u2 N
  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>
    : B5 }2 x6 ?7 ?0 o7 h- [/ _! O
  5. tar xf pcre-8.33.tar.gz
    : ^. m5 D1 r1 V1 {: \0 {
  6. tar xf zlib-1.2.8.tar.gz
    / T6 a% ^9 B" {6 g% W+ B
  7. #安装编译环境
    : x3 S) e; I0 V. {" G" r* d0 V% p' X
复制代码

$ w, R5 P# p  R& i4 k + T& E# {" d7 A" }! G) F
apt-get install build-essential libtool -y
2 m; J: H4 Q, M#创建nginx用户
, C% M! @: _: A0 d+ P% x% q
* A% H# T* T: u9 k; ]8 Y) @所谓的unprivileged user
: ]4 O4 n1 ^- S3 u) N7 M2 D2 X- z- U$ E( @, s7 s
  1. useradd -s /bin/false -r -M -d /nonexistent www+ @; A" V% s( r; M
  2. #开始编译安装
      y& \" Y/ X1 M3 [0 w
  3. ' q( c+ J% D1 T2 E$ |- |; |
  4. /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
      n4 a/ H3 M4 E* r0 e0 ~
  5. --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module( ]( F7 m4 {+ e2 W; P
  6. make
    6 }- @4 m) N  q7 }' h
  7. make install
    2 _8 G$ q: I, P
  8. #给文件夹授权
复制代码

1 x$ g; }1 k8 _( c
' ^" U. D# j) g' Fchown -R www:www /usr/local/nginx
& Y1 s+ }; V6 Y  l; W#修改配置文件3 N# ^4 x0 u7 R1 D
vim nginx.conf
' h( M" Y7 K/ v5 g1 v
2 E4 t! T( N; N% K) J5 _user www www;
) j& f; v5 C" t$ Z! i3 eworker_processes 1;0 Z; q7 x0 p+ r2 |. L
error_log logs/error.log;" P7 E8 [; m$ g* X
pid logs/nginx.pid;$ e8 W8 [) \7 q: |: C# k3 a, ^
worker_rlimit_nofile 65535;
) |9 [4 L  t3 z' R3 d" }0 U; Hevents {, m- \% K! N5 R2 K5 U1 X1 i
  use epoll;
: J/ w. Y5 g* X7 w) n  worker_connections 65535;- X$ t/ ^7 q! k( m5 R; u! a
}
6 _& y$ D9 T  |7 Fhttp {- d8 U2 d. E$ p. L1 x0 F
  include mime.types;$ E- n5 n( \* c6 b7 o
  default_type application/octet-stream;
1 Q/ ^7 V6 d; p! C% t5 N2 g  include /usr/local/nginx/conf/reverse-proxy.conf;* l) S2 a* u. P6 j
  sendfile on;6 h+ u/ t: {% k+ I9 p3 e
  keepalive_timeout 65;+ V* B" z! h0 f6 Z$ E, V- N/ a7 ^+ U% d
  gzip on;
, R% ?8 C1 j! m8 J" s; R0 V8 t  client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
% U7 _% y5 C- q: g  client_body_buffer_size 256k;+ v3 h! ~/ N0 j
  client_header_timeout 3m;( ?1 b# C6 p$ y
  client_body_timeout 3m;0 _4 d9 }4 v% O, u1 m6 r0 E
  send_timeout 3m;
" O2 i* J7 U8 O: H3 b  proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
1 ^5 ^, D  {3 y& H1 C# R  D- V  proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)! a' S8 _/ [- ]: Y, S$ g
  proxy_send_timeout 300s;" H  t* H. G7 J
  proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小7 E7 t, x* W% F3 ^
  proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置4 ?. q" N4 L1 z* S/ r
  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)* r) w6 l1 k5 [/ J$ c# `2 n; E+ |
  proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
0 B, O7 p# ^, o5 `8 D+ p8 e3 h2 g  proxy_ignore_client_abort on; #不允许代理端主动关闭连接( e. T; a# f3 @1 }+ ?0 h# v
  server {
8 d6 }1 K, {1 @7 V9 l4 q" ?6 p    listen 80;
1 B' k/ G8 j; l, i) W8 i/ f    server_name localhost;
$ i2 z! Q& u$ f    location / {& i. [9 A, e. H( G: g
      root html;
( [: B, A3 g& u9 k' p+ G& _0 G* c" V/ P      index index.html index.htm;: |1 Z6 B1 l" K' w9 Y2 X
    }" y  p( O. ]: C
    error_page 500 502 503 504 /50x.html;7 `0 c2 J+ t5 p+ Z' [
    location = /50x.html {
3 K. M  C- X- R# h) g5 B# t      root html;% u. Q8 `% ?! a; e6 {7 f
    }
3 w. W/ a1 D$ Q, q; P% T  }: J0 v5 F- k1 N4 A+ C
}  d  E2 s9 I& k% e' w& f0 E
2 c& r8 M7 M) j6 z1 n
编辑反向代理服务器配置文件:3 B6 D- y, V5 \. A+ w

; D4 l- _8 K/ j: Y. a2 Fvim /usr/local/nginx/conf/reverse-proxy.conf/ K, \6 h7 f3 w5 P& s/ q) W8 |( c

  M* d3 V7 |7 B) J/ \, rserver
8 J* d& C$ i# y1 [4 g{- s. H8 p* x7 e1 ^, Z
  listen 80;
: Z; v( J- o- G  d7 h  server_name xxx123.tk;0 s( {% ?6 Q/ X  [) e
  location / {) {3 i  T/ F0 l5 Y2 }0 `: _( A6 L
    proxy_redirect off;9 |2 p" ^" A8 x" N: t
    proxy_set_header Host $host;  u" \# \' T. E4 L8 E# Z% I* f
    proxy_set_header X-Real-IP $remote_addr;
# ]* y1 g  y: x. c, R    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;/ L- q7 Z2 B/ B( ?2 d) c
    proxy_pass http://192.168.10.38:3000;6 K/ C: `1 R7 U' g. e. s  ]
  }0 n6 Z6 s% P) g$ F5 s, P5 n
  access_log logs/xxx123.tk_access.log;
1 l$ Q% n0 |* E( C}
) ^6 x& m  t: E4 s) d  
& R  ^2 x3 z, V7 F+ ^, h4 \$ Jserver
4 O8 l) N* c. K" B5 Z( d{
7 H+ x* K# O) a  v( i  listen 80;  W, f  n8 G# ^
  server_name xxx456.tk;
1 I: r2 _) E; `8 T, `7 [  location / {; b" u9 G$ ]1 t  X( @8 A1 o- h
    proxy_redirect off;
0 E! r! V0 {* q- V    proxy_set_header Host $host;% e9 d' @# H  Y( j5 j
    proxy_set_header X-Real-IP $remote_addr;
' d/ V3 o" R8 q  \% B    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
1 B( L- l: h3 B. \$ J% E    proxy_pass http://192.168.10.40:80;
# C  W1 P1 N! h2 K4 c0 w  }
: s- g5 b* d  @8 W0 M: g' Y  access_log logs/xxx456.tk_access.log;
" m) u, z; }( ^' ~! W7 l1 {}8 g6 j" `7 v3 V0 c0 _6 K

% K0 {/ J3 P) ]3 R; j# I) c然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。' ~0 P! L1 i$ c* H

" G4 H* p9 t7 i8 p6 P( C: [! m( v  R) ~upstream monitor_server {
# s" Y$ O' |* k. s8 P  server 192.168.0.131:80;
: u+ G% M1 I7 `9 v3 m; L    server 192.168.0.132:80;7 W& n9 P- ^% ~* l; P3 K3 E
}
0 y2 w9 U; w4 }# l& V7 U) }3 Z4 ~  9 |9 F& k  _  T, B$ c2 T
server0 J& E( R7 F9 M( C5 ?; E4 c  }) u) u
{5 g  f8 l- C& q* `& F( O. W: E6 G- t
  listen 80;9 n$ I; [/ X: I
  server_name nagios.xxx123.tk;
! N. W- D) E+ |1 M# p9 a1 ?- ]  location / {
9 q. q. m7 [5 I    proxy_redirect off;
8 y4 }* ?7 n. T2 I6 e    proxy_set_header Host $host;
( D, ~# }& B* [9 l# X    proxy_set_header X-Real-IP $remote_addr;( h& q0 m% S+ I$ i! j& F
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
, I, A3 C' ?( o0 y    proxy_pass http://monitor_server;* u  @6 X) a# }; @- c
  }+ Q. L2 D0 S* @( U/ ?, X
  access_log logs/nagios.xxx123.tk_access.log;' I/ }4 d1 l) |+ ]' U; Z: Y+ V0 B+ F
}& c- u' q+ @5 {& `! _$ c

& _/ _0 w0 H+ Z5 M& L. c) e( _/ c额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:4 n6 V$ X6 p9 g) O: J$ X1 g7 ]/ N
1 [  f- o& h' M
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '7 H0 k8 `; N: }
'$status $body_bytes_sent "$http_referer" '
  w; V0 S) P. N) \'"$http_user_agent" $HTTP_X_Forwarded_For';
% e* n4 Z) w& t$ P5 ^' w3 V: \  - g. N6 [" [  H7 V
access_log logs/access.log access;
6 M! x" d1 r- b* n# k3 i* u- w3 a( Z7 A! i& m5 f
再看看原来日志的格式长什么样:
- g: s+ j- n) a5 g  N4 y0 r% O7 n% G6 r
1( ~+ E$ A' ~* A* V2 K- @) t! [
2/ n1 F8 s& o% [
3! |' A0 L$ v" l& ~+ {' U. u* ]
45 W% D* P! ?6 i! p! ?
5
0 P- B4 ]  U, ^6 y6 b, j7 v#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
" T5 T9 p+ h; b% e3 m# '$status $body_bytes_sent "$http_referer" '9 o" E' g: F2 W$ p0 B2 T# Z
# '"$http_user_agent" "$http_x_forwarded_for"';' b" G. \8 h9 ]6 y& G8 O
  
3 k% f+ \  g% c; ~#access_log logs/access.log main;8 }5 R$ G/ v$ s' i8 j* E
看出区别了吧   遇到的问题   之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
+ D& K0 m" d: j/ |* L
2 ?5 V* E7 m7 Q* P# K1
, q0 r, w+ A* j9 ~2( p+ z( I7 ~. @) d1 m
3" {7 M" x% J6 D5 O9 W
48 i- Q" S" a$ I( r
5
( \/ }7 A3 [3 f9 r5 f+ X  W7 r6
- @2 |! o, o, \6 f" K5 b7
+ y7 ]; Y) J' e8
1 a0 }3 t* g+ l  T# `proxy_connect_timeout 300s;, C+ S! H- ?* L+ L  U0 I  Q3 v8 B. m0 n
proxy_read_timeout 300s;
( c. E" k3 s5 |9 a7 ]1 o* Z/ R  qproxy_send_timeout 300s;
5 F- q% D! I' x+ E9 O1 f: Wproxy_buffer_size 64k;: ~: j: M4 k) a7 G
proxy_buffers 4 32k;
7 _; H9 T0 R* B! S4 @, N" [proxy_busy_buffers_size 64k;/ R2 b5 |2 F! j1 v: q$ V9 x
proxy_temp_file_write_size 64k;; ^+ P7 D; g5 I
proxy_ignore_client_abort on;, f- M: ^. C1 y4 w
报错日志:
  t" c3 {4 k9 ~0 S# W; \# f
4 Q$ l4 }. Q( e, B...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。* s/ M# T2 W- c6 K
2 ?; X6 u9 a& Y; B
PS:关于域名转发8 `( g1 ?: Z0 y3 c
0 ^" F4 T2 V1 |/ a( b
所谓域名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/ 的内容。
: b3 ^5 b! C7 b" z




欢迎光临 cncml手绘网 (http://www.cncml.com/) Powered by Discuz! X3.2