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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9530|回复: 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
* y  H2 Q( H  |# ~
" d& b) c& L" I
  1. ###更新仓库4 H- j0 U: _" {+ Y3 q1 ]

  2.   y+ E0 g( V* j' b+ }, D+ @. k# A
  3. apt-get update -y0 b' k. D" W6 N+ G- ]& i
  4. apt-get install wget -y' H" h0 n* [5 d: a: x
  5. #下载nginx和相关软件包
复制代码

. v+ @2 v' q7 `! U4 P
. R( Q* E8 O4 ^1 x7 Q" P+ vpcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。% V) K' U4 T; m. S
) b+ n5 ~2 C, p4 T' o7 O  h
  1. cd /usr/local/src% V% z/ [4 P# E' m/ a
  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>- Z, r! @0 o/ q; y- @  F. f+ [; F
  3. wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>
    4 g* |* M& @$ 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>
    / w5 I; \0 `9 f
  5. tar xf pcre-8.33.tar.gz! F) \/ y% X. j/ y! h4 c% |
  6. tar xf zlib-1.2.8.tar.gz
    4 D. @: w' K3 {. C6 m1 Z& w
  7. #安装编译环境) e5 i; o* T- X3 D% `2 ?
复制代码

9 f) _8 j' L, k- F. l
- f7 E, R6 B8 v8 E9 }( O# h apt-get install build-essential libtool -y
! b2 C  Y( Z5 H* w#创建nginx用户' r( i. A7 `. v7 P! M! y
8 Z" o2 i( G, d$ L, K4 B
所谓的unprivileged user
( ^6 Q) M8 P$ a" Y4 w; z; \2 f) w. e" R
  1. useradd -s /bin/false -r -M -d /nonexistent www  s4 _5 U" R5 E- m8 ~( H0 D
  2. #开始编译安装
    ! K& I% z4 D' R4 E+ k8 N2 m
  3. 4 \0 K7 ]# Z9 o" Y* |; H; s# I
  4. /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
    5 M8 E. I7 y: @% |
  5. --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
    . Q* P- ]7 h  Q: M% s
  6. make4 h! v! Y2 S  B7 w% l! r. a2 r: ~9 Q
  7. make install6 y& L1 O% s8 z3 d1 T1 u8 }  `
  8. #给文件夹授权
复制代码

9 n& E7 T+ N' H  n& \& \
& \8 [6 {; n4 _" i* }" e0 Tchown -R www:www /usr/local/nginx
/ d: n5 C! v$ z( S, C#修改配置文件
; y* T. z" h+ O2 ]* B3 p' Gvim nginx.conf
% X4 s/ `. A$ |7 ?3 @3 M7 t: z+ C. ]. |/ W
user www www;9 j6 B# ^2 h( A1 J! l  k' R
worker_processes 1;
6 ^: {1 k& _( J, E( |error_log logs/error.log;4 U  T3 A4 D$ P, n
pid logs/nginx.pid;
6 C# M8 B7 t# ]3 q8 ~9 e+ ^worker_rlimit_nofile 65535;* \, y' Q0 u9 v* r
events {
- h5 @: y+ b( I, L4 M  use epoll;* g8 z! b. P/ m$ i$ |
  worker_connections 65535;; f$ q1 Y: u! r/ T# h. D" s$ o, E" O
}. s$ B! e- G& o* Y
http {
9 l+ |3 W0 {+ c. d( M. R2 O; B1 E  include mime.types;
( t2 D. z; l, q) P# {+ t  _  default_type application/octet-stream;  O8 D/ T8 y- l! `6 Q
  include /usr/local/nginx/conf/reverse-proxy.conf;
4 j" ^5 l- q. \: b( _  sendfile on;
  R$ M# L$ n1 Y& m+ H) B) `) O  keepalive_timeout 65;
" o1 z. R% X6 g+ R1 `: r  gzip on;
' }' s+ K: W8 L+ l7 R' k; I+ R  client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
, ~( g: m0 [9 v' d  client_body_buffer_size 256k;9 H, v: \2 f) n3 g* I* `" j  c# q* \
  client_header_timeout 3m;
& i8 d0 c) n! t9 y1 m/ w( E  client_body_timeout 3m;7 L7 \( p9 f! {& e3 ^1 `1 E
  send_timeout 3m;* J% q( V) N2 A- ~( ~7 N* {$ U
  proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)$ k1 q9 N/ A3 k7 \
  proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
: {' @3 w" @0 n% w0 [  proxy_send_timeout 300s;
& F/ k! i( a( x# X* i  proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小. `2 F0 }3 s  i; M: s- p
  proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
) U2 X1 Q/ O1 F, v! c5 V% Q7 a  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)( S" |- q1 x) W( y6 n* |
  proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘7 G& [4 S4 ]* i7 c# N  \1 ^4 x; O
  proxy_ignore_client_abort on; #不允许代理端主动关闭连接
+ r0 \0 J& z: W9 V  server {
* M6 Y/ Q8 t# T$ U: c    listen 80;
: h( G3 O+ N5 B5 l# P# ~7 x8 X! @/ v+ v    server_name localhost;
  v9 r; y- K" O9 Y! _# V    location / {
% r& a& S/ `* ^4 B! ]- ]6 _      root html;
! D2 O1 ^# b3 S9 T. @      index index.html index.htm;9 I# x5 A+ d6 e' ^; J! E, `
    }: \. B6 k. h! M& _
    error_page 500 502 503 504 /50x.html;. u+ E  g$ o# P* e$ N
    location = /50x.html {
) T8 U- Z( O- j( q: L      root html;) r$ G3 B3 b) Z! P* O# q3 P
    }( E: k" P# ~' @; d! z3 Y! q- `5 A
  }
# P% l% h! W& w4 v}( ^7 C2 z/ @2 h/ U7 w

' _: O3 k4 i. x  N, p5 p. ]编辑反向代理服务器配置文件:/ s1 Q1 m1 V! C& f" _) ~

+ L0 Q: W# c0 I  x# H' Bvim /usr/local/nginx/conf/reverse-proxy.conf
- u5 X  H; l. z) {" [% V2 m' N' H+ Z7 A5 h, D9 v! |3 O8 L
server
) c* R  O- A2 z1 _' A{  u5 O8 e4 k+ E4 Q9 D* |
  listen 80;- k' r0 o9 `3 B- x5 i1 L. l
  server_name xxx123.tk;: b  T7 ~& i5 F+ o8 F2 S: X
  location / {& Q" a$ j/ _( ^! I' a1 |
    proxy_redirect off;0 z, }( a) \' Y: e$ V# c/ C" y
    proxy_set_header Host $host;
  p7 R+ O; D, }  A. Z    proxy_set_header X-Real-IP $remote_addr;* A/ A! r) k( x  m4 g" Q2 I
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# y3 ]' N+ v* F/ \* h/ @; Q5 L( R
    proxy_pass http://192.168.10.38:3000;
, K% P, j# l3 [. C  }
9 G2 X, U+ b3 R4 N3 D  P' X$ Q  access_log logs/xxx123.tk_access.log;. p8 }# K3 p2 k, C$ Q3 o1 w  Z
}
+ ~/ K# T) x" ?1 ^  ' \, P0 d9 e' v; O$ L9 V
server
& G, D, b3 O% K{- I# U  w2 ]* C
  listen 80;
9 B& j9 m, e5 k8 K4 |$ ^0 F  server_name xxx456.tk;$ g7 j0 `8 l% n/ i4 r. i; g
  location / {0 m% t, K1 t% }; [3 l# ^. h, t& @
    proxy_redirect off;
0 J1 c  s" H, H  c, P# @: n    proxy_set_header Host $host;
9 O$ b5 k' }2 @7 G$ |2 H. g    proxy_set_header X-Real-IP $remote_addr;
1 Z5 \1 I& p! h    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;' n& ]- \. I% B1 v0 p- P- K' e$ i( {
    proxy_pass http://192.168.10.40:80;
* m9 g& Z. K$ w$ e0 e; Z  }
8 j- \( |, K+ d0 T0 f% j  access_log logs/xxx456.tk_access.log;/ I4 x4 D- i8 Z/ ]6 H$ L
}0 ?: i) a8 X/ v5 L, ?% {
5 M' C# `1 R& N7 P
然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。, Y9 n; Q8 P4 Y8 }4 i

+ R) t: _$ d& v$ M- `# }( _, D" Z; Pupstream monitor_server {  Z9 r  R0 P0 T' b3 s
  server 192.168.0.131:80;2 a* u8 n3 K4 s4 s( [" K
    server 192.168.0.132:80;
2 Z  M; k" `- \3 |& R5 Q( F: a( X. i}
2 o  P; U' T8 e+ ~  : _! R' |4 Q) L+ ^
server7 `% e2 l* i' P9 c, u
{$ g/ Y0 ~/ n3 K! ?" r$ V
  listen 80;  T+ m& P2 g) u  R% M, k
  server_name nagios.xxx123.tk;# y) z& t# u! q( q; v- n
  location / {% t: c" q, S) `( |9 r2 K
    proxy_redirect off;
, t3 h# b# L8 E    proxy_set_header Host $host;# p) ?% m* s' b: ~, L0 Z" A! _, u( x. J
    proxy_set_header X-Real-IP $remote_addr;
( S3 \. D: q4 C  T* H5 ?) Z0 t5 _4 t% M    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; : B) `, s9 T( L
    proxy_pass http://monitor_server;
, ?5 ?! _6 Y3 A+ u$ u' N$ _  }
: p# V6 ?; W, ~3 [1 j/ K  access_log logs/nagios.xxx123.tk_access.log;
# h. a; {, o1 Q) I3 X- R% @$ A* v5 _}' V4 O) w' p+ m8 S
# e" v+ L" ^; U% _+ m5 e
额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:! a6 y6 v2 Q0 g6 U
7 \) H0 {8 z) v, k
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
4 r8 E3 r* Q4 x4 `2 k5 _, T0 Y'$status $body_bytes_sent "$http_referer" '0 T4 q' k0 p, X* N
'"$http_user_agent" $HTTP_X_Forwarded_For';! I4 h$ {) \, u% B' f" t
  
7 t+ Q) w& n0 h  Laccess_log logs/access.log access;2 M2 D8 X& p; y* o
' Y9 N1 e- W9 c8 x5 X3 u9 F' i
再看看原来日志的格式长什么样:
% y. S# g  {! n3 [& ]* T  N
$ f8 W4 w: r6 K1
4 k6 m$ n; M0 y9 {4 i2+ Y% a; x2 C2 V2 c; m: q& u
3$ y( n1 g2 D2 i
4
7 u' h5 C+ |- v2 ~& {58 `* W3 z! D+ Y- H% P3 l1 P
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
1 X6 P  y8 Y' r  E# g, T# '$status $body_bytes_sent "$http_referer" '
7 i3 n1 A1 j5 X) l3 F( k# '"$http_user_agent" "$http_x_forwarded_for"';
3 N$ e& T: k- p7 W5 o0 U& l( o  
6 g8 |/ N" K$ e; e0 d#access_log logs/access.log main;
/ I+ M2 M0 g5 j2 e6 [, `6 _看出区别了吧   遇到的问题   之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查9 y1 c5 d. }; @3 X: J- I6 \
! d( s3 ?! s! U! P
1
  D+ F9 H  ]& D, L7 H2
' r; v/ ^6 |; a7 b% m. I3
+ x* ~. e( o% f/ w, C' I1 \4
- u/ h: i& A7 }3 V3 W) \5
- M* B9 {& q, y" E6 O/ E+ d' [+ |6
1 S& }/ _0 F$ Q4 }6 h7 b) Y1 \7
* e% y) X! k$ q# L- ]% t9 {) C8" {5 i3 ~7 k5 N" e+ D5 E# D) ~. y
proxy_connect_timeout 300s;
7 w7 [) C" P# Z4 I/ O' g! E- Q) Tproxy_read_timeout 300s;6 z& ]& n; C6 Q2 L
proxy_send_timeout 300s;
' j( H$ j- y9 ~2 F5 d* @proxy_buffer_size 64k;& l# m, J7 K" [! j# _
proxy_buffers 4 32k;, i/ c" b2 b( k5 ^. r
proxy_busy_buffers_size 64k;; c) ]5 m) S* K; l: u. T
proxy_temp_file_write_size 64k;+ B9 G1 J& y: q: i. b
proxy_ignore_client_abort on;* Q" D1 b0 p) x" W7 T, u
报错日志:2 N2 s2 T! n4 |  R4 E% |2 k9 V

3 o2 D* Q# Z7 ^5 K0 |...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。8 @. L0 L2 m2 b( x5 F/ e- W: Z0 q

$ E; O5 X0 @- C# E  V. _PS:关于域名转发& `9 ?$ w. v! p6 \( m9 m/ z- {
6 z  ]; c% o! \2 N7 ?
所谓域名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/ 的内容。) C# R, v3 i0 K0 r, b$ _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-9 16:22 , Processed in 0.120848 second(s), 21 queries .

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