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
0 z3 |2 S* y) p! K1 F! W* J+ T  N) U8 x: q+ n) F
  1. ###更新仓库
    , H, F2 ^1 k/ T  i  C$ X0 K5 K

  2. + F5 G! X. H" Q' T+ h# C
  3. apt-get update -y
    ' T) J0 l0 ^/ {5 B" K
  4. apt-get install wget -y
    4 u$ n8 @- h" I; G- @
  5. #下载nginx和相关软件包
复制代码
& }1 G' M1 `+ ?
/ I. h  D) t* ^2 K- K
pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。5 B7 O) P) w/ e- x( z! y; z2 H

5 E+ V! p* [* }1 F
  1. cd /usr/local/src  i) [. \  J+ u* q5 Z; m( K! o3 V
  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>
    ( j, [8 i2 M1 ]3 z. h0 w
  3. wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>
    0 L" o8 t, f0 O' c6 V
  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>' u; E3 s2 x3 g' L. T9 M$ s
  5. tar xf pcre-8.33.tar.gz
    + P8 D+ Y. ~/ {  F* O. b
  6. tar xf zlib-1.2.8.tar.gz( {& q; g* y/ V
  7. #安装编译环境2 Y" W" a3 A; h
复制代码

/ U7 w! l9 A$ H$ u* J- j7 a* ] $ A: Z  A( v& T* a1 M; s3 x
apt-get install build-essential libtool -y+ |+ i: j; X: K3 B. B$ V( u9 Q
#创建nginx用户
; t# v) a( K7 |( C- w. s4 N5 v2 r1 b& d6 n# K1 @
所谓的unprivileged user
! ]: B0 }3 L, ]; D9 T% N0 y' d4 P1 e% F8 [6 g
  1. useradd -s /bin/false -r -M -d /nonexistent www4 w4 ^9 I' S/ X
  2. #开始编译安装% |) g- G( ]4 P+ F: X
  3. 0 B/ f/ o- ~* T, _
  4. /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \( {; W/ X' p1 l
  5. --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module2 H8 r$ n7 n6 v5 G7 U1 j; S5 N$ d
  6. make
    ' _* j# p+ P. M- ?) O  d( U
  7. make install# g9 x4 I/ ?- \0 ~: |
  8. #给文件夹授权
复制代码
& ~! e; T- e/ `0 o

. e7 V% K/ T& f, f! W# Bchown -R www:www /usr/local/nginx6 X8 J1 |: C8 n. A; s+ e
#修改配置文件
; U( S( G3 S. B7 ovim nginx.conf
: Q% K; a, b6 S* T; z
$ g$ V: X9 Q" c( b! n2 q# u! xuser www www;
! v6 W1 H8 H# \; ?! C, s& Eworker_processes 1;
+ `2 o! b- s1 c# W8 T# n" herror_log logs/error.log;+ I% ^8 r; X  \  p: d
pid logs/nginx.pid;
+ u7 o: T1 `9 I/ s+ T% I, Pworker_rlimit_nofile 65535;4 c3 @5 Z$ s, X8 |% |& E
events {+ f0 @/ c! Y) k+ }
  use epoll;% Q5 h; y, Z, C8 \9 R2 b0 |. H! j) }! S
  worker_connections 65535;
% u( p; _4 X; W: x- B5 _% T8 q) a& g' r}
: a0 Q8 H: ~) M4 qhttp {  v6 d1 e! U, h9 b6 H7 S8 P
  include mime.types;
, ]5 l# u* R1 U8 z/ B1 E+ I' ^  default_type application/octet-stream;
. s8 M4 Y9 J7 h2 F* w8 I- [  include /usr/local/nginx/conf/reverse-proxy.conf;
  P1 j4 @4 ?4 Q3 y4 }- s  sendfile on;/ e9 l$ \" |9 v/ c
  keepalive_timeout 65;) u1 {% g- Q+ Y" B) d
  gzip on;
. Y1 V5 j6 ~% H, E2 @7 _  client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
. B- \! R6 d6 z6 |# T  client_body_buffer_size 256k;  X; C7 D: T. P) ^. G; Q
  client_header_timeout 3m;
1 T2 W( p+ }5 g* b) O  client_body_timeout 3m;
  D/ R- I$ N; Y; m1 R6 l  send_timeout 3m;5 L2 r7 q! l0 q
  proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
! G5 a( T( i0 x7 t% W* u, ]" b" b  proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
& q& o2 l7 H8 a& ]2 p/ v$ H  proxy_send_timeout 300s;, I0 O# l- k& ^8 Y+ U4 ~( O" Z
  proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
4 `8 ~6 p: i7 h$ U6 X" V* ]- e  proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置* L+ D1 M6 e9 c
  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)" @  \9 ?; v( K$ I
  proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘- y4 m3 p; `, A( R2 l
  proxy_ignore_client_abort on; #不允许代理端主动关闭连接
& D. ?% \9 G, [  W* |4 S/ `3 I  server {
# [! U0 C) P2 q( z6 L& j    listen 80;
6 V# j3 |7 [/ M    server_name localhost;
" g0 ]$ I4 A( J/ K2 T) ^6 u    location / {
. N6 G( t8 S8 b. ]5 P$ d9 L( J      root html;
" J7 }% I* @, B2 D      index index.html index.htm;
6 i6 P' U! i: c/ z- d6 D    }# l5 D5 Q, M7 v, c
    error_page 500 502 503 504 /50x.html;
5 W( r2 J( I4 ]! n& ^    location = /50x.html {) x$ P) {! |& o( j0 w4 b. }
      root html;
/ }1 q$ O% s" j$ b1 L1 Z    }  G2 \# `! }# E  z/ U
  }$ U3 _: `9 c: D) |$ q  i0 ?5 g
}! k: L  K& I" ^2 A
5 S- D+ I, B; c4 `
编辑反向代理服务器配置文件:
) y0 y) Z' `% d8 n
/ Z) T1 i5 P8 u5 Yvim /usr/local/nginx/conf/reverse-proxy.conf* ^* R7 \' i4 R7 \

+ M7 U" q1 r2 B' @# l) V5 pserver
7 |9 ~2 o) ^) T, b" l- b* @{
8 e$ V1 e) h+ e- i  listen 80;9 b  C: r( e# @  |/ M4 o
  server_name xxx123.tk;7 a2 L. U9 W# x7 _! b/ h$ ?
  location / {4 |& z6 {" H# t. a$ m" o4 J
    proxy_redirect off;
: P, a. @$ y3 x    proxy_set_header Host $host;
9 g0 `8 I5 V, n& J( I    proxy_set_header X-Real-IP $remote_addr;
; B( ~1 }. N1 Y, m- l& m    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
7 X0 V' v/ ^7 G8 P: N, l7 ]    proxy_pass http://192.168.10.38:3000;
* [4 x2 F2 x- |: [6 j: {' p* f5 h  }
( b5 @0 [4 ]9 Y1 o1 x. g  access_log logs/xxx123.tk_access.log;: M* T# `4 ^# y- O
}
  B' N  g, B$ S2 y3 F  - H  s, D- P, g% x5 h
server
% U0 x- _- \5 V{
: B& j* N& T6 B  listen 80;! A! c" o. D- }. V4 U+ t! {
  server_name xxx456.tk;
" n! F  w/ Z: U9 @9 H0 X% f  location / {
4 c, h3 C7 r2 Z) y0 j    proxy_redirect off;
8 ~$ ~" x+ h) w    proxy_set_header Host $host;1 O' A7 L0 E& L' i$ o( m2 v
    proxy_set_header X-Real-IP $remote_addr;
0 p9 v; \2 m+ n4 l, G/ }$ Q3 @    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;7 E. n* Q# G5 c
    proxy_pass http://192.168.10.40:80;
, t) A3 d, J- a4 p, j* r& d. h  }% `' Y- [0 Y8 |9 D/ v# |3 ^
  access_log logs/xxx456.tk_access.log;- @4 A! ~, l; _% k5 _% q
}
- h, z9 ]$ a7 \8 f1 m
2 n* o& u6 b$ I1 {3 R$ V然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。- o$ h0 w# H& b2 A" o

: n5 }' K1 @& q& }6 l7 Q0 d7 dupstream monitor_server {( m% q' {2 v: R, d1 u: ?8 b
  server 192.168.0.131:80;6 ~: F2 W. [2 O9 l- Q- K
    server 192.168.0.132:80;+ ~6 Z/ T! q$ A: c  {1 G
}
1 V8 y+ i% k1 h6 Y* _( c5 ?8 r3 e  
# p, a4 ?9 e( v  a! aserver
. j" b/ Q& m; P" U+ u* \- E7 P{
: g5 _. G6 c6 M% t4 o0 p  listen 80;( d$ B* r9 k" ]; D3 e
  server_name nagios.xxx123.tk;) q& j0 f1 p' k" x6 Y
  location / {5 Z6 \8 E# |& Z+ H" \% z$ S/ q
    proxy_redirect off;; ~1 Q" O2 N4 o$ v, P+ \% e
    proxy_set_header Host $host;
/ D- m- o: D' B, V) S1 k    proxy_set_header X-Real-IP $remote_addr;
( H8 L& D; P7 _    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
& e! H" P6 m- H4 H" o+ r+ M* `    proxy_pass http://monitor_server;
% r4 b0 ^9 X: p" h6 `) v  }4 h$ y+ f6 @2 }# z# J5 A6 b: }
  access_log logs/nagios.xxx123.tk_access.log;7 E$ j4 S% l6 {' h  C
}! V2 }4 e0 Y) B6 }
* v/ E/ o" p4 z: I; v
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
1 c6 d4 w4 W2 {1 s' I6 @/ G& U* O3 i2 u: z9 G6 s
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
' P. a8 D/ b7 x; R3 A* P2 A" ]5 Z'$status $body_bytes_sent "$http_referer" '
) g; Q% Q, M" J& t'"$http_user_agent" $HTTP_X_Forwarded_For';
  P1 e  N: c  ]  5 H9 z7 E/ K( f- X6 G+ H& W
access_log logs/access.log access;
  h/ }  {$ k7 Z8 _' j/ p
+ r* j. X# {( T- \8 G, l再看看原来日志的格式长什么样:. u6 V0 t! ?& L" c( G, }' P

! H5 H! b/ l' l/ z1
6 H/ J4 q  O2 Q0 F2. h9 M* `* [2 d! H  y# A
3
0 ~. n* B1 n1 R3 |, a4- G8 Q! |2 l9 l2 \# F: S1 p
5) H4 h/ a: r, C7 L# q/ R
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '; m0 `- D* g1 ]$ x; o2 a& T+ p
# '$status $body_bytes_sent "$http_referer" '
* ]2 _$ H& J1 h  x' H# '"$http_user_agent" "$http_x_forwarded_for"';4 z% L; R9 O1 [9 j1 \/ J0 r
  9 p% a0 R+ W" @6 J0 W# F- |9 s% f
#access_log logs/access.log main;
, p1 R, M- b( i+ H. ~看出区别了吧   遇到的问题   之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
; P2 _' F, M3 e7 g5 o1 h# F
6 ?1 n2 j: P& p: i1 `3 l. l4 b0 v5 }1
4 p2 `& P+ e9 E2
7 w& F6 L* ]- R5 G* z& @9 ~1 Z6 g! n35 z  t$ {; P: `- u0 ]
4
& I9 M' M6 X! N% R5 |: \6 O52 v; g8 @/ x$ d" e3 g
6& y, j0 A+ ^% A
7
6 _9 {& q; q) H8 |3 T% Q3 R8
7 \7 E  m6 A, B0 w  y6 f6 |- `8 _0 e- [proxy_connect_timeout 300s;
$ P! W7 l( a& K/ e) w7 Oproxy_read_timeout 300s;7 I* k9 m( {$ i2 t4 \' q, j
proxy_send_timeout 300s;# m* Z/ H: E' l$ J$ d; ~2 M
proxy_buffer_size 64k;: l. v( ?+ F5 @4 R% G8 D# C  i
proxy_buffers 4 32k;5 x( y9 Z+ N9 \
proxy_busy_buffers_size 64k;
7 J! C6 ]7 b0 L$ kproxy_temp_file_write_size 64k;' G' K; `# u5 B# v" q: E
proxy_ignore_client_abort on;
# X5 ]+ o0 D# c1 \% J  v/ Q报错日志:
3 f  r% m; O# Z1 y# ]# N1 z* f9 l3 D8 O
...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。5 w) s7 K, A/ q2 C4 j2 y# o
9 b- K2 X5 W, S  R2 V
PS:关于域名转发+ ], r8 f$ ?' A! j: x  E
% d* b% F' B- o; D+ u
所谓域名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/ 的内容。
4 E4 @4 W- g# Q  ]* z




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