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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9190|回复: 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
7 k# \9 H5 h/ J* m/ d8 _
, N: Y( H, ^+ }4 M7 M$ [
  1. ###更新仓库; `$ N! k: v- v8 H) R
  2. $ C% m, q1 i& l" q' l6 K
  3. apt-get update -y! e  T& V# d; q1 H7 i+ u) {. q
  4. apt-get install wget -y
    6 D  G6 o  Y! {/ q# I
  5. #下载nginx和相关软件包
复制代码
- A7 J$ H3 F0 ?" z

: i, ]( \( o( o5 j- Xpcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
! d2 P& k0 d. d& W
/ d& b7 W* J& u" y$ w
  1. cd /usr/local/src0 t: n8 D3 S( 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>
    ' e( d% w6 ~; L, S
  3. wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>
    + h. s0 ~/ U9 T( s8 z, `- E
  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>1 C% Q: L4 E: b, {( a; v. t
  5. tar xf pcre-8.33.tar.gz( S( Y. N! c# _. [3 O- R
  6. tar xf zlib-1.2.8.tar.gz. ?' C( g3 M: M# r+ y; g
  7. #安装编译环境- v% n1 ]# g5 D/ V5 m: ?
复制代码

$ S8 e" S0 |# ?  K2 J* _
0 X5 p1 p; s/ _/ }, K5 x& t apt-get install build-essential libtool -y
' G8 M, d7 e& l  p/ C% B#创建nginx用户
7 F% L4 ]3 C5 i9 B  H0 [/ `" n; |. _$ G. @: c) v8 C- S
所谓的unprivileged user. G0 R, j  V' D4 I5 [; v2 p

' E8 J/ I5 R) p8 d, _' ^9 O9 U
  1. useradd -s /bin/false -r -M -d /nonexistent www5 M7 x* F: _# b: a5 ]0 Z
  2. #开始编译安装
    2 U' ~; |: A  Z, t+ O

  3. * Z/ a& y' J, q8 t% G+ ]6 [
  4. /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
    ) K7 j3 T$ s1 [( u! R/ D# t6 ?7 Z
  5. --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module4 K% |: Y* J6 w5 A1 P  C, K
  6. make
    7 }" |" L: ?/ u; b' Q
  7. make install( A3 E4 E2 p$ J# d5 k
  8. #给文件夹授权
复制代码
8 s. }2 l; f% T& ?& p

- P/ U; Q# n+ G  {! u9 ]chown -R www:www /usr/local/nginx
3 s" X1 b$ l1 g0 _& e#修改配置文件$ ^# h% W% t' c& W7 z) h: }* t
vim nginx.conf% ?  m4 X; q. y9 R; I0 W( B. l
! d; a" g; i9 ~; ]- `! F
user www www;
: `3 C& N& u4 W4 h$ ?& Wworker_processes 1;
$ z+ }+ X( `1 a/ eerror_log logs/error.log;4 A; a0 n- j8 B: V, K& r
pid logs/nginx.pid;- Q. _; }- I- w6 K; w6 \
worker_rlimit_nofile 65535;
" x* \* [9 d' [) i- ~events {
4 V& v3 N/ a  Y8 O. f  use epoll;
" h: e0 J- M/ ~/ U' i. r  worker_connections 65535;+ X3 ^5 _: r  b
}
2 v- Y8 }0 `! j0 hhttp {$ s, N( k, G( g6 X
  include mime.types;) p0 c2 {7 B( B* E4 |
  default_type application/octet-stream;6 U! _% {! m3 [1 o9 `' ~7 v
  include /usr/local/nginx/conf/reverse-proxy.conf;
, x  z0 D+ F0 K' j, J  sendfile on;
# Y6 g( @1 r0 k" d2 C  keepalive_timeout 65;$ [' t3 C9 m: h5 L* w+ ]
  gzip on;4 v" Z# m; G5 ^* J2 S" q
  client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
7 G- y" R: M1 c+ E* [  client_body_buffer_size 256k;
9 P+ N: b% ^& s' Q, k  client_header_timeout 3m;
& Z4 w- t& i. i" W: Q0 v2 f5 U  client_body_timeout 3m;
3 M; h& Z. H3 F, P5 X( T0 U; Y  send_timeout 3m;
5 N  O; Q. R; v  proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时); n  s( G3 g/ A9 Z
  proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)6 @' w7 v/ W% q% [% ~
  proxy_send_timeout 300s;
, d! F7 g4 v" p# S. |* W7 o  proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小5 ]! Z5 Q* Z- s6 {& H4 A# z4 J6 j7 n7 N
  proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
: R/ {! M) @. G4 ^3 h  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)9 ]0 l* O- p0 m3 t  P
  proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘9 u, C/ @& |8 V% C: C9 K
  proxy_ignore_client_abort on; #不允许代理端主动关闭连接
* b4 l& S; P: A1 w$ K% E' @  T  server {' h2 r/ A( g) }5 v* }8 |* J! M8 [
    listen 80;+ U$ T' Z$ O6 }
    server_name localhost;
* T; J/ z& i3 F    location / {5 c/ d# _% {8 _- I/ g0 A$ p
      root html;
& w/ w( k, L9 Q      index index.html index.htm;
" a2 G# A& n- t  g0 V    }7 P. v# d  d+ w7 m
    error_page 500 502 503 504 /50x.html;
9 o( ~9 q# L+ L    location = /50x.html {
) c* p" V' A% b( V4 \/ n( |& p7 S      root html;, q9 X$ v" w) G* J8 E
    }7 x9 ?8 X! M3 R& y* p3 n) O7 o
  }8 h2 m$ Y9 Z# q% a; P  Q
}. ^+ T' ]/ i% |
" e- b; r# S, a4 o
编辑反向代理服务器配置文件:
/ |7 z; k8 K+ y0 x
0 H, F' b! K! i4 ~; R8 t3 y: v/ _, }vim /usr/local/nginx/conf/reverse-proxy.conf1 o" X$ M  d4 ~
* D6 V6 |6 a( S# Z
server8 A$ ?# w! N. h4 @3 Q
{
( F: {' z" Z  A5 C  listen 80;
  J) a9 y: M5 ~6 r3 j3 b# H: {  server_name xxx123.tk;
4 D, n0 b0 h! V  location / {
3 e8 x( o) n( Y    proxy_redirect off;( l7 v. C4 H# n$ t2 l* u
    proxy_set_header Host $host;
5 r- l7 ]9 q0 V3 {/ Z4 w6 l    proxy_set_header X-Real-IP $remote_addr;! b" h, T3 r; T) h4 O* l( X1 S( Q
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
2 `/ P, C% }' [+ l    proxy_pass http://192.168.10.38:3000;
9 {: I* o5 q! E- n; j  x, S  }7 x* i) B# u  K, m" x  k. h
  access_log logs/xxx123.tk_access.log;
# i5 C  Q6 r. {. v- O& B+ H}
% }/ T/ V4 h  f% i2 {/ v  0 K( ]! C5 s5 `2 i) t
server5 z( s4 o+ b. Z7 X6 O  O
{
, `( ^  z) A7 G+ z: q7 H  listen 80;
8 Y( d2 A7 s% D" I  server_name xxx456.tk;% V8 h, R0 U4 L4 s9 f. z* q
  location / {7 m$ c  d" R2 c6 Q/ x6 _7 J! `. F0 e# |
    proxy_redirect off;
4 V/ I* D: ^. A( M0 [    proxy_set_header Host $host;
+ W& k0 Z# [$ O2 \    proxy_set_header X-Real-IP $remote_addr;5 u; h6 J+ b! J* g
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# C3 u. @2 |5 c/ A/ v) a5 b    proxy_pass http://192.168.10.40:80;
' w8 |* I' @. h2 k! V3 `: M  }
* b2 V/ R7 U: V9 l1 L- T  access_log logs/xxx456.tk_access.log;# w  H8 i6 a8 A; M# J' H
}
" F) G9 |  X5 W3 a: {0 d; ^5 M( K2 H, J( @0 Y) ~3 w6 W
然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。
( B! _/ u* f3 H+ [4 e# I
: Y# K* S$ ?% I8 fupstream monitor_server {
' }! H5 w# Q6 H7 K3 A; J- i8 r5 A5 J9 h  server 192.168.0.131:80;0 Q8 t% a+ ~2 s
    server 192.168.0.132:80;! }" ~5 x0 X3 j5 ?# a$ v: |
}
& O  h. P: F$ l  `, Y: F  ; r* }# X' i+ q7 P7 K" ^
server' y. M2 c) |+ x- T# ]
{% t  `# e8 B& C: w2 a7 d: y3 x# i+ R
  listen 80;# C2 r! v: U# I" b
  server_name nagios.xxx123.tk;3 p9 w% ~" [1 r/ Z. ^8 t' V
  location / {- y6 S. {- H' i# F
    proxy_redirect off;
/ N% f. V% i; u. r    proxy_set_header Host $host;+ V- [1 A2 Y0 O2 L& V# u
    proxy_set_header X-Real-IP $remote_addr;
# Q# o* }" S, K    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
' ?: T! V" J1 \: m9 U. Z    proxy_pass http://monitor_server;" M# A& u8 B' Z8 a7 \, Y
  }
9 b3 D0 S8 f3 _9 y/ f  access_log logs/nagios.xxx123.tk_access.log;
  R6 T0 D, Y! z}
) ~) d" I4 L: \. k( k. Q' r( x9 _  j8 ?) `  t  U3 s4 C" g
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
2 n9 a4 i# p. j4 O5 K1 G0 ~& r* k8 B: P. T! f' p, p
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
1 t2 I/ M; t, y: l+ W; N. W" j'$status $body_bytes_sent "$http_referer" '; r" z, K1 {. J  r, y. V
'"$http_user_agent" $HTTP_X_Forwarded_For';/ x  u( a- c9 V7 s
  
* r- H, N# d* M2 saccess_log logs/access.log access;
6 D* Y# F* R2 Q$ M) h8 f
% K( V$ q$ m9 H* c再看看原来日志的格式长什么样:3 }, |+ t' e/ U$ {  [4 }2 Q

/ ^' e1 c  ^' g1
" A8 @  v8 K  Q9 s2 `! ?2
& h8 r) m0 @" g/ _+ [3 o- N9 ]4 j3
/ A) k" @) q6 z4
. _8 |# [( Q# Y. d. }# N/ m1 `8 B7 W53 r: I! T# }6 h* t( T
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '8 F- T+ r, k5 j  g$ ~
# '$status $body_bytes_sent "$http_referer" '9 S$ o; ?. [# W+ y% i
# '"$http_user_agent" "$http_x_forwarded_for"';) B( a% v* g7 ?; L# Y$ d
  ) }" m, M: E; L
#access_log logs/access.log main;
' K2 e3 b' M$ b( @; b看出区别了吧   遇到的问题   之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
- g  x" J  n' s3 A
, d; i7 p$ D7 ]3 M1 T3 T1& x3 Y7 A% s; M( X2 `0 x
2
3 E3 M9 h6 {; j0 y( n37 M' ?) O& v" ^: y0 z
4( `7 r6 I* {9 K& l1 e2 |- c
50 H6 ?9 Q; I; w: z( b
6
+ P# Q& d, E! ~4 k7 I7. k5 a9 y5 z! q$ A) [6 [8 ?. z
8
6 f( w) Z* h* A5 T8 Y1 Q3 \proxy_connect_timeout 300s;0 I% `8 n# l1 H- K3 o1 ^) R5 V' D
proxy_read_timeout 300s;& g; ^  R" X% f
proxy_send_timeout 300s;  f1 H  ^0 g& M( G( n4 }8 j( m- I
proxy_buffer_size 64k;
! l# t; @% b5 [+ G+ Lproxy_buffers 4 32k;
9 q, T4 o3 y; C. Yproxy_busy_buffers_size 64k;8 P3 h+ S6 G) a: x; k# J
proxy_temp_file_write_size 64k;
( Q2 W' C$ [1 z" bproxy_ignore_client_abort on;& {/ D% h/ B: M9 X/ l& t
报错日志:
, A9 y4 E5 q! f$ u/ }" A- O; ~7 t. A' T
: Z1 M" b, l$ y1 ^" J$ U...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。2 C" ~, W6 d; P0 m; ]
* w6 N, [+ A$ T- L0 y6 B0 E
PS:关于域名转发$ \/ R$ J! x/ c) _8 H! {

. N6 ?, Y: A3 h9 D# v" x+ W所谓域名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/ 的内容。: s2 g# C6 s* U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-4-19 12:39 , Processed in 0.126470 second(s), 19 queries .

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