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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13694|回复: 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.047 `) `4 A0 G: ^

$ P& E4 j' `* n/ [$ W) `
  1. ###更新仓库& `1 L( f9 ^% ]) F, n- {) i

  2. ' ?& r1 v, _) Q  x1 c
  3. apt-get update -y% Q2 t% C- w& W# v# ?0 {+ Z* e2 W' h* _2 I
  4. apt-get install wget -y5 v6 s/ L$ n4 S7 m$ B" B& ], l' m
  5. #下载nginx和相关软件包
复制代码

; n6 O1 P  l& B) _9 R1 \6 p! y& W6 C' h
pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。& i& |/ o0 c$ z: h, P& t5 Z! ^

4 ?3 b) o) ^8 \; G4 t! P9 e
  1. cd /usr/local/src
    % x5 C; k' T, v, R
  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>7 ]7 k9 {& T( h4 L
  3. wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>
    6 z; m" }! 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>
      m: z* r. l) G- y9 G) M( Q
  5. tar xf pcre-8.33.tar.gz3 D! I5 N3 e1 s. ~0 O
  6. tar xf zlib-1.2.8.tar.gz
    ! f) i9 K  c, |+ g8 p! O+ L
  7. #安装编译环境
    2 O) I" M( e# |1 r1 T- J
复制代码
5 M3 v( \! N  N: w8 d8 P
. l. ?- Y. Y& L
apt-get install build-essential libtool -y% U4 c" i( o; C  @4 x! j
#创建nginx用户, n$ u; p4 N. d0 _" o7 h3 L

1 ^! T# b' U" D; C: W* ^所谓的unprivileged user5 t& o. X  f/ z

# F2 f5 S( J0 C4 v6 Q
  1. useradd -s /bin/false -r -M -d /nonexistent www
    & s9 R% @/ l* C; ]% t6 Y
  2. #开始编译安装  K6 [* V5 ~9 y1 w/ a" C9 v! {
  3. . z& j- e6 v$ H7 B
  4. /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
    3 g, ~, w! }% Q" J
  5. --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module; @5 X; ]! L# w6 ^: M
  6. make
    ( g3 G' [1 g+ }" j
  7. make install
    1 \3 L3 ~4 T# v. E: E2 }  A
  8. #给文件夹授权
复制代码
6 V# K5 I! j* l! q3 p
! ?* b4 e, l& ]6 @
chown -R www:www /usr/local/nginx
1 K: v2 x+ N! O! _#修改配置文件: _7 J( p$ D/ I6 B* W
vim nginx.conf5 b" Y; {, k/ h; q$ J

7 r3 U' ?4 ]% v1 uuser www www;; n% t/ T. d2 W  C4 [. U. T
worker_processes 1;
( ^2 w1 F4 N' t7 m# {$ D7 ~4 nerror_log logs/error.log;
% b5 [1 Y+ |/ o! ?8 G( y, _pid logs/nginx.pid;
( ~, O: |+ G* g) X  A, wworker_rlimit_nofile 65535;% ?* D6 k8 d8 z8 @
events {
4 @0 `9 q: j, e. a4 }  use epoll;
: f3 @- f2 O! d; U  worker_connections 65535;
% g0 K- T3 J& s$ y% S& c( Q}
$ p: H# O/ I: {5 J. v  vhttp {. ?& A: z+ h7 l4 Y' @7 `7 ^, w
  include mime.types;2 M* t8 V8 F  O( Y1 X( T8 L
  default_type application/octet-stream;
9 c$ j# O9 I/ Y( U8 K* u  include /usr/local/nginx/conf/reverse-proxy.conf;
6 S+ A. r: q# `& k- @- ?7 W& G3 j& ^- i  sendfile on;1 n; I! E7 \' b$ h
  keepalive_timeout 65;- n; o8 O' V" Z6 _/ W" ]: M4 _
  gzip on;
2 ]5 {5 L% r" Z  P% e8 ~. V8 u3 M  client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户7 ?1 _. E# Y0 L+ l8 s
  client_body_buffer_size 256k;
* X! C4 V6 u  f% t5 o/ }. H  client_header_timeout 3m;
0 P4 s; n$ D* ?  client_body_timeout 3m;0 i& P# C, ^$ _# d
  send_timeout 3m;
$ C/ A2 _& \: Q  proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)0 h7 ]7 A# s- {3 W: \. E9 `  B. i
  proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
5 D% t. _: W$ f6 {( F  proxy_send_timeout 300s;+ G8 Y. Q( r- j4 N$ A
  proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
# q, ]1 G, k$ n2 g2 q! ~  proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
" n4 w; M5 @9 V' H% C  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
$ z' m- Y- S$ |( e/ ?" I. m  proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
4 V3 C$ `1 P: `, Z" c& m  proxy_ignore_client_abort on; #不允许代理端主动关闭连接
+ @. P& K$ A8 e: `  server {" \6 ?. J7 F( v; f0 n* o% |6 H% }
    listen 80;
" q/ @1 F5 m7 d+ F    server_name localhost;
, `; \3 y5 E- F    location / {
% R4 G2 m# U. p5 h" Z      root html;/ k2 u  ^1 c, ^2 {7 j. Q3 S
      index index.html index.htm;
% l( x& A/ M  t6 Z+ v% e# Z    }
2 [/ m' I' H% n  u, T* m    error_page 500 502 503 504 /50x.html;& }7 A  p" N7 c
    location = /50x.html {
# o/ k+ `: @( P; H      root html;' s( c- V( U# X1 U) ?  ?
    }) Z2 I4 L5 ~! ~, l* [# q4 A
  }
# L. l* f9 {! D8 M! r}
: e) c- ~% h% i5 D/ t2 E' C' s( g+ S  Q* J, k: W
编辑反向代理服务器配置文件:
! t' A( }9 ]3 s( X5 b% x
! |! g  N; [! W& H) lvim /usr/local/nginx/conf/reverse-proxy.conf6 t9 [2 ?% i0 {, w7 F$ Z" K
( W% L8 L  Z+ a3 ]
server) s* ~6 c2 G2 ^( {2 X, u8 X
{. U' h0 T4 D; Y4 F# R& G0 t; k
  listen 80;: t7 K1 m) f, v: Y7 [6 u5 v
  server_name xxx123.tk;" x* V* x, T! E: ^: \$ l
  location / {1 _  r4 [. p+ X2 Z6 @; K
    proxy_redirect off;' c4 W6 L# U0 d2 w) ~( t; `
    proxy_set_header Host $host;
* a3 }5 ^4 n8 k    proxy_set_header X-Real-IP $remote_addr;# v' M  V! L% [1 Q, v7 H
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
: ~1 r4 p+ T: ?8 ^    proxy_pass http://192.168.10.38:3000;/ e- v) Y0 B  l) O; W8 {
  }$ X3 D7 r0 t/ C3 F. u3 _
  access_log logs/xxx123.tk_access.log;3 O' ~- w" w) o2 A% Q
}
2 S; r; \) l8 |2 }, @: _9 T( ]  
6 Z- K; o  @6 g* f. O8 oserver3 m# A+ T: Q  B0 Q  u8 }
{
" f+ `$ l! n% M4 R  listen 80;
6 z% `; m1 H4 F5 H; E- p+ C  server_name xxx456.tk;
+ U  U; R8 I# N6 q5 C  location / {  n) W! i- N) s
    proxy_redirect off;+ F# W, g; v2 i
    proxy_set_header Host $host;- Q7 _) ]% h7 x: r7 I9 E
    proxy_set_header X-Real-IP $remote_addr;0 M) c' S2 B% \! ~2 y% `
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
7 q  |9 v  f7 u4 p2 @    proxy_pass http://192.168.10.40:80;) J- G$ k5 D1 V% P
  }  ]- @2 |* G" E4 p& c! s9 G
  access_log logs/xxx456.tk_access.log;* q6 I- B# o: }' ^
}
; q5 H. y& [/ p' p
9 B, E9 w3 R$ _! U$ w( |+ Y# d4 v然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。! [( W; \7 ]& D8 L/ @

" ?8 X/ b; Y3 l; u- b5 r& m$ Supstream monitor_server {
( X6 M% r. c7 O3 R8 x) E' l  server 192.168.0.131:80;
9 V9 i8 t. q' ]" o8 P. `    server 192.168.0.132:80;2 l$ h6 P9 w9 I6 r3 H( [
}
( G3 o- A  A4 q! B! y+ o+ m$ q  
( l- P( i& l# |7 s$ i5 }+ lserver
3 H  P+ ?* B, D{
, I5 @/ G/ ]  o0 _* V. P  listen 80;
; w0 R$ b2 X& s2 A  server_name nagios.xxx123.tk;$ y1 z/ B8 H" j; _
  location / {
, k1 g% M# t' j! y, {' s) a    proxy_redirect off;4 _# @2 R/ z: S# s8 Q% M
    proxy_set_header Host $host;
! ^: Y3 ~& c9 q; B+ A" G    proxy_set_header X-Real-IP $remote_addr;0 O( ~1 c9 v4 c( Y3 w
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ) g! T1 j9 P7 a$ m+ V+ ^: i! H
    proxy_pass http://monitor_server;4 u4 h- p* b' |5 H% H- V4 N  [+ ]
  }; N7 N4 U4 m3 I- M' O; y. Y) E
  access_log logs/nagios.xxx123.tk_access.log;
+ F6 c+ x4 e7 j' v+ u}
" r5 {/ w" e& C* Q' p1 n! z( [1 j) d: d6 K2 T% I
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:0 s0 V& Q' q# c( A4 j
, a0 k# v* ^* }% Y6 z
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
' \$ ^+ Z) a; u( G2 x3 P; Y'$status $body_bytes_sent "$http_referer" '9 {7 E" G5 p( G1 n& S
'"$http_user_agent" $HTTP_X_Forwarded_For';& H, \' M6 T/ n% s  ?. i
  
: ^* t( y, E) H3 uaccess_log logs/access.log access;
/ ^6 y1 P" D5 W! F9 i0 {  j" s# }: @6 ]& M2 Q
再看看原来日志的格式长什么样:7 F' W% b- F; Q: z

/ Z& l7 e  f) y. W- B* S1- l* X5 m: P' b: o' [
2+ n" j2 d9 Q# N# X- A! z
3; H+ r, }( {8 ~5 `% x. @
4
* d' l. B: N7 k' v5 _4 T1 A3 Y52 [2 x" ?+ M& L/ x7 Q
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
: Q7 G$ D# e! e- G& Q# '$status $body_bytes_sent "$http_referer" '5 j' r0 E% G. z* H
# '"$http_user_agent" "$http_x_forwarded_for"';
. A( L, R: y, `5 O, y  7 I! D: m( `0 \0 h& y% H
#access_log logs/access.log main;5 c& x) {9 ~, r4 e7 \2 d% o
看出区别了吧   遇到的问题   之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查4 S* B& d- I- N0 z1 r, }6 f  i4 ~, f
0 G% j, f* @* P
1( p0 Y( y: X/ k8 m) p
2$ O  y- j* H: i+ _: A0 D
32 P: g" |( m% I3 D' e2 ^. W
43 s8 J* q6 T& I) m
5$ q6 m, J, Z  R
6
8 R8 z; ]- C4 p/ H- d7 |: }7
* G4 W. J7 q8 w: J8
/ G1 k1 w+ ]! ^1 Aproxy_connect_timeout 300s;4 ]3 H7 x( B% D% |
proxy_read_timeout 300s;
) R: w* @- \. m* U+ j! i: P0 tproxy_send_timeout 300s;
) G3 i5 ^6 W9 Q9 r; Pproxy_buffer_size 64k;+ M2 \- s; H4 F
proxy_buffers 4 32k;
2 e# |" Y: F+ y. \) @3 o7 Vproxy_busy_buffers_size 64k;6 D" v( n$ U. n, u9 w% Z( v
proxy_temp_file_write_size 64k;
; T; J+ A- I# ?( g8 B7 Fproxy_ignore_client_abort on;& ~& _4 C- u3 p
报错日志:
- ?7 s0 X) y5 h- _
" B8 V8 e+ Q0 I1 Q2 g$ Y...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。+ m% J" A8 @5 g7 _
" M# l. m5 p4 a
PS:关于域名转发
/ X! b. x8 `9 C3 u1 y
& n# ~- A0 v' ~: v) B所谓域名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/ 的内容。& c2 t6 w( f& L2 |! a7 Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 18:23 , Processed in 0.051851 second(s), 19 queries .

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