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
" F$ u( s6 k% n- \; {1 g6 M3 ^- d$ c! i% ~- ]; N
  1. ###更新仓库
    * x9 y  I- u  v) j3 r

  2. " i& {& S9 _* Q! C2 G2 e" D4 X
  3. apt-get update -y$ D" t' ]% `7 v$ N
  4. apt-get install wget -y
    + o) _5 w! J0 R- ^+ j
  5. #下载nginx和相关软件包
复制代码

+ \( h8 M% v" u9 B6 H" I, i0 ]+ T$ a* n* n: y7 g0 P5 s, p
pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
# c. Q8 _* D- l# U
' p9 M1 [: i" b- [4 Y' n/ C
  1. cd /usr/local/src. w) r& a- I( i- Y( B0 Y( F/ s& ^
  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>0 U) K+ [2 A% Z( k" V4 U
  3. wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>- d& j$ R6 L! ^: O! `1 i3 q3 N$ t
  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>8 D$ O1 _) q2 S, m) K0 P
  5. tar xf pcre-8.33.tar.gz
    ! S5 Y1 c% w, y1 L: V
  6. tar xf zlib-1.2.8.tar.gz$ W4 R8 g6 g( z/ {" E7 [
  7. #安装编译环境
    ' H( d1 ^2 x7 q5 e; f
复制代码
; `) t4 ]9 J7 C, h1 I" K' ?
" j4 z) T* y$ s$ s2 A- n
apt-get install build-essential libtool -y
# G9 g# W6 i$ Y" J/ T1 p! g#创建nginx用户, h( ~5 _; K& z1 i5 N

" g. Z) P1 ?. M/ X所谓的unprivileged user
0 @8 Z2 x& F1 Z8 P7 o$ `  V" r& q% i
  1. useradd -s /bin/false -r -M -d /nonexistent www4 H5 J3 Z9 {" C/ i
  2. #开始编译安装7 }0 I5 M' @" B: M- U; p
  3. ' O) z% M" {' f1 h' [
  4. /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \2 [1 U! h% a9 L* N6 S
  5. --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module9 H' H0 b: t7 Z2 {/ b' D) W; }# C$ m
  6. make
    % X, e+ d! E  \9 u8 o
  7. make install5 Z7 `3 e* y5 I! d& x/ [
  8. #给文件夹授权
复制代码
* R# i' n1 T5 d% j) N9 k- |* i) T9 `

) ]5 u+ B1 a; _) z! z: fchown -R www:www /usr/local/nginx
6 w5 X' Q! M: z#修改配置文件/ }9 r6 @9 P% D  D2 ?# Z
vim nginx.conf# `1 d0 P0 m  K- Z+ ^7 O/ c$ R5 _, P

4 a- [: h, s: `# M* b! o% fuser www www;
2 s4 f2 L8 Z+ a6 U. r9 s2 f( c3 hworker_processes 1;4 `" o; u+ [+ S: Q2 f& _
error_log logs/error.log;8 ^" ~* m& m) J: d- X
pid logs/nginx.pid;) e+ u) S- ?  m9 H9 H* M* j
worker_rlimit_nofile 65535;5 R$ [: h4 f$ Y+ c' U6 g$ i
events {: s+ ?7 ^6 g2 T1 g# Y; M
  use epoll;
& M# ?$ T5 ?1 w3 L1 x  worker_connections 65535;% {" ^$ @- g* Q6 ~, d$ e9 h4 I. k
}
$ `, t$ Y( ]9 ^8 s9 {; Y8 i% Uhttp {2 T. o  x) E6 r* T
  include mime.types;
" K9 I: ^1 x  K& t! V/ W$ i  default_type application/octet-stream;
/ Z4 p. h, T5 K# I3 T. J- o  include /usr/local/nginx/conf/reverse-proxy.conf;2 P; D3 N4 f0 x6 J4 T2 B. Y
  sendfile on;
" k# ~, H' G  |2 ]: ?  keepalive_timeout 65;: Z8 s/ F! `( A, H
  gzip on;( ~( `$ v2 }. x8 X5 `5 @' O3 H4 l
  client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
* |( x, ]- B$ t5 w6 h  client_body_buffer_size 256k;" H3 w4 k( D& O: N, p
  client_header_timeout 3m;( F/ S, w: V, j" D
  client_body_timeout 3m;, c3 m# x/ q" A9 q0 m( s
  send_timeout 3m;
4 p" }1 n! ^8 x" G# K" D, {  proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)' U4 K$ f. ~6 r7 U$ p1 n+ f2 Z
  proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
5 |3 G; S. ?' ?; E9 Y$ P  proxy_send_timeout 300s;  l' Z, s. ]4 ?  U% L4 k( O
  proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
( ?$ U; _* g/ O, ^" P5 F" n# m  proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
; r: t8 p2 c) f4 g7 l& ~% i8 w  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)7 O; @0 n, h/ ^
  proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘0 ^6 q) ?$ a9 R, K. X. z; q) s
  proxy_ignore_client_abort on; #不允许代理端主动关闭连接4 e. {; H9 A3 Z1 D7 x3 C
  server {2 i" v: b' V1 n
    listen 80;/ ]$ s9 e2 k4 d# G+ B5 J' _
    server_name localhost;
' r+ t4 y4 P  v6 [" `( R: @    location / {, T, s* \9 z/ L% a% Z- g- ]/ n
      root html;3 u' N- S7 g- n, d4 o% r
      index index.html index.htm;
9 R6 H" ]: x' x1 s    }
& l3 O  A' ?( V4 q    error_page 500 502 503 504 /50x.html;
3 p- _9 E2 Z  @# f- r8 o' Y    location = /50x.html {. g. o/ ]* s/ g
      root html;
, }5 H9 U0 ?5 I& e    }
1 b* p. j8 f0 _8 [% D7 @9 N8 Y  U  }3 [8 _) t  h0 Y1 k' g* a
}
+ t2 y2 k0 I3 ?" N* s* J
8 j6 v! E5 y( T. {  M$ r4 C编辑反向代理服务器配置文件:+ g& s. z6 ~, ?3 g& r
; |' q$ s  `1 d6 e5 h
vim /usr/local/nginx/conf/reverse-proxy.conf( C) H* A9 T0 K" n3 g8 z

- q) I  ~3 [5 U# @4 {server9 V8 V5 ?, E6 p9 T9 y% [
{$ X2 X& i" W6 Z/ h
  listen 80;, N$ O$ A- Q6 q' d
  server_name xxx123.tk;
; @% \# _$ n8 ?1 {& [  location / {5 \# p$ K* f( R1 m
    proxy_redirect off;
, z9 l7 D  f( w, ?! j! l    proxy_set_header Host $host;
4 E1 v  ~/ Q) k- G4 P, i    proxy_set_header X-Real-IP $remote_addr;" C* Q- f# G6 H
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
7 e) n' V4 D; R5 n8 q" g; Q    proxy_pass http://192.168.10.38:3000;! O, J- {2 S9 N2 I/ |
  }
' s# I$ L4 ?  k  O3 X0 o- ^- t, R4 y  access_log logs/xxx123.tk_access.log;
$ E& \# R( _9 B" S  B}
* C5 i2 V, j! S  : E2 W8 t# h; O: J" W# A. ^
server8 ]$ |7 a8 A- ]# ~( u  d% Z8 q) K$ J
{
: [8 }6 o' b" [6 S  listen 80;6 d6 X  U( e! P
  server_name xxx456.tk;% {. x. p1 Y2 _/ U7 A
  location / {4 B  {: ]- V- O5 s# w$ A' |+ `
    proxy_redirect off;
8 I4 c* d' O" V% \1 y( U  o    proxy_set_header Host $host;# a# f( _# c+ ~
    proxy_set_header X-Real-IP $remote_addr;/ W$ i3 U9 L. w5 s
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
% K9 c# R& _+ H0 e; _" L) C$ i    proxy_pass http://192.168.10.40:80;* |# J8 F  l3 f/ `9 J4 Z
  }
) t: Y9 Q5 K; M: o  access_log logs/xxx456.tk_access.log;
) e4 a8 z2 I( _5 Q4 h}
9 s" p* V7 W6 Y& ~/ K, {+ b& O1 P/ @& b9 c4 v% q- Z
然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。
, |# O! k( b$ S+ x" O' j5 n) n* p: q6 m  H  X$ g' h% x, l
upstream monitor_server {
- l% c6 Q5 l& [& R( J  server 192.168.0.131:80;0 G" D& D, M' n* B) i6 ?. Z5 R
    server 192.168.0.132:80;8 @3 F* j' F) f! O7 a' \
}
% ]5 n$ Q; N- O4 c% [: E% @    ]. D& v* e0 f' Y( J. C5 g
server
6 C( W- B: N2 d2 n9 o4 C& F, E* a{& j7 o3 m! b6 W8 E( [# s  Q
  listen 80;
* J) T9 @9 ?) `) h# b8 w  server_name nagios.xxx123.tk;
" `, \* {( B0 s9 y5 }  location / {9 `9 s3 e, d. r- c/ l- }
    proxy_redirect off;
( p, D* k: H9 U. B* B7 ^0 P: u    proxy_set_header Host $host;3 h, S( J  c, t+ K* L1 _1 U1 D4 o5 c6 J; o
    proxy_set_header X-Real-IP $remote_addr;/ |4 D6 j8 q# x% s% H& O: E. m* E
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
4 N7 D: X' ~) I" I; L& }    proxy_pass http://monitor_server;
2 |( t0 l3 ?) M$ \' l( ^  }$ G; N0 X; S2 O; c/ k
  access_log logs/nagios.xxx123.tk_access.log;/ f; ?9 ^) l+ r+ E0 p  N" v
}; U- |# X9 Y% a2 Y+ {3 C( N

- Y# D5 o1 P2 Q* x2 H0 a) W9 K额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
1 u2 A  p5 K9 D, ]
* `) X- A9 z# w% k. [2 c2 o' e5 Qlog_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '  j+ G2 Z* j' P0 |
'$status $body_bytes_sent "$http_referer" '
. |) r' {7 X; s/ O'"$http_user_agent" $HTTP_X_Forwarded_For';! @( T9 ~' d4 V, C0 J
  - q2 V/ J: g: n& b7 K2 b# _2 ?3 Y
access_log logs/access.log access;
: i  F5 ?/ I8 R1 K- O# ]+ X
8 q3 ^8 u0 M/ Y% @. {; V4 T3 |3 w再看看原来日志的格式长什么样:
) w4 n. k4 v, T  u  J
! a, O3 a# l$ K7 v" Q3 C2 D17 O( I, M" C; i- c$ X+ p
2# I* G) E0 |( n; {6 I0 j7 e( X$ n( I
31 a& t# e- T* m
43 U& R0 c, K8 U, ~8 F
53 S( F% `! g5 u% u) ^
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
) o( E/ l: I) W0 I# '$status $body_bytes_sent "$http_referer" '5 o/ j  P/ ~6 _8 @2 H
# '"$http_user_agent" "$http_x_forwarded_for"';
" P" D4 G6 a3 X2 p4 n. ^; x  
1 Z; H) b$ \& D. ^; ?# g+ L#access_log logs/access.log main;
7 v9 G0 a6 m7 y: z看出区别了吧   遇到的问题   之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查/ I3 r5 K0 e3 n- `

5 ?: t( U7 ~+ Y7 i# {( C18 V+ U, \+ ?, X  t1 C9 m1 Q0 I
2% Q/ a" Y0 @0 O" D
33 w7 I1 K! a. G
4
( l9 b$ j0 U; R" g5
% _3 H  q& s/ @' t4 \69 N+ X$ @: y. x" s
7! I% H( c) |. X  t' o% G. e
8
! r% X7 \0 J6 P$ q, @proxy_connect_timeout 300s;8 U# H$ E) C/ |5 o' i+ B3 L% ?
proxy_read_timeout 300s;/ A' L' a. r. h8 q0 A
proxy_send_timeout 300s;
7 e1 h4 {" N9 {6 Tproxy_buffer_size 64k;3 p  n3 h1 C, O3 U# H
proxy_buffers 4 32k;
* E! i7 u$ c( }# N' {6 Cproxy_busy_buffers_size 64k;7 Z& B4 I3 P0 y, o# n
proxy_temp_file_write_size 64k;
8 Q# A* W. j* f  i* Wproxy_ignore_client_abort on;/ ]# l+ u6 m/ J8 L
报错日志:# F0 V8 X2 i8 e. E$ @' w

$ r5 Y. j+ z3 O7 ?+ q6 J3 F" P...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。
7 _& |  X  G  ^. a  [" G1 r2 ]6 m6 a
PS:关于域名转发( d* w) B; Z5 Z7 ~, I6 ?$ J( Q1 x3 O
, s& V( A. J  ^1 W- G. y
所谓域名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/ 的内容。
( {* G8 _3 F8 p




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