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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 14128|回复: 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.047 |0 Y6 H5 G7 h4 S9 L+ [
, E# b( X8 [: z
  1. ###更新仓库- P! j) t6 \$ U/ O6 N

  2. " }( X7 K& T: O* i
  3. apt-get update -y
    & s  H; i4 _9 @+ e; Q) E3 b& J! L
  4. apt-get install wget -y+ T- l( `& R# V" L6 w+ d0 e& J
  5. #下载nginx和相关软件包
复制代码
/ w7 W  a- n; c/ A

5 I# b! I* o$ d( w) X) G3 {! ipcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。2 v3 M. D# b+ w! @5 W3 C
" s- V  V1 @0 L7 K% I- a3 H1 l0 R) t
  1. cd /usr/local/src
    * @  e8 _. ?+ d8 w
  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>
    * R) O! C. Q) z9 U$ |2 n, z4 G
  3. wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>
    + t( i1 |. m0 O9 t. T% A0 h, i7 i
  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>
    ) R0 L9 _( p$ F- K; L
  5. tar xf pcre-8.33.tar.gz
    6 Y6 \* A  L9 B; Q  O4 J
  6. tar xf zlib-1.2.8.tar.gz
    - a* g! u# s4 Q
  7. #安装编译环境
    7 Y% e+ P, _" |/ L$ A& Q
复制代码

  h( o! @: n9 z
7 N5 _: U: a4 d8 f8 O apt-get install build-essential libtool -y7 _; B- T% J; J3 x5 s5 `# y
#创建nginx用户6 |" [# ]$ K5 K- Z5 Y4 t) y( P

- R1 n5 @+ I7 Y* _3 K/ z所谓的unprivileged user
3 {- s+ [6 W& M
* Z- D/ S: [7 I. Y# q
  1. useradd -s /bin/false -r -M -d /nonexistent www
    ; Z: p, \7 L% f/ Z# I
  2. #开始编译安装
    % G  \+ ]$ L0 L% q$ Z: @2 \* o

  3. 7 h; @4 _1 d0 K+ E
  4. /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
    4 g( C2 q) [6 Z; [2 \
  5. --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module8 G8 U% s# i; j( i/ q
  6. make
      p# A* K; U, ^1 r# R3 q
  7. make install
    ; G3 f! B6 T0 x1 t& q* T% a0 X: o
  8. #给文件夹授权
复制代码
  T1 E+ {# v& q" {
8 Q# \9 G/ {0 U# _! J  B* E
chown -R www:www /usr/local/nginx
4 M' z0 }/ n- c4 k  Q  y#修改配置文件9 _( U& x8 m% c: j- I, U
vim nginx.conf& O9 ^5 T% e$ U6 Z
8 m' _2 X0 j+ l; O
user www www;
" ]2 T5 u; e. l4 U2 p1 Y; H4 Hworker_processes 1;" Q" ?) t+ @$ r+ C9 K5 }; W. W8 P
error_log logs/error.log;
- V7 w% E% U" Q# u/ }6 `4 k7 upid logs/nginx.pid;
2 c" ^- k8 v7 k! ?- e' l8 R" p1 uworker_rlimit_nofile 65535;5 ]- I6 J* j5 X4 o! y& J2 Z+ j# d
events {3 [+ P/ W; R3 k0 C' ~" X
  use epoll;8 b' M7 _* O% c, T: l
  worker_connections 65535;
. D( P2 }3 S5 I0 M4 j: E+ X}! P2 G" U2 v9 w6 J
http {3 f7 m( i4 d$ k! J3 N' e
  include mime.types;3 ~* _0 P$ D# |, o0 M
  default_type application/octet-stream;
& C4 X  S9 c; @, v' z+ b  include /usr/local/nginx/conf/reverse-proxy.conf;1 ~# c  @! J8 B4 `- ^9 ^7 c  B
  sendfile on;7 _  a" `; j4 O# Y" Q( j
  keepalive_timeout 65;
4 }! I% k/ ]. M  gzip on;
6 F7 k" E/ o, t& P6 V) s$ J0 r& y9 m  client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户4 w( W1 H" e3 j% n3 Z
  client_body_buffer_size 256k;
. g4 ~4 X2 x, m( C% a  client_header_timeout 3m;
5 ?1 U0 g5 `' a& \  client_body_timeout 3m;/ A- c" a6 E% V. m2 h, N1 Y6 n* W
  send_timeout 3m;+ t$ H! Y6 q% t! k+ D
  proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
8 _$ \3 a( I6 W- ]$ E  proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)1 {0 C; I" P9 c4 A$ m
  proxy_send_timeout 300s;
) c) v3 ~( r- l) I, G; [  proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
( G2 G6 }. u. ^( Q7 A" t  proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
8 Y* m# t4 a( a+ L$ Q: c6 U  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)% E8 S! c4 J5 g8 e. W
  proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
- K# h7 U8 n: s6 _  proxy_ignore_client_abort on; #不允许代理端主动关闭连接
) {( `) E0 P& l& [+ P  server {! _9 p3 D9 k. t4 W) Z
    listen 80;
0 |+ \+ T3 t- g, W* J) B! Y8 f8 B    server_name localhost;
* e9 n- e, x, r  x6 D* B    location / {8 C/ I/ O3 \2 T/ E4 f
      root html;7 n0 S$ _5 ~2 T- w
      index index.html index.htm;$ Q6 l, ~3 s. o8 ~3 C! U  W
    }
( Z( m: i$ _, _( A5 Q4 l    error_page 500 502 503 504 /50x.html;. u4 ]$ e( @5 w, A- i2 K
    location = /50x.html {- h! i- Z: p3 m  r6 k2 c& ]
      root html;
5 O/ ~3 X4 S& v+ n4 ]    }$ u; A1 R7 J! O# R4 r( }% r( u
  }
8 d6 g7 g# N6 h# q}- n# e$ B% z2 K: }

2 ~! u+ l! z9 G) e5 V; }% W' M编辑反向代理服务器配置文件:
) T! ^- j2 p5 V! [0 n& ~8 |1 k
# I/ I* e% T) F/ o. I$ O% ]vim /usr/local/nginx/conf/reverse-proxy.conf# g# Z5 C; x+ _

: K1 _4 y4 s/ m- X* q8 Kserver
2 u& B) k1 p, u- H2 q* ]{5 Y& f# m# ^( x; R4 s- T2 ~) M
  listen 80;8 d7 n- X  T1 f! Z; n  R
  server_name xxx123.tk;& A1 U7 A; w9 o
  location / {
( \3 ~3 q( x0 C2 C& i: n    proxy_redirect off;  Y; ~! L7 k& s: R( \
    proxy_set_header Host $host;8 }# r6 A/ u6 w8 b3 O
    proxy_set_header X-Real-IP $remote_addr;
8 q- F$ O% w, X+ G2 G7 j    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;. x1 [, U3 [4 ]8 k5 L" g; A0 u* \
    proxy_pass http://192.168.10.38:3000;
! a/ v( o4 y, U- j0 _* G3 H  }
; \9 m- {' V; u0 Q! m  access_log logs/xxx123.tk_access.log;
' u) a6 l) U) f}
% D/ W3 w/ o# D( {3 y! E& `; V$ n: z  
' H" R7 M. X! _7 s' ^3 `$ pserver3 q% j/ D6 k5 A5 H1 u
{7 W% ]! N$ ?, ~2 {
  listen 80;
4 ^: |3 m- k( ]$ J  server_name xxx456.tk;3 E8 U3 n- Q: L* O3 u
  location / {! W0 ^9 e2 n# ^2 h& H
    proxy_redirect off;: ^. h' z7 F$ r7 r7 U( _
    proxy_set_header Host $host;& [6 t; h# w) V7 R- l
    proxy_set_header X-Real-IP $remote_addr;
$ w+ _. K1 f$ `0 c  K. g: i8 x    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
, `% h" c0 E$ I6 K6 S4 F  y    proxy_pass http://192.168.10.40:80;
- e: c( g- Z* J% E3 N  }
7 J0 t2 J3 p) \  access_log logs/xxx456.tk_access.log;0 s& H6 t" C( D- B
}0 w. I5 M9 r$ [
; V# X9 i1 n  L, f
然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。6 K8 v0 {. h- E. w

. ?& U$ k$ _# @( n" l& Eupstream monitor_server {
4 c$ l4 o! T4 x' w# o; t( T  server 192.168.0.131:80;/ T; F6 Y* ^. o3 F7 G; X
    server 192.168.0.132:80;1 x) X8 b6 x# |5 `# v4 O$ E. s
}
( Q* B! O- G) L/ k- y  
( E* I# V" m6 a( a4 s% [server
0 ~/ j2 R6 [4 ~$ H, @7 c% a3 C{
1 }+ `1 A2 \' T/ ]2 X& K! }6 T% ]  listen 80;" Z# I( W/ X  b, ~: R4 e
  server_name nagios.xxx123.tk;
/ Q* o( G7 q. G$ d- ?0 C: J$ s  location / {" U: O3 l" G$ i  ~& Y& k
    proxy_redirect off;
9 ?( }  C$ d  Q' r9 i    proxy_set_header Host $host;7 n* b% \/ `* M/ p+ H
    proxy_set_header X-Real-IP $remote_addr;
" M( `; z* A  i7 c; H    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; & u- `+ h' E; w+ e3 Q; [( E
    proxy_pass http://monitor_server;
( l8 Q, e. i0 o. S# M2 P& {  }
1 [+ w4 M: V: S, g4 u  access_log logs/nagios.xxx123.tk_access.log;4 K& H3 V1 w( |) Y+ h# |
}/ Z* g3 @( S8 I4 }+ B' A
' I+ l' I; X4 `$ i( x
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
0 A% d/ w# @3 z1 C/ W0 t
0 |) X$ u0 E9 s$ A7 ^. }3 [# Rlog_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
) ^, s2 ~9 \6 m* \& p: S( O+ Y'$status $body_bytes_sent "$http_referer" '' U7 ]/ f9 u6 V# `' u
'"$http_user_agent" $HTTP_X_Forwarded_For';
% x9 x  L! l! f* x6 v  
) |7 `7 M1 V" x3 z! `2 g9 laccess_log logs/access.log access;
6 J9 {! H5 H+ J4 F5 d  p8 u- c7 W+ A3 a- S( V
再看看原来日志的格式长什么样:/ N$ L2 A9 |7 j/ A, r
; Z! _: @# v: z, p; m( z
1
. q# W% j) m# Y: e; B2
' M5 u7 L( A, y& p6 C% C3
% c. {+ {; [6 J( ~: u4
% ^* v- F: `7 C! s- W4 e7 F8 {5
. z4 `3 H8 I: w0 [$ Q#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
4 g$ {8 a& Q0 e# '$status $body_bytes_sent "$http_referer" '% W  v- r7 S0 V. [# A
# '"$http_user_agent" "$http_x_forwarded_for"';
' W' m1 R* T" l- ~  % j6 W( J. a  h. W- W2 F, U' w& x
#access_log logs/access.log main;
( f/ a5 O9 a  h" L看出区别了吧   遇到的问题   之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查. k; w1 w" O2 Y

" m$ y" S( d( T5 r% U8 F1) H/ o, l3 U5 ?  ?' _! H- R
25 d6 w" y0 g6 F7 m1 {0 H
3
( X7 a; m' o/ t& }+ ?- Y6 H' E4
) ?7 Y9 [, g0 c6 ^1 [9 ^5" T. F% s) |. o3 H4 B* ?
6
2 H+ }, Z) m( v* n0 d2 s& K7
$ {( }& U: j- f  w/ s5 ]8
4 s! C3 e: @5 r$ }( ?. e3 b- u8 k3 d. Aproxy_connect_timeout 300s;
8 K% q- T+ k% E, g8 G# f! X* _proxy_read_timeout 300s;! l  N9 v3 U3 C4 @
proxy_send_timeout 300s;
2 \# Y3 c4 q  ^proxy_buffer_size 64k;5 l( b, Z: T( O! R
proxy_buffers 4 32k;7 w+ k! a: k7 i) L
proxy_busy_buffers_size 64k;& T: r$ r- K2 e% x% O
proxy_temp_file_write_size 64k;' \/ ]' N9 \+ x. b( [  g
proxy_ignore_client_abort on;0 H4 k6 ]) X( K# K
报错日志:
5 V( n$ T" `0 ?) ^7 i
5 O) y8 ]0 c; I; I1 z* e  k...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。
/ B9 i9 K- f$ V* `  I7 n* h$ o8 s, _
1 G5 I2 G2 u0 Q% x( P  T4 nPS:关于域名转发! ~$ R" ]9 N2 c) J' H
$ b: R5 [, M, Z4 R
所谓域名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/ 的内容。7 v" a5 x- p; C9 ]! R1 P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-20 01:18 , Processed in 0.059736 second(s), 22 queries .

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