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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13970|回复: 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$ U- O1 E) ]  r

3 V+ ]$ _0 O% A5 H; f- k
  1. ###更新仓库" d) A. e0 ?, H" o) O# I

  2. 8 A+ N+ O2 @* L) Q6 O$ f1 l8 j0 Z
  3. apt-get update -y
    ( ^: T# C% d5 K2 G1 j
  4. apt-get install wget -y
    3 n3 t, I1 n9 G0 i2 y3 s/ s9 a
  5. #下载nginx和相关软件包
复制代码

& t: a! L1 G0 m% n1 x
- v1 J6 R! B0 m, upcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。; m  d  k" ~" W
3 k: g0 a* h, k$ b
  1. cd /usr/local/src
    4 b# D; _3 r* W( y4 W& k2 q# D" \
  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>6 w. @* S* [2 _2 B* m5 G3 V8 `7 n
  3. wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>5 m8 X* Q) q; h# T. a8 c% I2 C% ~
  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 S2 n! x9 y4 H' `! S" l
  5. tar xf pcre-8.33.tar.gz
    " D$ B7 B3 @- T1 c( F+ }% W/ J! j
  6. tar xf zlib-1.2.8.tar.gz
    4 A3 _' @- W1 p/ x
  7. #安装编译环境. ^+ v& F5 P7 E+ ]
复制代码

* H! A5 J% |2 D9 m6 P; Q$ G 2 \. ~( U: e* v) _
apt-get install build-essential libtool -y) {& {9 U. [! O2 b
#创建nginx用户
. F7 \4 d; |& z2 L- w* ~+ q
. t. Q8 u7 n) U所谓的unprivileged user" [! n1 ^4 _+ O. v- X" p  c1 S
" Y( V1 r* Z$ K8 ]7 w8 U$ ~5 J. P, o
  1. useradd -s /bin/false -r -M -d /nonexistent www* M1 e$ q: O4 \6 z" t. h
  2. #开始编译安装$ B% P6 u# V3 w- w' i3 V# W9 q

  3. 0 Q, H! W9 K# \5 h; N7 y
  4. /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
    2 E' y) B) J, r) B4 Y
  5. --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
    9 j0 X! z3 U; n
  6. make
    : h  h& w, v% _, }$ }
  7. make install: I% S4 ^& S2 @
  8. #给文件夹授权
复制代码
8 H3 P& x/ f1 [- @* g
) }5 T2 @, H; W" ]% r) J
chown -R www:www /usr/local/nginx8 s* _+ \3 X' N, `& W) n# s
#修改配置文件% h! p9 K# Q* g+ n# K
vim nginx.conf( a7 h3 l# {8 S& v) D
; e" d4 l- ~: a: D
user www www;9 W: ~' b8 x: _4 S" ]" F4 p
worker_processes 1;
+ ^* z2 ]3 X4 T" D" t# ~' J8 {error_log logs/error.log;
) n9 {; @! T  Y6 k2 T! P2 Jpid logs/nginx.pid;
7 [; y: L' U; K& M6 y' kworker_rlimit_nofile 65535;
- x. _* b( c! S( oevents {$ r9 H; `1 S. G5 L5 v
  use epoll;
9 |1 k. B8 T$ s/ J& m+ G/ z  worker_connections 65535;( M. e  y+ E" M
}
8 w, A% G9 S7 u! ~3 h# yhttp {: a5 C' e, b0 I8 Y7 f
  include mime.types;9 s; L/ w) Q) @3 \* x. I
  default_type application/octet-stream;, Y% G0 [) t1 `  T
  include /usr/local/nginx/conf/reverse-proxy.conf;3 I' `6 S5 u7 m6 |/ O$ c. w* Y
  sendfile on;
1 I* t5 A0 ~9 e1 p  keepalive_timeout 65;
0 \6 G& U( b2 S1 b4 ~# \  gzip on;
8 }8 e, \! X1 J6 [  client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户: E  u- y+ C4 U- w) F( V
  client_body_buffer_size 256k;' J2 y$ m3 L. Y& [+ ~( t
  client_header_timeout 3m;
2 G: ~9 g  s6 h# K" r- m  client_body_timeout 3m;) T( b9 C6 Z2 t
  send_timeout 3m;2 ]# e* _) r" d/ }' B' E$ O* W
  proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时); ]9 \1 V- U+ ]6 G% F4 f' Z5 t' F
  proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)2 S2 P) m! A0 k0 i6 D: w0 g3 S: x& d- H* E
  proxy_send_timeout 300s;
, l* P# d" k. ]- _  proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小3 P% V+ Q) N+ C. l
  proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置, X% I/ q' |8 ]1 Z0 E
  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)) ^* y; C9 z, ]0 g
  proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘  N9 V% f, M% b0 R- V. f
  proxy_ignore_client_abort on; #不允许代理端主动关闭连接# f& H) k8 r, u
  server {" n: H  |3 x& z
    listen 80;
& G7 R; F# |) b4 E    server_name localhost;/ D4 G% M- c! ^0 [2 F& |# u
    location / {
8 u% X$ s  ?9 }6 F- {      root html;  K8 L% D. h2 o- q1 o6 u, ~; T: X% J
      index index.html index.htm;
( c/ k1 J. `. q0 b" r    }
. P' x( b8 u" g& a$ Y# m- M' @    error_page 500 502 503 504 /50x.html;
2 d6 X' ~+ _$ x  F    location = /50x.html {
2 L" ?2 a6 S6 ?* S+ ^& n9 J      root html;/ s6 u- i0 n/ W3 @. {* q# ~4 g  A# z
    }* L& x8 y$ u# r) N0 c; C7 q
  }
' f, a5 w- ^7 ]4 C9 ?  l}
6 x' Y* N( s7 I$ c1 n
  }7 R/ K' E7 h) o4 a! H, V编辑反向代理服务器配置文件:
, a' J( g" ?3 z; a0 E( b; p6 {. [. [: N' R! b. N5 G& D0 ^2 |5 g
vim /usr/local/nginx/conf/reverse-proxy.conf
. t  z' V/ X6 d! m7 V
5 B7 O6 H' I, I5 oserver
! f& _/ Q) g" j1 e; O" [& {" T{7 x* ?5 R  Z) d; c$ N" R
  listen 80;
! }! _3 e# Y* q  server_name xxx123.tk;
! ~, W- A1 E/ c6 S9 j  F  location / {
# h. f9 e$ E5 S0 R- R4 n8 ]3 ]    proxy_redirect off;
$ l4 H- P" p" g7 W6 ]/ G    proxy_set_header Host $host;" [' [+ |8 g. Q) H4 T# [2 G2 k1 }
    proxy_set_header X-Real-IP $remote_addr;! D, n. G2 s$ F  e  E
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;. s; K; g  V: W4 t
    proxy_pass http://192.168.10.38:3000;
7 }' l1 V. \; \8 C# n$ P  }/ a- x% x; _+ `* @
  access_log logs/xxx123.tk_access.log;
3 @& A0 Y6 }% V/ x* ~}, D) Y9 `. e/ b
  ( ?4 V$ B; G# z! R8 w% R" P% `9 E
server
/ U, p, X8 P& s$ o" z8 s{
5 \4 g( d, r4 `7 j& x0 J; x; y  listen 80;
# y% B; [: p8 ]% Y- k1 k2 k! v  server_name xxx456.tk;
. J" Y! `; t: j# m# g& b  location / {
2 S# Z1 _7 }+ O- @$ O    proxy_redirect off;7 D& I1 J3 z7 Y5 G
    proxy_set_header Host $host;
4 t6 ]1 ]8 S# ?: Q: P% Y) _    proxy_set_header X-Real-IP $remote_addr;
. ^' s$ C7 l' Y( c$ T* u; s    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;8 D; y! ^9 R: {6 M5 J& ?
    proxy_pass http://192.168.10.40:80;% m$ E1 p; O* ]1 k+ [
  }
# j# ^( B' |, E  access_log logs/xxx456.tk_access.log;0 z+ |0 B( p/ P+ H& E0 g& X# n
}
. j0 h# R; q% d8 `9 y' `) C
. l: _5 S6 u: S/ ~* `然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。
9 t8 M% O, x# G3 V1 [0 p! P( |9 J9 W( S
upstream monitor_server {. j! _" ^1 G6 l% [* ]2 V$ h
  server 192.168.0.131:80;
4 p8 \3 O" ?" T8 ?; g4 E    server 192.168.0.132:80;
  c! [( d. D' C1 U5 V% q: r  I}2 e( o+ @! W' c0 f+ l. v
  ) e; i$ B+ _* O. O
server
  b6 w, }' K, V7 q! h9 c{3 L+ C3 s  m2 W; W9 Z
  listen 80;
4 M, Y3 a2 |, B6 A' }3 n; R  server_name nagios.xxx123.tk;
* `* S( g& ~0 ^$ r  location / {; `7 u  f- W& ]/ ^# p
    proxy_redirect off;
' J8 @$ Q6 \6 ~8 V: `. B    proxy_set_header Host $host;; h2 ~9 M% u% D! p, A( l. k% a
    proxy_set_header X-Real-IP $remote_addr;
. b5 m5 E. Y" r, p    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; $ s; v/ |2 u1 n8 K7 `/ {
    proxy_pass http://monitor_server;
1 |2 X! C% N3 F0 s# r  P+ b  }
( q' I+ T& d: I- H7 q' U  access_log logs/nagios.xxx123.tk_access.log;
3 E* }+ V7 f& V/ f* r}) g- i% _1 d6 ^- a/ R# R
* y# O# o" Q$ ?$ K% y6 P
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:% u0 F9 i: H' ^& o2 S

" ]! K2 r: D1 f  B3 ^8 U; d3 C1 Klog_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
4 f) J7 ~* P) h3 F. O, D'$status $body_bytes_sent "$http_referer" '' a6 d! N1 z# [) ]) l% e: `
'"$http_user_agent" $HTTP_X_Forwarded_For';
5 ^1 l1 ?  H) x9 [: w& m: V  
* j# O) T% l) }' N9 F  k! {9 o, D) Paccess_log logs/access.log access;  ~  l( {9 F  K& U9 w

8 _/ E1 m# ]5 }: m8 u再看看原来日志的格式长什么样:
  G7 Y8 I) N  a' a
/ n* O' C* |5 U4 b  W5 C. q6 @: @1
$ @; s6 i9 l* z  R8 ~- x2
1 u) e* d6 s# _* L7 I31 f* I- h3 M! W, N. [4 A- c# A
4+ ?# [" b, _. k0 m
5+ M' w3 X8 }) F7 [
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
2 }5 _* @6 B# n* A) ~# '$status $body_bytes_sent "$http_referer" '
8 X7 o# T2 P* }" p# \* Q, [% U# '"$http_user_agent" "$http_x_forwarded_for"';: o1 P% \5 L: p; u
  9 b( ?5 t6 r* D3 m4 @' j! s& X
#access_log logs/access.log main;5 `6 h; x. x4 ^
看出区别了吧   遇到的问题   之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
& x9 S, U) }7 D7 ?* Z5 \0 }
  e3 a. d. w. b/ v, j& q1
- I8 k# S4 t! R1 {9 @0 X6 L25 u; R4 j' g  v. C+ f. b" V, z
3
) k, O# w' L: w44 [( z! \5 C! @$ @% O; L* h) Y
56 ^* W  U5 m9 |  ]* R: l  B, H) o7 j
6
4 Y- Y# {( E) [7
6 ^; ^/ i6 s2 e  j4 f- W8
. ]- [' {* `' {: I+ ~4 \! Zproxy_connect_timeout 300s;+ z! R$ F8 z9 M; Y
proxy_read_timeout 300s;
4 v/ m1 y) X7 k4 yproxy_send_timeout 300s;
. p" b+ s& d( w" D& `( V2 cproxy_buffer_size 64k;. U4 L/ N7 \. O7 b, W8 y) M8 v- u
proxy_buffers 4 32k;0 n5 p' d% u( k& }
proxy_busy_buffers_size 64k;
7 M& t+ v0 z5 B- {* eproxy_temp_file_write_size 64k;+ @3 T# w" f& a- }4 b+ j) ^
proxy_ignore_client_abort on;2 w3 A2 w0 T. h& Z
报错日志:
; ]% D4 x! {. W: [  m, ?2 }6 p, y! n9 M! L4 ]( R
...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。
. A8 N8 H" ^$ }2 ?3 d3 b* \
% z% o7 M+ C& I( oPS:关于域名转发5 g9 J- ?/ e, d6 _4 m' r  }' }. t
2 Y; Y+ X$ V" r( u( s9 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/ 的内容。
  T" @  S2 T: ~) @' Y0 o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 20:52 , Processed in 0.060655 second(s), 20 queries .

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