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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13563|回复: 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* C8 h$ z- x% {1 h( d, z

4 e  }; V8 P1 z0 R4 l
  1. ###更新仓库$ W: U  k* S# I9 P' G; E$ ^9 X  o

  2. & x6 Z1 c; h. U6 A! L' M- O
  3. apt-get update -y
    4 ]8 r2 o# ~) n1 i! L2 M) [
  4. apt-get install wget -y
    ( L* l1 G3 N7 p8 W* Y
  5. #下载nginx和相关软件包
复制代码

4 X6 v3 y  _. a0 C0 j8 `/ c4 _  Z+ N- A1 q4 y, f
pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
4 S0 @" J) h' p3 O8 @2 L
7 I8 P' v- H! }: F( A2 E( L# N
  1. cd /usr/local/src4 g9 z, w9 q) {& F; [9 g; {  J
  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>4 Z; g, f( j  C) {. R4 p4 ]1 d
  3. wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>" L2 [; c$ `" K$ N$ Q. A
  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 L1 }; W2 d0 o& p, N5 A) _8 o$ b# f
  5. tar xf pcre-8.33.tar.gz6 T7 Y$ I1 r; L
  6. tar xf zlib-1.2.8.tar.gz+ x' d$ ~. {0 p; B( H# L! D& l5 e$ Y
  7. #安装编译环境
    / D  l5 d/ D" B) Y; J
复制代码

2 g) O3 [7 {8 T. L9 k8 D # }7 a( c* y. i1 G: P
apt-get install build-essential libtool -y
+ r' T) L) R, W- _! a4 c#创建nginx用户
7 z( m4 ~% o5 O8 L* _( Q
6 R$ c, h3 v- ], ?+ v: H% [1 O所谓的unprivileged user5 {/ H2 O; p+ \1 W. X. H

& Y/ K+ m( k# K3 V. S
  1. useradd -s /bin/false -r -M -d /nonexistent www4 e  ^; C) I8 Z4 v8 H
  2. #开始编译安装3 x  _) f3 A  e: ~7 n0 u
  3. / W" ]- K) D$ V% K) t) r7 n2 g
  4. /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \; L4 X+ r* l- _- {- c8 d
  5. --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module6 f" H, V! ]' S& w
  6. make
    * X- r* O" g8 Y
  7. make install
    ) K$ ?* y5 V! ^  M1 h! n& M
  8. #给文件夹授权
复制代码
  t9 ~* E; [. k; f

) v5 |4 W$ N) u: k* I( Fchown -R www:www /usr/local/nginx
+ b" @* \5 E! D#修改配置文件4 C: b+ C- w% h$ ]& I8 s
vim nginx.conf9 j: i3 a* t4 |: F: S% i$ I# M( a

3 |8 g2 {; o- O, k* C- F. m% {/ muser www www;( S) m( F0 r' L" r1 s1 Q
worker_processes 1;
! j9 n9 g7 a' E$ n& {' B" u/ Yerror_log logs/error.log;0 F! R6 h8 v* I$ f5 b
pid logs/nginx.pid;
, z8 H4 {9 E4 Y3 K0 s. }4 qworker_rlimit_nofile 65535;
& i( k6 c$ k2 \% o' z8 Vevents {4 s" b+ ~2 o& O( O, L- }$ A
  use epoll;' f0 h9 ]% o% @4 [) w* T  w1 ]
  worker_connections 65535;
* k4 v" j8 C1 O2 p}0 k( S4 p4 t5 g+ p
http {$ A) `8 K3 g8 h7 Q4 l! z3 E
  include mime.types;
& m- e& M" p4 ?7 o& l" r: H# O  default_type application/octet-stream;
) c$ p; n5 @' V# s' a  include /usr/local/nginx/conf/reverse-proxy.conf;  ?3 ]5 O4 {3 g' ^6 X3 q
  sendfile on;
4 B  ^/ q" E3 x  G! O  keepalive_timeout 65;
( ^* I! Z5 R- [  gzip on;
# a% R6 ^5 C/ O  client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户- j2 j5 i& k! d, [2 j
  client_body_buffer_size 256k;" N( _$ f! D8 g( q4 k# }
  client_header_timeout 3m;; y% X8 B* ?: d- N+ V
  client_body_timeout 3m;& q% |7 b& i! P
  send_timeout 3m;2 H# t  H6 u1 }- {
  proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
8 m4 m  o/ V. s7 h  proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)4 }7 I: ]) [9 `9 z' _1 o) Z  ]
  proxy_send_timeout 300s;
& V8 m0 U' v" Y7 Z1 y& v* u  proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小2 @7 q$ |' y' ~% L
  proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
( b5 h) S: g( b* \- A  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)! b0 S/ r- M' {
  proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
* G5 z* B: c+ O  proxy_ignore_client_abort on; #不允许代理端主动关闭连接3 l) P" p; I3 n* h
  server {
+ i( x' _: r' t8 P% l( A% Y    listen 80;
/ G3 v9 j# h7 l    server_name localhost;7 G9 ^+ h7 ^  K
    location / {
3 u# h+ }- }* P: h% _& H9 x      root html;
7 Y) r5 W! j* s      index index.html index.htm;" P9 q& q! r1 u& ]) E% O5 X9 \
    }
3 ]% T6 z2 q) ~7 D1 D& y    error_page 500 502 503 504 /50x.html;
$ [- {6 [7 T! Q1 e6 l+ B* r$ t+ I    location = /50x.html {
5 g8 n% Y& v! `" O: l      root html;
: N; q' ~4 v# U/ L/ {    }! r! d- M$ O7 K+ K0 ?
  }
- ?3 B4 Y+ V. k4 Q4 P}& V5 x) P1 P1 H6 {, m* m
* K) Q0 N6 z, K2 X
编辑反向代理服务器配置文件:) M2 G+ y0 Y' }. v% l0 t7 N' o

' Z+ }2 p0 J4 y/ _9 _  G  rvim /usr/local/nginx/conf/reverse-proxy.conf
, i" J3 U& s; N  f8 j, l( m+ S6 f0 S6 |( f$ }5 q& V
server, X  x: ~0 n0 e9 j! g% h  J: j& s
{
" {, [0 c8 @- r  listen 80;
* j/ F  e- q0 X7 R! C  server_name xxx123.tk;2 X' Y; Y" D0 u3 p0 o/ _+ z0 }- X
  location / {
! l" T% l7 }, @0 S4 F    proxy_redirect off;
& m+ ~  F5 w# K& ~" R& D    proxy_set_header Host $host;  A- b+ a9 K: ]" C, N% ]4 h
    proxy_set_header X-Real-IP $remote_addr;
' q( b: C( C, U. q+ I    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;- ^5 ]* L2 O; p/ ^
    proxy_pass http://192.168.10.38:3000;* R- c, f* F6 y  ], u4 w" {9 l
  }3 b- n/ c7 X' D$ ]: l
  access_log logs/xxx123.tk_access.log;
. n+ A/ x  W6 T( v/ g! _}
3 Q' I- m, ^( A! J* K  " j9 u. z2 E/ V
server
& f  @8 ]2 v. m; G$ `{
0 J( e7 e& I# M% b# o: x  listen 80;
5 H4 f+ o- B' {  server_name xxx456.tk;
8 e8 y& T# p" Z5 a  location / {
$ |& r9 \! ?1 P+ I) K: }    proxy_redirect off;
0 a+ p4 ?- X0 K1 N$ F    proxy_set_header Host $host;
5 n  G/ k* v& z  N$ P2 \4 j3 @    proxy_set_header X-Real-IP $remote_addr;
2 P' Q( i- r; j    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;, ]! J& k7 J" O; E* A0 w$ ]! n/ K
    proxy_pass http://192.168.10.40:80;
1 c) a, v7 z( j. F3 G  }
* Q1 U6 z1 F+ h. l3 u5 m5 q5 D! Q  access_log logs/xxx456.tk_access.log;: l8 p; E% ]7 {( k( W6 M% J) a5 \
}
1 W" M1 y( b- h3 {
' n+ h* W! D' h- ]$ H5 ~然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。6 Z: P' A! q. r: N8 N$ U

- V3 p3 D8 k  D# Mupstream monitor_server {) ?8 f  n8 Z2 {: e: j5 }( ^
  server 192.168.0.131:80;
1 ^4 E1 s/ ^% J8 R6 i    server 192.168.0.132:80;4 h* k" r8 v; w4 T" z& M
}
( Z* |) [. `% i  
5 {1 R+ \! c7 l  V; m# w& userver
0 l8 `: v0 f8 ~) ~{
: O; W: b; O+ ?* \& j  listen 80;4 {' ]7 I/ ^$ w# l. ]9 {2 }
  server_name nagios.xxx123.tk;; L* R$ P  ]; _, R, M. r
  location / {; ], n5 X4 o( ?3 G2 [2 }7 Y' W' x
    proxy_redirect off;
4 S0 v' c( H* }: c/ g  z    proxy_set_header Host $host;
/ l& v; o$ G$ ?: K    proxy_set_header X-Real-IP $remote_addr;
) n' ^9 T* t' Z: j* i    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
0 ]) p/ z- ]* T, Q  k    proxy_pass http://monitor_server;
- Q$ \  a" J. y: {) \% X  }$ A, G( E6 X$ v
  access_log logs/nagios.xxx123.tk_access.log;
- u( o* E# @* h6 L}6 n7 c- v5 L( r% h8 w$ a

6 v. M) Y0 f: {, g( K( P额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
: q& N: ^0 U8 C9 S. `& S2 {5 ~- D# X/ u" y7 K0 M/ o
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" ') ?1 ?8 S# D* ?: J% M: [% o
'$status $body_bytes_sent "$http_referer" '# {& o  Y2 F8 |( T
'"$http_user_agent" $HTTP_X_Forwarded_For';1 {! d2 y5 K" S* }. o* N9 _. }
  
, a4 E' _7 m$ E2 j) \5 c) Jaccess_log logs/access.log access;
' j& r  n) j0 w, N7 ]4 A
8 o; Z$ S8 W4 r0 Q, |& x( R) c# I再看看原来日志的格式长什么样:
2 H6 l, z8 s: |: Y) J6 L8 m( z0 a/ V, V
1) T  y* s' ?5 U/ R# f# d" h6 E
2- n3 d7 @8 |. }: x: i
3
& R# T4 q; r  {- R( C8 e, J4 c47 C2 j4 n$ y$ A# Q" @
5  A5 z; H5 F# W2 D5 }1 G8 ^% }1 U
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
6 p. t9 c/ W4 l: f! R, w# '$status $body_bytes_sent "$http_referer" '
: \! m" m3 O6 Z8 i0 G8 H# '"$http_user_agent" "$http_x_forwarded_for"';- m# |. n  @1 [$ }9 W- ?
  
9 J2 u: k& n8 m& d9 e#access_log logs/access.log main;; p6 u: @, C9 ]( A
看出区别了吧   遇到的问题   之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
$ j4 N* L5 {$ r" H5 J
* j) d5 C" s: \- F: G8 \! O1
. H$ R- N$ S! ]$ f8 [2
3 W* D: \* g1 q* o. x9 [3
# ^0 \; B* T  S, F9 U' x6 H4  @* l5 Y, S! j1 E# Y) F
5
, Y3 T: C' w' t% k( h6
2 D1 k/ `0 C) @5 q, [7
7 Y9 P  b* W- q1 {8 a2 ?. u8: Z% L& g! {- b8 e# U  d- q
proxy_connect_timeout 300s;$ q3 j( Y% a" o4 D: ^  Q* C
proxy_read_timeout 300s;8 c8 |1 L# A2 g( x
proxy_send_timeout 300s;6 k" O9 P4 Y& p  y
proxy_buffer_size 64k;# v0 U# {! k0 e% Q& \+ ~0 ~
proxy_buffers 4 32k;
% \# x; c* ~4 y( R" Pproxy_busy_buffers_size 64k;
* Z2 Z  ^- N1 {2 Q4 F* m+ h+ ^: xproxy_temp_file_write_size 64k;
: h4 ~* x" R* V* K5 l& Bproxy_ignore_client_abort on;8 T& |& Z! q  C; {
报错日志:( _# ~3 o9 g5 k8 Z2 l

7 i7 [! c- [" }, _' ^9 a...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。
* U( u- v( M/ X" U4 ~* b% X% C' t+ n9 k, a8 V7 B5 Z
PS:关于域名转发
5 x+ {  B4 M+ J' u+ }1 ]7 Z6 T0 W+ Z; `" C' }. [! 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/ 的内容。  w" N! s; F# d! \' ~, t! H( C7 B
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 17:34 , Processed in 0.060625 second(s), 21 queries .

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