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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 15379|回复: 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.042 q  K) `5 s1 `. ^/ `
5 Q/ y' K3 _# X! H4 Z7 ^* N
  1. ###更新仓库
    - P* a4 P" |5 h5 B7 Q, q4 e

  2. & w9 ^' K5 n5 F# d6 m
  3. apt-get update -y
    1 z( |+ g0 S' g' B/ H4 g1 ]. C
  4. apt-get install wget -y
    5 s" w5 M, j1 k8 z3 ^6 B$ ^9 t
  5. #下载nginx和相关软件包
复制代码

& R2 Z; u5 a$ j+ t# M+ F5 O- I. w+ A( S3 P
pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。& F0 \. o) O8 R
# \$ n$ z: w' c6 t
  1. cd /usr/local/src5 X! e( ~& o: y" a0 T
  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>
    2 H% ]* @! v0 A; D* y0 f6 {2 x+ x4 S% r
  3. wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>9 y# w) ~$ Y# }) z5 N; m0 E/ s
  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>; w8 Z' G0 s) M* g& l
  5. tar xf pcre-8.33.tar.gz
    1 J, t3 w2 D  R; @1 r7 T: b' _0 p
  6. tar xf zlib-1.2.8.tar.gz* V; W4 Q" v# t' E/ o% n7 j0 K/ n
  7. #安装编译环境( d* @4 H( q- |: ^
复制代码

& I+ B; i9 I+ s) E* N  w; K
+ t0 a9 `9 I% E& n- t8 f) f3 ~ apt-get install build-essential libtool -y
3 ?; L5 y! {' n4 O7 }#创建nginx用户! W! A% d1 g# k1 x* N. y

# z7 }! w1 D. `# {所谓的unprivileged user) |* U7 v6 _9 I* }
5 e; t  R6 _) M0 y3 g
  1. useradd -s /bin/false -r -M -d /nonexistent www4 T+ q2 c  h4 L3 D& F8 v
  2. #开始编译安装
    # |4 A2 R/ c2 A3 D  c$ J
  3. 7 B2 _0 B" C1 E. v/ u1 _3 w0 `
  4. /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
    7 N6 X# T7 `" `  T3 y
  5. --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module( `+ c" q9 c- _# i
  6. make
    ; `, Q, q. Y$ Q- w
  7. make install  {0 k8 {  |- c3 u
  8. #给文件夹授权
复制代码
# x; L* w8 X4 |8 z5 u

+ c# M2 N0 H6 [) ^! _" fchown -R www:www /usr/local/nginx  e# ?8 x- ~9 o' d9 N1 K- X2 R  P& x
#修改配置文件$ h) j7 M4 N2 J. n/ ]: O4 C5 u
vim nginx.conf: \; f- T, T! n. y2 k3 W+ {0 e
8 J% ]1 C5 D' _" f5 N
user www www;  h9 j% u. C3 Y
worker_processes 1;- p& B6 M* R! S+ U
error_log logs/error.log;; R3 b! U0 u8 Z% d0 t3 I# W
pid logs/nginx.pid;" C# _6 ?6 @, J4 o2 F+ O
worker_rlimit_nofile 65535;
; a  y9 q2 u) A3 Y; x8 Vevents {. X8 M3 |7 x  k( V& c6 p
  use epoll;
( i$ S/ \2 s0 B/ `; G* X  worker_connections 65535;
7 u  J, s* E$ I/ }}
5 {$ q, c% R8 @6 Uhttp {
" \6 I# Z0 b; U  include mime.types;
, o& r+ S' {' u9 G$ j7 ~  default_type application/octet-stream;# S9 q8 j/ m4 q; }# R+ K+ W
  include /usr/local/nginx/conf/reverse-proxy.conf;
- }, w4 d" e, ~" H) E' `: c  sendfile on;
5 `& {" q4 `6 a$ s  keepalive_timeout 65;
- F6 t4 a/ ?: r  gzip on;
( p2 Z$ j: l2 p  client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户7 H2 w# `2 R- W. D" t! J' N) L
  client_body_buffer_size 256k;7 @/ J/ v. {+ d
  client_header_timeout 3m;
# E; Z2 K( M& ~6 U' \5 p3 Z  client_body_timeout 3m;
8 N# [9 |: \  y  send_timeout 3m;9 W; y( q( W/ s: x5 L+ T+ h5 `
  proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)$ j  {, @# `9 c* Y) i  i' P$ ]
  proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)" q, {7 S% Z5 ^
  proxy_send_timeout 300s;
1 _, I0 W& H* R" e  proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
6 R0 Q9 e5 j6 A; _' U  proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置* j" y! \* X8 `( n+ u9 l
  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
/ d6 o6 a  W6 N$ g; P  proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
/ B1 m! Y& H& H% ]. W8 V, E6 V  proxy_ignore_client_abort on; #不允许代理端主动关闭连接5 s$ u- `- e) t$ M& d1 q& @- m# b/ O
  server {
  A5 P( C( t  h    listen 80;
2 o. i$ [6 n9 F( q& f1 f" A    server_name localhost;
3 f9 u" E) I8 z0 b, W7 x0 V' z    location / {1 g; o' K4 G3 n; x/ l! L' S
      root html;
8 X2 N, i8 L) r! l; E. Z      index index.html index.htm;
9 P0 B/ A$ K7 ~- k; v, U    }
, C' u% L0 h. w: E) Q$ T    error_page 500 502 503 504 /50x.html;
7 @1 W; M& R) c    location = /50x.html {
: e" u- u' A0 X# r      root html;
4 `5 |' C: m1 `& t8 K1 }+ g- [7 t    }- r& w% h$ J/ J- j+ B* T# `+ `
  }# G; C) ?0 c3 ~/ e( O
}# K1 Z3 U& z( o, z6 X

$ a' [5 l  {3 q/ w  `2 Y编辑反向代理服务器配置文件:# t; s0 Q( F% G( z# y1 h

' ?8 K, M2 L, ?: P' Dvim /usr/local/nginx/conf/reverse-proxy.conf  x& ~3 ^0 [* t" w; G2 t0 G

% m8 k9 H5 A6 C$ Q' c3 zserver
1 f6 a7 N! H2 P( x8 ~{% A4 m/ H$ V& {9 c$ s) X4 i
  listen 80;
& H5 _. p% h. v4 Q# S  server_name xxx123.tk;. a& h3 ]4 l% w$ ?, L2 @! G
  location / {6 ^2 O; E) M3 X  Q9 R$ J& W
    proxy_redirect off;7 I/ L6 H! i  ^/ b% Q/ z' N# q
    proxy_set_header Host $host;
# P7 R$ ?" o2 u2 f' L3 B& k1 i" z    proxy_set_header X-Real-IP $remote_addr;9 `; S) ]5 d7 y% w" L
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;& C& I, c: ]# {8 ^: Z% V9 U
    proxy_pass http://192.168.10.38:3000;& x& n  K" M3 x! V7 h5 M5 \0 F5 ~
  }
& p. f' @+ \$ z0 p) W+ ]) r. A+ [$ L  access_log logs/xxx123.tk_access.log;
0 S8 n, I* ~5 m- Y8 o1 R}
8 k( H' I5 H, g1 H0 e* i4 F2 e: W$ n  
( X' |3 ]2 j# i3 @server
& ?7 W  J2 M/ M6 K1 v4 _9 ]( N' `6 Y{
' Z0 P: S/ j7 {5 P; B1 f6 L. e# [  listen 80;
+ \9 F' K5 v0 u  server_name xxx456.tk;
/ d, E! _: e3 `  Z1 Y  location / {, H7 D! R* v/ M' j0 \: d
    proxy_redirect off;
" V( s  O/ p, @    proxy_set_header Host $host;
  K* F2 h5 g; X4 ^' P    proxy_set_header X-Real-IP $remote_addr;
  X7 l" r8 l( t: Y$ [; o    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
* Q  B) m9 l8 k: g& q1 n    proxy_pass http://192.168.10.40:80;
$ L7 Q( \' ?* p: W+ B' j/ ?" L  }
% u4 y- W; J$ A) z. h" t1 L  access_log logs/xxx456.tk_access.log;
% p5 B( ~0 ]" q1 q8 h}, V$ \$ r$ u, y$ R2 x; }$ R

1 C7 p, S1 X1 `然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。
+ r6 Y$ z- I, v* f+ T/ g+ `. k
8 a/ G* q: d7 z9 w3 ]upstream monitor_server {
3 f2 U) Q7 Y" J  K# Q  server 192.168.0.131:80;9 G1 D6 G2 h% S# A# _1 U
    server 192.168.0.132:80;
4 ?8 d6 i1 f7 O8 ^/ g}
* M: h( \( r- t# M$ e6 ?) r  
; [, X3 g! G3 f2 iserver
; m/ h! h0 [9 M9 F: _{
1 x* Y. u4 I8 J  B  listen 80;
- N+ r1 O1 G, p  server_name nagios.xxx123.tk;& _$ e, U4 M  Y& d2 d* D
  location / {6 w& Q2 ~& M) T) \, X' o4 l
    proxy_redirect off;
5 V/ ^9 A4 s$ F  F3 ~, H    proxy_set_header Host $host;* P) r5 I2 N7 |1 o$ E3 z7 U
    proxy_set_header X-Real-IP $remote_addr;
: j9 U! s% u* p- K) [    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
5 G+ V  M3 q$ r6 t; V    proxy_pass http://monitor_server;
3 T$ V/ c* F5 k+ z  }
% x+ L1 j1 W/ z4 Z  access_log logs/nagios.xxx123.tk_access.log;6 \$ }+ a3 u, Q: ^6 v# X
}
# c& m: t2 O2 ]' ~' j
* ^4 q" w' C5 p( `9 x! M额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
/ |, ^, T. p# Z+ B) O1 u& N7 F# _3 [3 d+ y" e3 `) k8 E6 }
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" ') J  M2 x# W1 \4 `' R
'$status $body_bytes_sent "$http_referer" '- U2 N- ?# C6 v: t  Y  _  K4 b9 l0 M
'"$http_user_agent" $HTTP_X_Forwarded_For';/ Y- [; g  @9 Y& y9 v
  
5 d# ?0 T9 d5 t. {0 jaccess_log logs/access.log access;
4 w6 T- g3 Z3 c1 ]; ?
0 K4 P' v# v5 l, I1 X3 A/ R) }再看看原来日志的格式长什么样:- d1 w$ F' p3 m; d( j3 {

# g# E0 {: ^0 H& ^3 D  t. ^1
. u! o: c# W; j$ x0 o* k2
- o" N0 n4 o  Z$ f/ B& O3: F+ Y  C7 @! m, F1 K
4" H# _$ u+ g$ [7 c, V
57 F7 w& c# `, i1 _; ]# c& }, x4 T
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
( X" E$ z  d" k% n! g1 x. X: a$ m# '$status $body_bytes_sent "$http_referer" '
5 p# k  H6 n! |# E( m$ g# '"$http_user_agent" "$http_x_forwarded_for"';
6 z3 g" X. m4 y: ^- f. s1 G  
1 Q! {3 s( l, n( Z% }$ m#access_log logs/access.log main;
% \. ~5 Y& j/ M7 c4 B看出区别了吧   遇到的问题   之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
9 M3 U! l+ Q2 c
: m  z+ B. W* {* C- e17 L' _* Q! ]8 p8 j, L
2
& |& f; N8 e8 j3 U! T. _' t4 B30 G5 `5 m) t/ Q% }" J+ @
47 Z. T' s3 ?5 }0 m0 N
5
2 C6 q0 ?4 d" r5 m66 t7 [4 r5 u: ^  m& \  B
7
/ Y; t$ q5 V& T+ W( |4 u0 C8
0 r$ S/ n" g8 s8 @# n" A* t# F  Yproxy_connect_timeout 300s;, i, [1 `' O. U) c9 Q% t
proxy_read_timeout 300s;+ i' B% b& [( {' t0 k
proxy_send_timeout 300s;" y6 p$ o, t/ q2 P8 y3 f7 u
proxy_buffer_size 64k;
& o  {8 I+ r8 {proxy_buffers 4 32k;
6 M3 n" c  [# W9 M6 d% t7 I+ hproxy_busy_buffers_size 64k;
; u: O, C! Z' b5 \6 S. `; t3 Fproxy_temp_file_write_size 64k;4 e& F/ j) l$ ~8 Q4 D$ ]
proxy_ignore_client_abort on;
# ]: N$ D/ P! K2 O报错日志:
% @; t" a) J: @3 v$ _
3 X) z  X# R2 Z6 `...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。& M# L# `2 n8 V- K! g, O
, y3 i" T8 B9 R! `: E
PS:关于域名转发
$ h, X( }& i# }1 {1 B/ `4 |5 Y. J  j7 T; J3 H$ l: {3 E" ^$ Q. p
所谓域名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; |* h+ f7 @+ `' r: R& s
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-22 04:11 , Processed in 0.068188 second(s), 19 queries .

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