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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 13972|回复: 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  g1 {/ G8 N9 Q  r5 {! v
4 r; A0 C  y( a1 i7 c( H% [8 g+ f5 V
  1. ###更新仓库
    + d% k( j- r8 I0 m9 k9 V! e6 k

  2. ' e* }, ~8 ]6 l0 d1 P, y
  3. apt-get update -y
    . G1 N7 F2 `2 [4 _
  4. apt-get install wget -y4 H) v$ Y/ k0 _2 l
  5. #下载nginx和相关软件包
复制代码
7 }7 u: S0 R0 c! d0 h* E
# Q) u6 i9 C( B; c: B
pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。; a6 b1 @8 n6 U4 d3 X
- t# ?' R! T9 q% Z/ p4 }
  1. cd /usr/local/src% G6 ]- K5 m* I- J. H
  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>
    - A$ p5 v+ a' j; q; @+ h
  3. wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>
    5 Q' Z% p. X5 Y) ~
  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>
    7 G0 ?* c7 F+ G  d6 f  D
  5. tar xf pcre-8.33.tar.gz
    . E, K* p, a# l3 f
  6. tar xf zlib-1.2.8.tar.gz
    6 W& f' v/ ~( N4 L* @4 C3 ?
  7. #安装编译环境
    ( Q: O4 ]- M0 m1 n; L* ~7 z
复制代码
2 t8 ?- K* x- ]' U& q

+ d$ v/ C; ?4 s" M: a+ r- I1 r apt-get install build-essential libtool -y
) S4 |% h# c, Y6 k# Q: m#创建nginx用户6 S' [  P8 H% `& e  n/ U% i

! C" c+ i6 |8 d$ B$ O1 Q所谓的unprivileged user
, ^4 ]* O$ d2 d9 t, V/ J2 F2 [' k$ H# p* J7 N' E0 t: |
  1. useradd -s /bin/false -r -M -d /nonexistent www
    ! I3 q4 k6 E' n! B, O
  2. #开始编译安装* Q  x& c! v8 r1 W' G% |) L

  3. , t  s8 F" ]0 l$ a
  4. /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \3 Z" s8 H" U7 S9 |8 u' A
  5. --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
    + H% l) ]6 s( Z& Z
  6. make4 l6 k' K+ [9 B" V1 b
  7. make install$ t# l" J8 w8 P+ q. I+ B# u( F
  8. #给文件夹授权
复制代码
/ t6 Z" a/ E' D. [# a
9 `3 y$ M( {4 w* s  ~2 @
chown -R www:www /usr/local/nginx" q# ]- z5 G: f* |5 M+ T/ c
#修改配置文件+ |0 u( N# d: n- j
vim nginx.conf
6 a% \, x: b* G9 b9 j/ {, G: A7 ~# ]' S% m+ j
user www www;0 r- s' @5 J: `& M  s* c$ x
worker_processes 1;) D1 P7 F' j2 R4 Y7 |$ \* M
error_log logs/error.log;" m; P% N) A( B) {% u" F/ q& c
pid logs/nginx.pid;
  {( f; z! W3 a% fworker_rlimit_nofile 65535;' Z, @& m) S* f2 ]' t( Q* Z
events {" s/ s4 F& u$ l! I" A0 w
  use epoll;
' X9 g; J( |1 |5 `  worker_connections 65535;
" |7 C$ n2 Q% k) f}( t8 L0 S  K% h1 c6 c
http {
' d  ?5 I9 A- o+ {/ x* u" o  include mime.types;% N6 E" ~+ C5 B7 l) w
  default_type application/octet-stream;
  ]+ y9 I2 y& H# m: q- O" X/ ~. c  include /usr/local/nginx/conf/reverse-proxy.conf;% l! X/ }$ c2 H: E
  sendfile on;5 q3 e, e, v: [
  keepalive_timeout 65;
4 D, ]1 i' X" ?" b; C+ s  gzip on;
& ~" C: u/ Q3 O3 A. L  client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
$ {/ s0 M* R8 z9 g# A  client_body_buffer_size 256k;
+ x: j+ T: W- n) B/ d8 ~! X+ `, r  client_header_timeout 3m;
+ S: A: e6 y7 L+ @1 q9 @& A  client_body_timeout 3m;3 A! M( L; d( o; i* _, H# ]! @  I
  send_timeout 3m;
# U$ I& p1 a+ {" g1 q. R  proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
6 g! A* I  H" U3 r2 [; H0 ^) Q  proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)7 S$ N' @1 t2 h
  proxy_send_timeout 300s;6 h* f( k: m- M' ^
  proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
: {( d; D9 I2 ~' [9 D# @  proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置6 W1 b6 Y1 T. S8 ?& U
  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)5 l+ C8 A9 r1 R4 H
  proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
7 Q- a9 K: c' G- ?% V" A  proxy_ignore_client_abort on; #不允许代理端主动关闭连接
" z5 U% V5 i0 H8 P2 i' N" N1 r  server {
  Q: U8 T$ q; k. o/ ^    listen 80;: T4 j; H  r; T/ d
    server_name localhost;7 X2 |( y+ _; F4 G5 C
    location / {
3 M2 M) j; w; i5 j9 j. g      root html;
2 v+ l$ C& v+ w' q      index index.html index.htm;1 [, A  }$ O6 N! a0 ]
    }' _# F% V# Z3 Z4 R) f: ]' P
    error_page 500 502 503 504 /50x.html;
+ w$ p( C( u3 r: k0 ~    location = /50x.html {
* E" a% P+ Z4 [' R/ I      root html;
! [  M8 [0 R3 m, i9 A, |    }  \1 b: A3 m2 ^
  }# c! O7 ]1 y( \( h* ]
}
7 k% P9 p( W; I; q$ Z. {- j
  Z  a& z9 L4 J2 \$ K( x9 y编辑反向代理服务器配置文件:  _' l. n0 j! E. J7 J- C, |3 v2 W

3 M4 M  V/ _4 C+ G& Q1 |) x8 n  Qvim /usr/local/nginx/conf/reverse-proxy.conf
6 i2 a( i! A/ Q7 e* r8 z6 e" z$ c/ }% ^+ a/ `. |% f5 N
server3 H8 y$ a7 Z- e, B+ k  ]. i
{
6 J& ^, E. ~+ ~/ J; I4 z  listen 80;- ?# ]' U9 W8 l: d" p
  server_name xxx123.tk;# T- ~8 B# t3 _$ n' ^* y
  location / {: r2 d* E; C& m4 y' {% `! S
    proxy_redirect off;3 X4 A' A) T; e! b" v7 A
    proxy_set_header Host $host;
' ?3 X6 _4 l% M" Y+ `: ^1 F    proxy_set_header X-Real-IP $remote_addr;" r) V( M6 _9 r6 G: }8 {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;: n1 M% u- L# _* L4 q% L2 x1 M
    proxy_pass http://192.168.10.38:3000;' P  D: d% |' }: `) A0 r. @
  }
/ e- y9 j1 S. b* ?1 r0 q8 {  access_log logs/xxx123.tk_access.log;
  q4 w8 P2 f3 ^}
# t3 S: `0 x2 V, x9 c  
/ D* B& t- |( N! H% \' i  Iserver  V% D0 {* b0 J- |* Q
{5 K* S- Y8 m- ~6 |4 n
  listen 80;# q2 l) X& H# t% |. `
  server_name xxx456.tk;
4 P" p+ K* }; O& G6 c9 n  location / {
2 C, ?( g5 @  T& Y* ]5 M" m7 {( B    proxy_redirect off;
4 v0 m# o9 G" C    proxy_set_header Host $host;
/ B* B1 \- ^+ _    proxy_set_header X-Real-IP $remote_addr;
+ V8 y( S: m+ m7 l: P8 V. J    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  g9 ^) k) Z/ J' f) V( J2 Q- M4 t
    proxy_pass http://192.168.10.40:80;
$ y. {9 u8 ]: n! ^* `% y& s  }( B7 }9 M8 Z# x7 k
  access_log logs/xxx456.tk_access.log;
( o: y$ q8 v% V, G5 n3 F}) K# p' T6 u  b6 P7 E
5 m9 }) N, p& T! g! Q
然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。
4 D; m$ s6 P( ~; v/ @" u% @, n% e& ]8 O; H
upstream monitor_server {, |9 y3 z! i" l! `
  server 192.168.0.131:80;7 i9 O: \- v" E- V' A3 @1 s
    server 192.168.0.132:80;+ q& Z/ F6 m! e. x; u3 `
}! x( n1 d1 `2 D/ k! h! k. c
  3 m% P# c( Z! E, T& T$ i. K! [
server
; L7 F5 D2 O. C, n) }, @) ]. g{
# W9 Z* U9 b" r# z8 ?' q  listen 80;
; r8 b: V* m/ M, X  server_name nagios.xxx123.tk;
- F; S# @, p7 f/ \  location / {8 Q( c; L0 M0 e" V" N: {8 T
    proxy_redirect off;7 {/ e3 {& y8 Z# I9 t( m
    proxy_set_header Host $host;% o" D( O# C2 d! O; u; N
    proxy_set_header X-Real-IP $remote_addr;
5 P, e7 X7 G, v; c, N% x    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
: w0 Y) ]; ]/ P0 C, s    proxy_pass http://monitor_server;! J- A. d2 K9 ~$ w
  }
+ A3 `. p5 p- _0 {$ A  access_log logs/nagios.xxx123.tk_access.log;, ]7 ]1 c; W. k9 x
}
1 V  w3 n9 P2 S
& ~3 X8 L- x5 t. N# Q% Y* x+ z额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
% }9 Z6 @( i. z. w0 g7 J( ?  V! [9 _' I* X
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" ') j0 N- X& V- w* `" M/ t& `3 f. [
'$status $body_bytes_sent "$http_referer" '; C+ Q. m7 l$ j, x$ e# B
'"$http_user_agent" $HTTP_X_Forwarded_For';' N: g4 c8 T9 y1 L
  
, k. A. F4 c( |/ h  T. \  Iaccess_log logs/access.log access;5 }5 T* f( ^) X) f' w) l+ P
& c8 E% A9 E5 p$ v! Q
再看看原来日志的格式长什么样:
. t' g7 c# X( S* s" F
" O# Q! o0 [, |) [1! i: u6 E1 L* ?0 p# `6 K3 b
2
5 H. l6 P/ f- e' o+ f3
5 b( p6 Q8 S9 c* x  H1 G  e' u4+ o- M+ F+ L. A  C
5
) y8 K' N1 m+ r/ a/ {& f#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
* C" r& n& t5 g# h$ r# '$status $body_bytes_sent "$http_referer" '
& q" B& x4 P% p+ {5 c# '"$http_user_agent" "$http_x_forwarded_for"';3 G4 |( X' s3 c; U( A# k" A
  
2 x: K5 d3 F+ a#access_log logs/access.log main;
' J* [2 G' E+ z+ s看出区别了吧   遇到的问题   之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
( ?; M& s$ d: b  {0 e1 |( K9 ]8 [. o/ W
1
1 Y" H) T+ O+ S: K2 v+ a2" _( y" i1 T* ?3 o! t- N1 E- G  m7 C
3
; h' j0 c: f; A6 `# f  n6 x3 Y4( Z8 k  h" p: w- G" `9 k0 Y
5
5 B" t. n4 R& R+ x1 z; M0 r6
( J. l( e1 F, v2 o72 }0 A5 {, \0 b' v
8
0 \) ~' N: H  m* n. eproxy_connect_timeout 300s;1 z5 W. m" J8 ?% f8 r' u
proxy_read_timeout 300s;; o3 S  {) Z) H. k) x
proxy_send_timeout 300s;. j* n( k9 l3 {" @
proxy_buffer_size 64k;
# V7 S5 v* U/ F: z& M: Nproxy_buffers 4 32k;
& T( a: Q" `1 p+ H* D9 B5 C' |proxy_busy_buffers_size 64k;: O/ N" T, [: \9 w" ~
proxy_temp_file_write_size 64k;
$ Y) s  a* _& F" gproxy_ignore_client_abort on;
& l- I8 i. u5 `3 Y报错日志:
. N# h" ?( m; _/ g8 A' p2 i7 y$ ^# T7 n9 k  t8 Z
...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。
2 m5 F+ C6 E# j) ]( V
: w' y' n" C" I7 i) a( `PS:关于域名转发
4 m. b7 d0 t/ B* w) F* J( @9 a. [( E" {: i# N7 J* ]! K
所谓域名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/ 的内容。
+ Z2 C8 T* o) n' \1 z  [
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 21:44 , Processed in 0.065220 second(s), 21 queries .

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