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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 14640|回复: 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
- J# J9 a+ i/ @# O9 p
) m9 X# C, c' v
  1. ###更新仓库
    ) x' s: D3 P7 \+ h* ~/ S- @% A( `

  2. 2 g+ L" W5 H) Q+ _. k6 T) ]
  3. apt-get update -y6 d0 e7 i# ~' C6 X. S2 w/ M6 O8 Q
  4. apt-get install wget -y
    5 T5 h- ]2 B, f# ~& P* k
  5. #下载nginx和相关软件包
复制代码
2 w, z+ E; z* n$ o: E- e

4 S4 k% i( M  {8 Y: B! jpcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。0 A: ?1 U/ |  D' A4 O& D
1 M$ V8 ?$ Q' J- J
  1. cd /usr/local/src
    1 H6 Q' O0 g' j& U
  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>% k2 {) E8 R6 \% j
  3. wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>+ F6 f; c$ \+ e7 h
  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>5 ~3 J- ~" K% R5 q
  5. tar xf pcre-8.33.tar.gz
    # g" H4 X! E/ T4 b2 E- O
  6. tar xf zlib-1.2.8.tar.gz
    , E( T3 J: q0 E6 f7 f& e
  7. #安装编译环境
    0 S0 G% z6 U8 H
复制代码

$ i' y$ D+ z1 T( G0 A : S7 }- B) Z0 }5 \5 Y9 D
apt-get install build-essential libtool -y
2 d/ @5 T- B& \" w/ l3 e4 @#创建nginx用户
. O4 C/ Y. I) [) @" {! `# ^
% s  L9 k! G4 z! V所谓的unprivileged user
. a/ n" h$ @3 M' d+ V6 p0 Y4 T& I
  1. useradd -s /bin/false -r -M -d /nonexistent www( N* l. \, {- T  D  M
  2. #开始编译安装
    ( `7 d3 p" S9 d6 h5 f# p- @

  3. : ^. z! z: b7 c/ U9 W1 ^% l
  4. /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \6 N# J) L; r" n
  5. --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module% O/ D0 H$ H) T1 I9 I
  6. make& b4 V! ?3 `3 p7 f% I
  7. make install
    2 B9 ?" w* A7 o1 _( ?
  8. #给文件夹授权
复制代码
0 E: j/ f& K& B3 f1 J
$ e- K* J% [' k' k! x+ m
chown -R www:www /usr/local/nginx. h4 ^' \; e! \* S5 E% a
#修改配置文件
; c, h2 c% ~9 [vim nginx.conf3 J  f) e/ ^' X. e$ I1 L

; J7 d- s3 N' {( ]- s5 `user www www;" p( n6 O! A7 f' h
worker_processes 1;
! @; e' {4 `  B$ U6 q1 p5 zerror_log logs/error.log;
' E( z" Q, Y9 z' Apid logs/nginx.pid;
! [2 ]3 I1 H9 m/ [* e% G) Z8 ~worker_rlimit_nofile 65535;
7 r2 Z7 R% D9 Gevents {% e. p# j1 O) p* v3 ^, C# D& k
  use epoll;
  I+ ^: R9 K& d6 ?+ T/ b$ T  worker_connections 65535;7 Z9 B0 e. R: o* y4 Z
}( B; c( S. _* F" Y3 E' I
http {
- r0 w* Z/ X- e( S  include mime.types;
  K2 h1 R' h0 x8 v  default_type application/octet-stream;
* G- g. |: L+ ]0 `' Z  include /usr/local/nginx/conf/reverse-proxy.conf;: _& I+ u3 f3 e/ g7 c6 G
  sendfile on;
( \: M* y/ }4 x4 p: \% e  keepalive_timeout 65;9 ~2 e; G; r( E% p7 V" Q; `
  gzip on;& j9 x; a7 J  S: w  ^! p/ j
  client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
( ]1 E/ U7 Q- r* \  h' o: Z" J  client_body_buffer_size 256k;- G+ J  ?" r  N. L  e/ ^
  client_header_timeout 3m;
, B+ e9 t4 H' d' m4 W. G5 M* d7 v) Q  client_body_timeout 3m;( t" @& c2 L- E+ G
  send_timeout 3m;
1 G" T2 R. e8 e% `0 D( p$ L: v  proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
# l3 \: e' x5 I. }  proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)+ D+ ~& l6 O, O
  proxy_send_timeout 300s;
& U9 K5 ~1 r+ y0 s, H: R  proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小( l8 K8 k. O1 E5 N, g/ p. L
  proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置, W# e( L2 f* R. u* v
  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)) C! ~% e4 v  f, ?) l
  proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
% F- D; \1 P' i8 {  proxy_ignore_client_abort on; #不允许代理端主动关闭连接3 e& p% S1 b+ w* f$ b
  server {
6 j% y/ x4 a' |9 W8 P4 ]    listen 80;1 t  `6 h7 F; T( S) |/ A4 k7 H4 I
    server_name localhost;7 x" _! J, Z5 @% L0 j. L/ i
    location / {& w* |' `+ r/ V
      root html;
* k- X1 p+ q* Z      index index.html index.htm;8 m' z$ l' V' ^! Q0 l8 G6 p. {7 S
    }
; w( F- ^1 y; ?9 k7 I5 s+ y    error_page 500 502 503 504 /50x.html;
# e4 i5 m: M7 o    location = /50x.html {2 U$ n. X  B" j
      root html;
1 P3 s$ X- i3 ?( ]. z) [( K! [' [    }- [4 H# {# y; J, ~% q
  }2 I( Z/ Z! z' @# [$ }
}
9 e( c8 c' k8 Z6 b; v3 E7 K/ w! V; I- i, n
编辑反向代理服务器配置文件:+ {" U3 u+ R! I( _3 N

& U" c8 b! @1 L$ Q6 n" xvim /usr/local/nginx/conf/reverse-proxy.conf
; h! W0 L3 z' v, A. F1 S- o8 {) K! \0 c; R0 N4 B, I2 ^
server9 Y6 l) B8 O9 a
{9 \* u+ \& S6 Y9 P, j: v  B
  listen 80;( h. o7 s- I- i' |7 _) K  o
  server_name xxx123.tk;' G0 ~" t$ N4 [% {# A9 r
  location / {
* O$ R( u5 m* c4 G1 O# h    proxy_redirect off;) B1 y7 a& S) B0 X& r3 ^' n; X
    proxy_set_header Host $host;
5 [4 S7 C! A  \' n* ]2 c$ ]    proxy_set_header X-Real-IP $remote_addr;
7 j8 p5 W) d4 _9 m; S' e, W* R. z    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;/ @9 D( k( [. u$ @3 `3 h
    proxy_pass http://192.168.10.38:3000;
7 W0 ]" u$ v' ^; E' F# h  }
/ s, h$ s. @' W* _/ {  access_log logs/xxx123.tk_access.log;" B% Q8 F) o4 P* ]0 W
}3 s* A% Y" ~- h: B" h1 j" N. J8 N1 C
  
( c( B  B2 ^* s" U% X: O, L: [server
) V- c5 F/ M0 U0 G{( u4 e: ~; j+ x6 |& x: b
  listen 80;3 x# `9 ?4 |' k, O% `
  server_name xxx456.tk;
1 p. Z$ @: q* S* b+ A  location / {( ?8 h: E& S1 l
    proxy_redirect off;
, h! p- g- h9 M1 F2 c    proxy_set_header Host $host;
6 [5 ]4 _+ G$ }* v( _    proxy_set_header X-Real-IP $remote_addr;
! I% W1 P& I+ n  Z' d* n    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;5 N* f1 D. o" V2 L# P
    proxy_pass http://192.168.10.40:80;( t5 |& F) {9 q# J; w
  }
; Q, U- ?4 f+ M/ }8 Z  access_log logs/xxx456.tk_access.log;
" i1 Z& h& I  j* G7 r}
7 R* S- n! u7 N2 @
1 E& B& i( O, e8 y8 x$ H然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。
" |4 t8 s* O. s" D' r
7 V% @- s0 P4 ], i, f* ?6 }; I4 |upstream monitor_server {
7 g" Y+ Y5 ~' C1 [, G; I4 w  server 192.168.0.131:80;! D8 o2 K  r) |5 \
    server 192.168.0.132:80;8 ?9 A' h* B. {1 [7 ^% ]
}
! u5 v) K* @5 D6 o) P1 x3 `2 n  ~  
2 T5 \- R  k! h5 userver
* G! ^3 N' e- C{
3 v- ^0 J0 U. \/ z2 k" ~* \+ A8 X  listen 80;
: L# k0 B1 c6 @3 Y" w" O/ \1 J5 ?  server_name nagios.xxx123.tk;
9 Y4 f  {. R& b9 V% r  location / {
3 K. X0 Z0 o1 j7 M" n    proxy_redirect off;
- R+ R% U$ H/ z( d3 v    proxy_set_header Host $host;& k9 _  k' A( k( [- k3 s
    proxy_set_header X-Real-IP $remote_addr;
  C. K3 Y. C) ~# N; W# f! \    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
/ j+ `; P. }+ X6 M) Y5 Y9 f8 [3 v. v1 E    proxy_pass http://monitor_server;2 O( d) J3 `* D: R* J
  }
  t$ n! U) d- p( G  access_log logs/nagios.xxx123.tk_access.log;% ]- J. W7 Q( m" M) K
}7 Y& V/ C; x0 H. X6 g" X

$ z$ I3 }  V0 F" ~$ y额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:8 }; m& Q  C/ ?: C- ?: x: r

+ y5 X* P& e2 q* U1 o+ V* mlog_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" ', T* j. y9 H! x+ m! D! h: U/ t% ^0 O
'$status $body_bytes_sent "$http_referer" '
( [0 b/ S) o4 k: Q9 _'"$http_user_agent" $HTTP_X_Forwarded_For';
4 I" @( l0 w. y6 V2 |  3 Z6 Q% R0 T8 e/ O& F7 A
access_log logs/access.log access;* W5 g: S! p  X/ u% z
& X  S' d2 L7 u% Z. z0 W8 T6 Z
再看看原来日志的格式长什么样:
  q* Z% j5 N% M, J5 [5 a
, G4 @3 K8 X; u- N9 u7 ^( A, Y1. ]' `) {, q  A9 H3 J$ S8 z
2
( |, N; S: p! Q4 G3
- @% T; E! W' z4
/ g8 y* g  K8 ?# }3 V( s5
, M! h# K" x4 ~5 @6 h#log_format main '$remote_addr - $remote_user [$time_local] "$request" '1 C6 Q: f  }6 u+ b
# '$status $body_bytes_sent "$http_referer" '
+ U( G5 l5 M8 N4 Y. i3 a. W# '"$http_user_agent" "$http_x_forwarded_for"';
6 J- j6 r9 d& n4 t. `9 Q! @  
. Z7 g2 Z- k6 v+ f( w' @8 \& M# i#access_log logs/access.log main;
2 h8 M4 l; S3 }看出区别了吧   遇到的问题   之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
7 o$ f3 W, }4 e3 J( u; K7 |2 k2 Y$ B: @' T* S
1- Y& G$ O( t! e( k& b# _
2/ {, z) h6 V' {& W, S
3: `# R$ S# w/ z; e5 g/ W* L
4: q4 I  _9 I  m# V* W
5( j' f3 U4 t8 d; N) g* l) e/ M+ f
6
) {8 R3 Q7 {+ g. C4 {7! h1 a" U* X9 l+ w0 v
8
% i' b; e& \& s* n' n. Sproxy_connect_timeout 300s;4 c+ u5 P! O, \4 z3 [3 Y1 I& S
proxy_read_timeout 300s;7 k8 L: B- @7 D7 |
proxy_send_timeout 300s;) I- l# g# ?8 F, T  h1 i
proxy_buffer_size 64k;
/ u) x1 E$ N/ E; O" D! bproxy_buffers 4 32k;, |) u" }( N% M$ S, C
proxy_busy_buffers_size 64k;
7 f; j1 z) C  q& Zproxy_temp_file_write_size 64k;- b7 q( j$ O1 E- W2 Q, ]6 G
proxy_ignore_client_abort on;
+ L3 K2 z6 H# X: o报错日志:
0 b7 L- R( |/ A  b/ w6 w7 [
1 x; h, d  |  ^* o# T$ z...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。
: i) z1 \# {3 o5 V! \- w
2 x1 V4 ^; T( j  F1 tPS:关于域名转发
; Y7 T! z, y' E$ s9 P5 [3 {+ Y0 U) F" C* q3 V' Y3 }6 m
所谓域名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/ 的内容。2 x: q0 m% s: c7 s4 J
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 10:10 , Processed in 0.050137 second(s), 20 queries .

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