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.042 G. ^: P# I; k

9 }/ W( @8 k5 @) P- g/ B8 a% f0 s% T* y
  1. ###更新仓库8 A4 [( m3 q3 X) r) F. k. o0 i

  2. 9 |1 X8 R5 f3 A+ h' D* J* C) R: \
  3. apt-get update -y2 K4 B0 v$ P7 p8 Q  j
  4. apt-get install wget -y' I; E0 F7 a$ \; Z& v! \* \6 s
  5. #下载nginx和相关软件包
复制代码
1 J9 }' Z# X7 i+ z" o! D
6 Q+ z2 d( V# G: q
pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
2 _9 h2 Q7 |3 J. {) x$ R, d5 _( n8 d* ?" q# O2 f/ j
  1. cd /usr/local/src
    9 r/ ^( H3 ^; Q. l- L3 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>
    / t) Y6 j! _/ d0 A$ H' d  m
  3. wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>; [1 x4 P' w3 h& o* q$ |
  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>/ s7 p: H7 J7 \# l) ?" _' F
  5. tar xf pcre-8.33.tar.gz
    4 Y' j) ?: k; V
  6. tar xf zlib-1.2.8.tar.gz
    + n2 |3 D7 P! s- Y( f- m4 f  f$ V
  7. #安装编译环境6 e8 ~, D  [4 T4 T) @. Q! a) U
复制代码

# \. m' L# S* Q6 d- ~ - }% y- z7 Q( r0 P
apt-get install build-essential libtool -y
  C; C7 _& \0 d#创建nginx用户
/ S& Z1 P2 ~4 X7 @
! v$ c" i4 E! O5 u: m  o* C1 E所谓的unprivileged user" N% [' x& d3 p* J( G

) w0 `0 W6 O" Z/ |+ `
  1. useradd -s /bin/false -r -M -d /nonexistent www
    + q. s4 v6 k4 s4 f; A
  2. #开始编译安装$ F" W+ s" o- R" T7 `

  3. ' \& g& q5 w* E+ [$ D
  4. /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
    6 v" ]" l" R, Z4 Y. H
  5. --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module5 v' q7 q* \: M$ W
  6. make
    ( t% Y. h( K+ E8 y
  7. make install- [5 e: T* x' b& p* G
  8. #给文件夹授权
复制代码

! y# L: |! T# {# Z* X
  s+ O) B' x' f0 ]chown -R www:www /usr/local/nginx
+ R' J- U! k  J/ ?( c( g- @#修改配置文件5 k& F& \5 [; {' f9 Z/ `
vim nginx.conf
( _* q7 ~. E2 {# i+ x3 n! x
# d: ?/ x5 C; X' l" E2 auser www www;0 [( T7 y# v0 n
worker_processes 1;
- n& d- P; x' B" f( Aerror_log logs/error.log;. G9 V$ @3 Z4 o. Z# S
pid logs/nginx.pid;
# V" c1 Z4 R8 _$ iworker_rlimit_nofile 65535;
7 \; N9 `( @9 ~9 D" K. O# [1 uevents {
5 f4 S8 z9 D- N: y  use epoll;
6 W3 H, f' E; U, ?7 T0 T  worker_connections 65535;
3 |4 H5 l/ z  N. N/ |2 p% C}
7 S  j1 H: h7 Ahttp {
+ \' D  b; E. v6 \' J& K  include mime.types;) j( M5 V2 t6 @8 K- z- J
  default_type application/octet-stream;
  `7 R+ }/ Q$ I; l. b$ O  t) H  include /usr/local/nginx/conf/reverse-proxy.conf;
8 I$ k1 D8 |' [  H6 H6 X: o* f$ x  sendfile on;
; L3 d6 [5 ~8 R  keepalive_timeout 65;( J" J0 x! m8 @* [
  gzip on;9 X8 w5 P2 c7 ?
  client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户; f" }9 n/ B3 p: n" S
  client_body_buffer_size 256k;
- w# v* R. p' y' Y+ p% r  client_header_timeout 3m;
' s( |4 z" e* M4 Q! v5 g  client_body_timeout 3m;
# l; l, F, d+ u! x0 Z4 `  send_timeout 3m;
) m$ d# v3 t  {  proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)0 v! U' R- R2 E# X  K
  proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
% }+ k; [) g- c/ C% Q# n+ Y  proxy_send_timeout 300s;4 X8 x) m) P9 a/ E. W+ |
  proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小; |  w5 k3 z& i( l9 d, L/ C2 {
  proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
( O# k/ ^: k9 T  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)4 L) h: x; {, `/ E0 Q1 a& Z
  proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘9 o% O1 r" p8 y, d
  proxy_ignore_client_abort on; #不允许代理端主动关闭连接
3 l/ N7 n0 A: |' R1 v; Y  server {
3 ?! J" B. g, O2 A5 `    listen 80;) O/ B* Z' P) y
    server_name localhost;
+ q% ^5 j3 e: V7 N2 A    location / {
. T6 g% P4 J* q; i, E4 F      root html;" A8 t% J6 P$ L7 Z# Y
      index index.html index.htm;
0 x8 I$ Y. V& j# V# h    }
* Z" D3 ~( _& X6 r0 g, N  ~% w6 P    error_page 500 502 503 504 /50x.html;3 [; M) }0 P: y' m
    location = /50x.html {: Z! w1 }6 q9 n2 W  w4 ~& d+ m2 }) R
      root html;
) T$ V1 p' w- H3 y# l    }
. l9 E! S5 E9 g# \* x  }2 |" y3 j2 u( T+ Q7 B- X
}4 |9 R$ ]8 a) T5 L* e! V; D2 N$ ?2 l
! @9 p3 X: u# D' |/ C* W! z
编辑反向代理服务器配置文件:
9 }( S% ]8 T6 {9 g( h8 s
) ?- ~- K  J2 }  S5 l0 Q4 dvim /usr/local/nginx/conf/reverse-proxy.conf
3 o% y' j5 x7 P* R+ J% ~; r7 U( \6 D, C/ F% {7 b$ b
server+ r# S. [9 X! B1 S! d* I' ?! o
{* \: A; c% f! T3 c) Q+ T
  listen 80;* H8 _' c  B- c! D2 _8 c: N; u5 Y
  server_name xxx123.tk;- K" [: V, B& r7 ?
  location / {
) k3 Y/ s0 H% T5 P+ l    proxy_redirect off;
; Q- h" z/ v8 e0 N    proxy_set_header Host $host;
+ O; @* W) A/ _1 J0 J    proxy_set_header X-Real-IP $remote_addr;
4 ~0 v" O; J% Q    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;+ A2 V  a0 [) }# L* z% ^
    proxy_pass http://192.168.10.38:3000;
, B, O1 [; j: x1 b* {) l, ?* J# R7 ^  }9 d+ s2 \6 r1 W& a6 F
  access_log logs/xxx123.tk_access.log;
* B6 |8 p; F! [$ ~5 U( v% z/ R+ ?& u}
3 K! x' Q% @  S0 L  ! f& m- U% H) {6 D/ k5 H
server- i4 L* _2 G1 p1 o1 M( Z
{0 x! {$ ?* K, q! L, n) F
  listen 80;
/ E6 f$ A* ?+ M* w/ k+ s% l  server_name xxx456.tk;
) R: B# o5 U' ?6 U: r  location / {
' ?4 R  u" W5 w6 }9 g7 r% }    proxy_redirect off;
+ }+ C3 j7 @; T  g; D  w    proxy_set_header Host $host;+ x8 o3 ]. t% d
    proxy_set_header X-Real-IP $remote_addr;
; E& k* N0 K( P) Z/ i: K$ }& ^    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
! J$ V* g2 T9 V  p2 i5 g+ D    proxy_pass http://192.168.10.40:80;
" ~9 r. i% ]- y6 F# G  }
7 j4 Y# c# W& L" h  access_log logs/xxx456.tk_access.log;# S$ X7 M0 ?; b+ o% a) h4 G
}
5 B) _! F( H% S; O$ W2 D+ o, p! H- h* I# r$ \7 E- A
然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。
& g1 w* D/ N' s. O8 @
, d8 u* Y/ G* j+ Vupstream monitor_server {- S* y8 r" f5 d5 A2 j3 |( O
  server 192.168.0.131:80;
2 \9 p' o3 P' o! B    server 192.168.0.132:80;$ u4 r9 l( \5 s; L- E, c% d
}$ k5 e% z& ?6 |
  
( I; c) M1 M6 W& kserver
# Q; l: I4 X2 c: w. G{3 S3 f$ {# D2 }( k
  listen 80;
/ d3 J! ?4 m0 W# F  server_name nagios.xxx123.tk;' W( U+ n& Q, y2 Y3 |
  location / {6 I7 H$ `1 T, r( c; [; j, @
    proxy_redirect off;; Y( F5 y  l2 g! w( T' C
    proxy_set_header Host $host;/ s6 X% O6 a' a5 E: X( s9 e" h8 X
    proxy_set_header X-Real-IP $remote_addr;! t8 T7 g1 w- a& y; L# j# `
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
0 }4 a, \* i# s6 w    proxy_pass http://monitor_server;
9 I, o: a4 `9 C$ s  }# \4 K: R, }, B
  access_log logs/nagios.xxx123.tk_access.log;
' p1 n/ \( Y3 ?}
# L. s0 T. ?1 D
4 Q1 [1 ~% q. f! d3 }0 e% ]  J额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:/ M0 U. \  k8 J) j
. @! o1 H2 \* H5 Y/ ^
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
5 S5 v) @3 b4 h- x% K( ]0 Y'$status $body_bytes_sent "$http_referer" '
5 X; V( n. c6 m4 k, A, ?  \0 g+ ~5 c'"$http_user_agent" $HTTP_X_Forwarded_For';
  ^% h' Y) N4 F4 R  
; N7 t& e" L  ^access_log logs/access.log access;
( {" }0 [, b6 n$ N. F. n
( j5 x' f0 n; K再看看原来日志的格式长什么样:
/ Q3 O( N9 y# h$ ?3 n* p, w1 ?/ X5 |9 ~: v8 B
1
/ A9 h2 R& w. k) `8 h# D  v21 f7 t* M- k; M4 A
3+ Y2 C+ d0 }0 ~1 I2 E  b# B
44 U; Q, c9 S! F0 [% i- e
5! m9 z6 n( I. J
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
7 k# r& D, R- t, r- N. ^, S! _# '$status $body_bytes_sent "$http_referer" '$ A4 I5 l7 k2 Q4 T# d+ W
# '"$http_user_agent" "$http_x_forwarded_for"';
; F7 c' W0 v' U/ k2 c( d  
; d8 l7 |. P4 p2 Z#access_log logs/access.log main;2 t; t* s4 o  Z( a; s& ~
看出区别了吧   遇到的问题   之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
2 \3 {" ^5 a! g$ @* C$ \
. A/ ~, O$ s, F; r- `. D1! Z& B$ e' j  K
2
8 K3 v3 J# |+ m) _/ g3
! c) R, ~2 _0 s& X' |/ I. M4 r4
- b8 C! z2 T: p53 Y5 _# k- I7 }  N* v$ c  C" _: @
6
  l+ q, Y& R8 o9 S' ~. c7 |; @5 O72 R3 m+ A$ R3 q8 {
85 m) ^4 j6 L8 f
proxy_connect_timeout 300s;6 d+ I$ |$ c( X1 x
proxy_read_timeout 300s;7 G# ^3 M4 R  z. R0 I: N. {7 y
proxy_send_timeout 300s;
9 a8 ^0 x8 a7 l% Oproxy_buffer_size 64k;2 E: w4 x9 L+ g
proxy_buffers 4 32k;
/ T8 v: |+ {. D1 Uproxy_busy_buffers_size 64k;5 v2 _' j, r& O
proxy_temp_file_write_size 64k;
; E; \8 j" D* G4 Z& Tproxy_ignore_client_abort on;
* p4 ]9 f5 r  \) V% ?, [" l报错日志:
+ v& j! N- w8 @( n7 ]- U
. _! `# a+ v2 m) N1 F5 ?: p2 W& ?...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。
1 G' I. n& v# X% }. m! g; }, w; l7 {6 s0 z; M
PS:关于域名转发
$ W- J) z! f3 J$ |4 y, P# _, E4 I& S7 \8 s% x) i* 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/ 的内容。- e* @, n& w3 G7 X1 X4 H3 I4 t( n1 t/ \





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