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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 15341|回复: 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.043 ?% |+ \5 b3 l/ H8 Y) J4 x3 j
' C' `0 T1 i0 s$ ?2 |5 L4 U
  1. ###更新仓库, e& _; z# S& }8 _! E
  2. $ q2 O. I6 U# D9 I+ M" L- O
  3. apt-get update -y
    7 h9 [- N8 n9 @* p& c+ ^$ U
  4. apt-get install wget -y
    " L; r8 _; N: k* q5 u- Y
  5. #下载nginx和相关软件包
复制代码

" i' h: \) y- y2 a  r# W' g
& Q/ @( l/ r/ {  [# y5 b' \9 Ypcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。2 u+ l7 c4 a$ U2 [/ l, i4 P
) b1 u6 A8 U: F* ]( `7 q8 s+ N
  1. cd /usr/local/src$ D3 Q( ^5 u4 {0 ?) V6 U/ K( d! j& X
  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>
    5 [( y: `$ i8 a6 j/ k
  3. wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>! R: J- ?" F) ^
  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>
    6 l& @% E+ \. Y# B; ?" A
  5. tar xf pcre-8.33.tar.gz8 ^# V4 O  W6 U2 S* M& ^  t# Q
  6. tar xf zlib-1.2.8.tar.gz
    9 g7 M( t) M- b  K
  7. #安装编译环境
    $ i+ X8 A4 j) a# x( ~2 R1 ~6 W3 U
复制代码
- w) k' e1 U) G; m

$ Q+ j! x+ B4 P9 | apt-get install build-essential libtool -y
; T% S8 s3 O6 X9 q" i#创建nginx用户
4 d( G' D2 I( L3 g& @! R
  ?7 t  D2 \% W. ^% N. W所谓的unprivileged user
- g/ B' y0 I7 c5 S( E9 `
4 ~8 h' A% q# V
  1. useradd -s /bin/false -r -M -d /nonexistent www
    $ n8 \) ?6 b% Y
  2. #开始编译安装# [  h$ a/ n% Z9 P. i; F

  3. 4 V+ K, t9 _+ M9 I9 h+ B
  4. /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \& t. S  I+ Z( h: N6 w
  5. --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module' ~' ~2 r8 |" T& t+ s% o8 ~
  6. make
    ! v# o; V1 i6 w0 z* w' ]" Z
  7. make install" R6 w7 }  w4 u: w; |$ W
  8. #给文件夹授权
复制代码
8 R: n' s, X, w; f
. r, n3 {. [( \  H4 d
chown -R www:www /usr/local/nginx! T) n; n8 F5 F. u: g5 q0 |
#修改配置文件
2 w) R$ K( [1 vvim nginx.conf3 w8 }% N5 L$ ?( t, ?+ F- O/ M  x
  ]/ F3 Q7 P  J% S+ @* B9 b8 p
user www www;, m" ?8 a& Y. H( k5 a! E# ~
worker_processes 1;
  `6 U2 V- F1 |( o# A3 K& cerror_log logs/error.log;
0 ~6 H+ i: [* B1 C+ A: {pid logs/nginx.pid;" m7 Z/ {  {+ _* n4 v: U
worker_rlimit_nofile 65535;
$ A5 s4 C. Y7 H5 k8 H9 uevents {9 G/ g: T9 ^. @2 u/ o
  use epoll;
6 @" A  D& @* {: m; C" Z  worker_connections 65535;4 u; E* z, Y6 b6 L9 s" X
}
# D% `% e- u# o" mhttp {" y: J3 i5 B# i! j9 Y
  include mime.types;
9 b- R4 ^" r( q  default_type application/octet-stream;
3 _3 w5 t% a6 A. g$ e  include /usr/local/nginx/conf/reverse-proxy.conf;
1 l+ h2 n8 x' @  f, |" g  sendfile on;
% W5 X6 s5 G2 O# X  keepalive_timeout 65;
' R9 |" U* N3 V% L0 ~' X1 |  gzip on;
- F- L: ?- s" b2 O  client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户3 e. r7 R4 X4 w7 |* \
  client_body_buffer_size 256k;1 r+ e% J+ b8 A& u; r
  client_header_timeout 3m;3 m8 g9 q. M$ K7 I. L) ~
  client_body_timeout 3m;% \" W1 t( o6 Q+ G+ R" ~( Y
  send_timeout 3m;
  c0 k% X" k5 E0 H; l6 X  proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
, m5 _1 J# Q% ?- @  proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)0 m& H1 Z( [5 g! A
  proxy_send_timeout 300s;: f" k9 F) x$ v7 N7 z
  proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小% B" u% C7 b, P3 J
  proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置2 j; f% Y( |. B' L% B
  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
& j# c5 Y. T4 t9 ?7 A& K& T1 l2 V9 p  proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘: }, e) j- r, f7 N; ]
  proxy_ignore_client_abort on; #不允许代理端主动关闭连接% B8 N' a  n$ U3 C- Z
  server {
! Q& N5 y) \* ?1 v5 K) r    listen 80;  D3 I) E% Z- ~' W5 q- C9 O
    server_name localhost;
- l2 S) W$ l1 ]5 `1 w    location / {
9 C7 @3 P& {5 J6 J( T      root html;
; n. x. f# O* N8 M% C, j      index index.html index.htm;
. p1 M" W& N" r; L    }
- R% z9 e$ b( E% {1 N3 l1 B7 y1 a    error_page 500 502 503 504 /50x.html;8 @* i0 j5 z) T0 J
    location = /50x.html {
  m8 c# p4 s' B& ~* U/ ^2 G# S      root html;
$ @% b' c: z6 j, |6 T# w' Y$ c    }& ]' X) Q' K" j6 w3 a
  }
, k% v3 v# }6 r+ G, A}: L8 v( J5 I3 U- e7 u
$ s4 j- `. m" |
编辑反向代理服务器配置文件:
1 q0 [8 Y# d  d8 H9 t( R" }1 X. \4 T9 _; ]8 ?
vim /usr/local/nginx/conf/reverse-proxy.conf
  S7 n! K7 }6 B: e
  L7 C+ B% m6 Rserver- m& x8 V" E5 f7 Z- c  R+ N+ k
{
) z3 b% I) h8 b5 ~  listen 80;, k% {6 U. u9 R6 a+ H% N2 @" f, y
  server_name xxx123.tk;9 ?% q/ s! f8 Q3 e4 h. ~3 e) ^
  location / {
2 N/ B7 U2 q4 G) L' \: e    proxy_redirect off;8 v5 N0 ]+ g* Q) W' T& d
    proxy_set_header Host $host;
1 s0 v4 _' T5 G6 m* |    proxy_set_header X-Real-IP $remote_addr;+ _3 @& ]' H- C
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;. d% [8 I8 i# D2 A; s
    proxy_pass http://192.168.10.38:3000;* D3 `! Z+ v6 N; i
  }
9 n  F' {9 |& R9 G  access_log logs/xxx123.tk_access.log;: I" m- g. m1 s( V
}
8 e* {( j7 L9 A2 q  D  ) X3 L- ]! |' Z; V
server
: l! L' R# b& `3 v3 B; K! b{
: D$ E. g, {" ?  listen 80;
/ O4 Y6 t2 @7 L  y2 x- ~- L  server_name xxx456.tk;; c+ M: M: f1 }; o& D) p
  location / {
% f& K  q& W  e' W) {9 m% z6 i7 J    proxy_redirect off;+ `  i% k' c( W# e! c: {7 g
    proxy_set_header Host $host;
( `* ]! K" b. N# X1 X" ~    proxy_set_header X-Real-IP $remote_addr;/ b3 s! h; B2 k7 W5 p5 [! v
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;$ V2 o* h: T' I+ W6 q0 P5 u0 @- P
    proxy_pass http://192.168.10.40:80;: R. D. p! C# l
  }6 L( D4 [& S% B/ L% w
  access_log logs/xxx456.tk_access.log;# m/ N0 S' ?& v9 |* I% z
}/ ^% I" d; P2 C

9 c* S% ], M8 d5 f然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。. p; {# B/ V) @6 X! f0 q6 N* o. L1 V
, g* V; h" [+ R- v, R4 g; A) @
upstream monitor_server {6 V$ ~: o6 _, H* d6 W1 J1 |
  server 192.168.0.131:80;
' {2 n  o/ V" f, _" R7 Z    server 192.168.0.132:80;3 H, f5 e7 P6 t
}. T2 W) P+ K- }& |' {
  
3 l' f) d) i1 e, a2 i8 f+ dserver( I8 K6 ^4 X9 f/ X' ^4 `
{
/ L( {7 [) z# {! L% P  listen 80;) K/ m6 t3 H% C* _; S# H
  server_name nagios.xxx123.tk;& i# c3 p8 I- l
  location / {# l1 c) p, A7 q: n  T8 C- {5 a
    proxy_redirect off;
7 P5 Y) t* X$ C, R7 T  K) U0 b+ Z7 o+ F6 G    proxy_set_header Host $host;
% Y  Z+ ]6 Z1 H& C    proxy_set_header X-Real-IP $remote_addr;3 P. U  S: F4 d5 O* M' K0 ^
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
: f) f; [( @3 C' i( E    proxy_pass http://monitor_server;
9 X& T0 t) f0 g9 ], F  }( Z  w" x2 @& X2 d  v
  access_log logs/nagios.xxx123.tk_access.log;' x* {) [: f2 h0 c# r
}( G1 l3 [  n. R+ c! E7 b$ w' k

1 K, D+ M! I& q' V% J额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
3 ?/ ?, H6 _0 q6 W: C/ K" E& w7 S# i/ D* w2 M" Z: g
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
% Y$ p, b6 W- Q& \* G'$status $body_bytes_sent "$http_referer" '
$ [& g% S" L$ f, _. v% N'"$http_user_agent" $HTTP_X_Forwarded_For';' C7 r3 J0 h' a* s
  ! |2 {  }4 p6 o' }( Z* d% F2 }
access_log logs/access.log access;
" @/ \; N* `' [3 Y: u3 }8 o
) L9 I$ \0 p3 [2 z* `) J再看看原来日志的格式长什么样:7 X1 Z2 t& `' n* S* @

3 U5 p- v- x  I, W% a; N4 X17 S1 |' Q9 ~- Y4 W) N
2
) E) F6 J9 v) O* U" j+ j30 W" H/ z6 }9 Z* ?% L
4
2 `) P) `* f% Y$ O- |  Z5. f  v4 F* }. g4 u8 `8 t9 ~
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
7 c% u0 J# J$ Q2 b# '$status $body_bytes_sent "$http_referer" '+ N! |" H7 d/ s# R) L6 B$ t
# '"$http_user_agent" "$http_x_forwarded_for"';
" b5 y7 T3 Z# M  . h3 a2 c+ l4 G
#access_log logs/access.log main;( g- ?8 g/ s1 v0 \' M$ x, ~
看出区别了吧   遇到的问题   之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
7 F% ]& X. R2 h+ [7 w- }
- @. C5 I. {+ w, L7 D1' s/ v( I1 T! e5 t* ^4 t/ h
2
5 u; t* v1 ^7 Q  d7 ]36 S5 R9 i1 ?' z& U; u0 ~
41 {' {% Y6 U6 v2 p1 ^
5& A) J6 s3 s1 r7 Z$ C! z" L
6
% e1 r/ I0 O; H, J7
5 }+ }8 v" \, f' a( K6 ~81 ^* K- K% P  i# w# W1 T
proxy_connect_timeout 300s;
6 q$ }; I* V( k- Vproxy_read_timeout 300s;
3 L5 K8 d+ b' K5 W; B6 nproxy_send_timeout 300s;
+ }8 E9 J. W2 O4 n3 @0 G6 Gproxy_buffer_size 64k;. k& X+ U, d9 M! d" F
proxy_buffers 4 32k;
; U' F) N8 n' u5 Tproxy_busy_buffers_size 64k;
" j1 z' L3 k# _8 }proxy_temp_file_write_size 64k;
( ^( Q9 ~! m' n3 ^  q1 nproxy_ignore_client_abort on;8 k$ S* l0 Z$ f" P
报错日志:3 ~0 f7 S; q$ {1 x: j- S

2 P3 n2 }4 ^- w" x0 z' f2 L...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。
! U+ G3 k: {% F" B/ b
( d  \/ |$ _$ b/ I5 Y$ OPS:关于域名转发, H& [8 Q8 A" h

, V- ^4 Q1 i: q, a3 e$ @9 I5 [所谓域名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/ 的内容。3 w( o; \/ N3 t( ^6 }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 04:47 , Processed in 0.056884 second(s), 19 queries .

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