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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9662|回复: 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
) z* w" N4 X' @3 M" C, u1 p9 Y
: b1 ?% Y$ ~9 S" ?) ^
  1. ###更新仓库, Z  p6 H& d! V( F5 y8 d8 @
  2. # n& K' e+ G: A7 P3 z! |
  3. apt-get update -y
    0 R) b) a0 ]4 @9 g4 U# }/ n
  4. apt-get install wget -y
    ! W. z. O( x2 z9 z- ^% ]7 _* W2 S
  5. #下载nginx和相关软件包
复制代码
  \0 p1 k) d: y& H

9 _" C8 b3 E* ]4 `1 s" ]) xpcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
& k6 `1 ^- Y( w+ T/ `  \% s5 t7 P8 m3 Y9 w3 s3 o/ G% z$ t
  1. cd /usr/local/src/ s4 T1 i5 _6 b: O
  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>1 Z" s* ^' G+ b
  3. wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>6 q8 T4 S; h, z; Z) n' 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># l; I: b6 X+ R7 B
  5. tar xf pcre-8.33.tar.gz" G' t/ J, E- C9 I# j& h' B
  6. tar xf zlib-1.2.8.tar.gz
    ; ?. D# D, K! ]* m1 A8 s
  7. #安装编译环境; h  q) F" }9 x4 C4 Z: h( Z
复制代码

' g% _( t  J6 K! D7 ?" R5 y * a* ?  L: E+ p6 ~9 g# B2 M
apt-get install build-essential libtool -y
# y8 s  ~2 H, L' e. G% q) r#创建nginx用户4 f2 C6 E$ Z- F9 w' S/ S$ V

5 ?( t% r2 \; T& B( M8 |9 N1 V所谓的unprivileged user
+ `1 }( A+ I. V6 C/ P" |$ Y' U+ ~( S4 a. V# T6 U" Q& Y
  1. useradd -s /bin/false -r -M -d /nonexistent www
    ' h( s) u0 t  ^8 `: y( v
  2. #开始编译安装" z6 r. G1 M* Z* a! p( i! I

  3. - u  y, v+ D9 j. k
  4. /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
    . G) b5 x/ @* K/ ]) B$ j
  5. --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
    3 T& G7 X5 X0 j% G* t, }
  6. make7 C2 W; F& h+ A8 N/ y
  7. make install
    ; }" k  q0 e  s, q7 [
  8. #给文件夹授权
复制代码

( `8 ?$ U+ P) H3 q4 B
$ ~8 a! n; Q0 h# Gchown -R www:www /usr/local/nginx  U; c; n1 A7 b* T& l- q# ^' o
#修改配置文件7 F- i; O& e/ C
vim nginx.conf( a! ]9 t+ h5 v* H
+ t+ T/ ?1 }( G- j
user www www;
3 t4 @% u1 a9 J) V' X7 ?& mworker_processes 1;* }: `5 f; _4 i3 u4 ]9 |
error_log logs/error.log;
5 S; q8 M- u0 K8 Fpid logs/nginx.pid;
+ L4 ]: q2 O  {( Xworker_rlimit_nofile 65535;
' D, _! i4 w9 B. ?* u4 S% V- gevents {+ s1 E$ U# `: a& ^% t0 B+ s
  use epoll;
+ ~6 h& H! S; r) @& m- ^  worker_connections 65535;. e6 T9 h% f' |
}. ^2 g4 s/ E% K! y9 B$ Q
http {
- |' [$ d' P$ S3 e! N/ }3 I  include mime.types;
/ X# D9 q; k% R- m  default_type application/octet-stream;+ |6 @9 z0 H0 ^
  include /usr/local/nginx/conf/reverse-proxy.conf;& i: F, R* ?2 [8 d2 M# y
  sendfile on;
" ?% T9 U; c. K5 k  keepalive_timeout 65;9 N, \, E( w% H+ B8 `; P
  gzip on;
  F  B/ J5 x$ P8 F  client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
, E: A# F$ Z1 E- w  client_body_buffer_size 256k;7 B7 ^4 j" l" n1 w
  client_header_timeout 3m;
1 s' j9 P+ R& |* t  client_body_timeout 3m;
6 r6 T: f6 d2 Q+ j  send_timeout 3m;# v- y% l6 {% b/ C; ?: r
  proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
7 V6 }) b) P! [6 {7 t# n  proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)* N# Z  K4 r& U6 J* R# w
  proxy_send_timeout 300s;
# y/ B: a. R' d' m  proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小+ s8 w# y, x! A, f0 |, P+ {
  proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
1 o9 C; Q. n9 W4 n7 t6 m3 z  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)7 }1 q& L( r$ G+ D2 O: h; q
  proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
7 u; M7 ?7 a& B8 G) p  proxy_ignore_client_abort on; #不允许代理端主动关闭连接
* N1 Z9 z. _% ]8 O0 q  server {7 N6 D$ W+ L8 V1 @& B. p$ B! A
    listen 80;7 s% `/ [7 {9 a" |$ u
    server_name localhost;9 k* N" X. |: W" g) ?/ P  D8 C+ ?
    location / {
5 _- K) j5 {  F9 r4 V0 `      root html;
% k3 o, S" e" d. }      index index.html index.htm;
& ?6 G7 p. {7 T3 L) B    }5 ]/ g  X' p2 m# k+ C  x$ }- |: u
    error_page 500 502 503 504 /50x.html;
2 r7 P6 C  [/ }5 o) F: B    location = /50x.html {
" i. n- R6 ?$ ]/ w      root html;+ H8 E' d6 U- K2 d' f
    }
: a# |0 u* n9 {3 \! K+ T  }8 f9 Y7 D9 M- s( C3 K# m% f
}
2 i* Z. E1 U& e. q' v. y2 X# H4 \+ l; w+ t1 P- N) V9 {
编辑反向代理服务器配置文件:! A( `7 d, X3 b; q: b
$ A& n" X) `2 H2 S9 e: N! u
vim /usr/local/nginx/conf/reverse-proxy.conf: \# k( J$ [" G2 ^( N

9 I" }5 ^- H9 ~server
$ @& w4 a' r/ @! Z3 [1 }. T{9 a5 }8 h; x% z9 N/ K. _
  listen 80;
. W6 y& E; W6 {  server_name xxx123.tk;* q% f8 A1 {- J( k! B" I: d
  location / {" H) o6 T4 k" K) r
    proxy_redirect off;
7 g- d6 E3 D/ T3 |    proxy_set_header Host $host;4 R1 y; s: T2 k0 t1 Q5 \  |3 [" a
    proxy_set_header X-Real-IP $remote_addr;
( G/ f% L3 J  A( q5 x/ ^    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;6 \0 V/ _4 {/ E8 V4 d1 r$ x
    proxy_pass http://192.168.10.38:3000;
1 }* {$ g6 a0 f9 h/ R  }
& A+ a5 n& H0 n3 _: F  access_log logs/xxx123.tk_access.log;9 u2 y+ \) c; X3 _2 t0 @. Y2 |) @
}; h1 N5 l$ ]( q+ I; e
  
( Y2 r, n, |% u0 z$ b( b/ I# t. }" Aserver
  G0 i" G" l  U, T& F+ g{, j% e; R: |7 b
  listen 80;
6 ^* }" e1 \+ e  server_name xxx456.tk;
" c2 y. f/ o/ Q6 o' g, H( g  location / {, K: `' \% w1 c" z
    proxy_redirect off;* O1 P7 E2 h( i
    proxy_set_header Host $host;4 d; Q* Y" C) c. c- U- A- H% y0 _
    proxy_set_header X-Real-IP $remote_addr;
5 ~$ g' m& [* W+ w2 _    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;" @% L8 d! @9 `9 u
    proxy_pass http://192.168.10.40:80;
* ^7 g7 R1 Y5 O# R% H$ P9 @+ X  }2 V2 ~- r' Y; |9 R+ }
  access_log logs/xxx456.tk_access.log;
" }( s: F, V( ?' `6 [  N}
* Q- l. _0 s! ^$ P) k1 y# f' j
7 D, x% M, U0 A1 `% y( o4 V5 _2 d; I然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。
. v9 ?( h1 S# o' g+ U2 q$ o& A3 ?" M% u  z/ K# |3 Z( t$ K
upstream monitor_server {
8 `% P  N+ n, }3 ]1 l8 `7 t8 [  server 192.168.0.131:80;- {9 G4 B2 Y  \0 `% t) h; m
    server 192.168.0.132:80;
- e6 X: m! z' q}
4 M; l# C% I! F" G+ G  
1 w( t3 x/ E) Vserver
) ?6 L1 g' ~- Z8 ^# v{
: T& b! Y( r* _) \9 x  listen 80;/ |9 y1 S" O! K' o' X& \! `
  server_name nagios.xxx123.tk;& e# L- Q+ d* O
  location / {
% O4 `# e/ e* I; n# v    proxy_redirect off;, n+ t/ o  l- C( y
    proxy_set_header Host $host;
7 u/ R5 x- N0 L8 t% t1 \. a    proxy_set_header X-Real-IP $remote_addr;8 _2 s6 x+ g5 d& E
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ' T+ ?% v" x6 @" X$ V, S3 ^
    proxy_pass http://monitor_server;
1 r6 b9 J8 r$ z9 @2 G7 N  }
' j8 ^& I' n8 w! N  access_log logs/nagios.xxx123.tk_access.log;
6 _- K# E: U. v8 ]' t  r}
5 `! }- r( a0 h- s- x, c, I; U% _: j% h0 g6 D
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:! \% H- A5 |  m5 v# e7 u
  f, ?3 O! d  q4 X
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" ': _8 n% ]/ q+ _# L
'$status $body_bytes_sent "$http_referer" '# a* [8 j; T% @# d3 k
'"$http_user_agent" $HTTP_X_Forwarded_For';* z: e. b0 B) w7 x: p# j6 a
  2 C4 M0 |+ l, ~4 y5 s! X1 m: E
access_log logs/access.log access;( w) E* i6 m" y9 }- X2 c( k3 v5 D
; [) \0 m) F- m$ b
再看看原来日志的格式长什么样:
+ H# ~% U# e' {4 I6 K+ r0 Z' s/ q  j4 i6 S& Q. c  f7 B! ^
1
7 \" _  e  @: q% X8 A2
. r' P7 o% d- ]  P/ p  u3  a8 N) ]' H& V' d) K) n2 m& p7 }
4+ g/ e! d& w# x  M1 |' u. |/ R+ I  Q
5
( o! o% S/ c; R+ h6 Y/ `#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
, z3 I+ e1 R7 `3 h; m- j# '$status $body_bytes_sent "$http_referer" '
4 }$ ~) ~4 Z0 k. G3 i! N  A# '"$http_user_agent" "$http_x_forwarded_for"';$ R# T& y( R% }2 N/ H, o! u8 S0 k1 X
  
) m# L( a8 I; c- n4 N* K#access_log logs/access.log main;
. D( c+ X$ z& n( k看出区别了吧   遇到的问题   之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
, b: d% e: Z! t* z% k( K
& u: B9 S+ r* I) p& M3 w12 W+ ^* F3 A; G  A% i' K; {
2: j# L& A" N; j8 f
3
$ O+ J1 o* q$ l, z2 C7 j5 Q4$ `9 _+ z5 B) f6 Z
5* ^9 C2 k7 R! b- T6 l$ X: J& p- j
64 |/ \( `" x! q; P& b8 E
7
1 b+ {1 R+ j8 g( A; h8
0 Q) f4 M4 P' k8 ?7 s' D! j1 k- N( Uproxy_connect_timeout 300s;4 O, }' u! M* u' C/ g
proxy_read_timeout 300s;8 V* M; N/ P0 [! T) [7 T
proxy_send_timeout 300s;& w7 c( M% n- \3 _; `
proxy_buffer_size 64k;
6 J* z4 F, c2 J# R* sproxy_buffers 4 32k;
: @9 T. F! h- n& _. Xproxy_busy_buffers_size 64k;
+ b: c4 L0 t! R) W$ s- X# D$ oproxy_temp_file_write_size 64k;7 K+ ?9 ~0 V! t! T% u
proxy_ignore_client_abort on;
2 D) N$ E/ d4 ^0 w! s报错日志:0 K# J' }3 A% a4 Q: x! H( D
+ n/ m$ _( B: v# U
...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。" A- s" d: C% g* p1 J

0 F: e+ V" C3 p/ [2 QPS:关于域名转发
+ @4 j6 A! R/ D0 m( V
6 F& c! n7 B9 V; o( 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/ 的内容。
" r/ O2 _; o* {( v
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-20 14:30 , Processed in 0.130691 second(s), 20 queries .

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