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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9599|回复: 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.046 d# X4 `0 y5 C. X
" |* S* j( y% {- C; o& {
  1. ###更新仓库; ^. F3 M+ I, \0 p4 O# d
  2. 5 Q  T% ]1 R6 V: \* E# ^% p
  3. apt-get update -y
    . m1 B( q/ b- g' v- |
  4. apt-get install wget -y
    2 `* x! @+ N9 g4 q. R! k
  5. #下载nginx和相关软件包
复制代码
5 U  y; y9 S! M1 w. J5 b7 W

5 P3 g: g, r8 K% Ipcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。5 L; b( y. i2 X: A1 Q2 V

# O# E, ~# z" u3 X
  1. cd /usr/local/src; _, p9 ^7 Q0 d8 _, ?
  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>
    , F' i7 \% O7 ?" |$ F4 [# L
  3. wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>
    * `' G1 m' \* f' E$ G3 w
  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>3 B  n* O# n3 {: g
  5. tar xf pcre-8.33.tar.gz
    ( q2 m/ Q! T3 N& C6 r0 \9 b
  6. tar xf zlib-1.2.8.tar.gz
    5 x- {) C8 j5 R2 y$ a* r
  7. #安装编译环境
    - j! A$ Z* Q) Q8 _& Y
复制代码

- R4 s  z! i5 b/ h; N$ J- M ; P1 V& O9 b+ P( [
apt-get install build-essential libtool -y
" E# W; B' ]8 K1 ~$ J#创建nginx用户
, S* r1 _3 h7 N' ]3 X4 ^) p
9 \4 y4 e6 k: `5 i) K所谓的unprivileged user
* \) r# I8 ^. d" \3 c7 U2 A/ L3 n8 W
  |6 j5 u8 F& L$ e9 W
  1. useradd -s /bin/false -r -M -d /nonexistent www8 F9 [# m1 n9 t0 A! {) S% s
  2. #开始编译安装
    * `2 m9 P+ ?' A

  3. * h9 K( I7 P6 y4 D0 T, @
  4. /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
    . i4 w. x* S; C4 t2 Y% r' y
  5. --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
    , `+ k7 A4 C0 v
  6. make
    1 H8 v$ b3 _% a, x! M7 ~$ \
  7. make install
    . r( ~! x5 Z! _# E" q
  8. #给文件夹授权
复制代码
. P8 I4 f% g7 G, t- l& \  R

1 w0 P. p7 [. T7 d/ mchown -R www:www /usr/local/nginx* z: x$ f& t, |
#修改配置文件! ^, x) w% Y4 g
vim nginx.conf
3 c6 M3 [  Z: F- F+ m5 H# L- S) A6 }2 t  b2 g
user www www;
6 `: {# S# h0 S+ M6 x3 F: Nworker_processes 1;# A- h- s5 W* d
error_log logs/error.log;
, D1 l, p" {' V: a% m# ]' [+ Spid logs/nginx.pid;
3 L" g* }7 j1 ~/ G( Nworker_rlimit_nofile 65535;( n/ K8 a4 W4 C1 p6 [$ C8 X
events {
7 R7 J- w2 k& `9 m" [  use epoll;, f) O: w: ?( ?1 \( t
  worker_connections 65535;
# F5 |4 J, C2 K1 l+ e}
$ G! o1 C7 i7 j- }" j' e0 M# chttp {
) {0 s- G- |7 k! t  include mime.types;' U, l$ U2 F2 U" i) D- u, d- o6 o
  default_type application/octet-stream;
3 Z( Y9 ?0 }) w! Y5 \  include /usr/local/nginx/conf/reverse-proxy.conf;
% I0 J$ [* _' I  sendfile on;  j9 a( V3 ^+ F$ ^" v) Z* B3 k
  keepalive_timeout 65;
- D; d& U$ H- N3 [: D  gzip on;. Y1 G$ I3 @7 `8 y8 T1 b
  client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户5 P2 {2 R3 n2 g, ?. k, C
  client_body_buffer_size 256k;
+ o: e" m0 C& y  client_header_timeout 3m;1 `: N& r' E1 ?' e6 b5 x3 }
  client_body_timeout 3m;1 V5 G/ V% A* n# b
  send_timeout 3m;
' ~1 H/ @6 q9 P: s4 B) P- H9 J  proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
" P5 R. Y  @9 @7 ]4 c  proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
. O0 P! i+ k3 ?! n) Z  proxy_send_timeout 300s;9 X) ?* y: W; m7 Q2 I/ e0 R
  proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小" e* Y0 c8 p7 b9 _: o* }1 `
  proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置0 t" ?% E& {: T# P/ H- E
  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)& W, G- S) E6 @+ M! Q
  proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
7 m% \. A' E! _' U7 b, B# O  proxy_ignore_client_abort on; #不允许代理端主动关闭连接
0 ^4 F  {8 X% K% Q+ S6 I  server {
& q, [- l) m5 E! S9 G9 ^    listen 80;* `) `, P: S$ H7 d
    server_name localhost;7 I4 n1 }: S0 t6 ]& Q5 W
    location / {
$ O% V) r1 |1 h3 D      root html;' K, n9 \) F) t9 i2 \  {% d% _* Y
      index index.html index.htm;
0 E0 U# D) m8 ~    }* G7 ]' D  ]( G( ]8 U9 E: P: E) `9 Y) ~
    error_page 500 502 503 504 /50x.html;
1 f: S! m6 ~3 x    location = /50x.html {
+ Y1 q8 w# X, `- B. N. I      root html;( X( q( j1 a; @6 p
    }! c/ o6 n" e9 o7 t' r1 e
  }
8 C9 W# H$ C* U6 A3 `  A}9 I. \( P' N, _/ |2 E
' [5 ]- s/ |- ~  A
编辑反向代理服务器配置文件:( k7 z) X1 [$ m1 M( E

3 U. Z/ h$ ~+ ~" o* k) _# Qvim /usr/local/nginx/conf/reverse-proxy.conf  d; ^# @% B3 G& q, i0 [5 y

- C4 q  r: d7 G( ~, Eserver
- Y+ {2 G. \& h# e0 U{. e6 l8 t' Q7 L, q* l: D9 J" M
  listen 80;/ B/ y2 M3 o1 i: V1 ~, Z3 R! V" Q1 T
  server_name xxx123.tk;4 l. F7 u! w4 @5 A; ?8 o) P
  location / {. i0 O7 r3 Q7 A1 s' n+ X7 t
    proxy_redirect off;
( E+ X8 i$ n4 B% Q. z$ e    proxy_set_header Host $host;
3 B4 l. A/ p& G+ O( Y    proxy_set_header X-Real-IP $remote_addr;( [; t( }6 M/ A5 R3 d; e/ q8 h: H/ n
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;, u  _) G& A) J; W
    proxy_pass http://192.168.10.38:3000;( d( C  g( {: P$ b
  }9 ^, l( U1 I" ]
  access_log logs/xxx123.tk_access.log;
3 S+ T' S* Q5 [3 v}
5 M# F4 F6 W8 j/ ^! g2 i  9 g& b4 i$ j/ r& v+ y
server
: ?2 t" z$ j: f# h{% ~/ z8 T4 d" \+ ^! {, [4 B
  listen 80;
; V+ _0 {, X0 }8 @  server_name xxx456.tk;7 h. F+ T% f4 ?5 Y, Y
  location / {7 w" v( O. {* p( A, @
    proxy_redirect off;4 P( s; X! E0 V
    proxy_set_header Host $host;
2 C- u" ]% d5 l, D2 S    proxy_set_header X-Real-IP $remote_addr;
+ z+ e2 b( t+ \' J! x% `/ K, k: b    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
% t' {% A1 q& L. {    proxy_pass http://192.168.10.40:80;4 U  _/ o: X' U3 T9 k+ y# Z
  }. t/ o) B, d! T. d- M
  access_log logs/xxx456.tk_access.log;6 O8 s3 A8 V  [+ x
}
$ ]( V* T9 ]2 e6 ~9 x( H& D
# S3 f& {  K9 i+ H; K* _9 B1 ^' p然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。8 A$ Q) j4 c/ Z  X& f( l

' ]  L6 e# u4 c9 y; _upstream monitor_server {: [2 R  o1 ~( d+ J# Y9 a
  server 192.168.0.131:80;
/ V% A8 W, n' P# t    server 192.168.0.132:80;) q/ o  H5 K* }+ v5 w
}
/ V; O( h! K! M9 {9 L* V; O2 M  ( D/ P8 A; w4 E. k* ?( R
server
0 ^5 F* f* P& i  w5 \9 c{
3 ]: `6 n9 n7 ~' @  listen 80;. e( o  C5 |5 J+ e
  server_name nagios.xxx123.tk;
0 m. P- y0 E: v2 a- }% g  location / {
: O5 G7 R" W8 F4 m' t( p    proxy_redirect off;
4 c+ @  F& P1 k1 ?    proxy_set_header Host $host;4 K$ W: z: A9 b5 G2 \9 H3 e
    proxy_set_header X-Real-IP $remote_addr;
( l* b  B1 j" X0 v# v6 y% @$ o0 \" i    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
( c$ f- f5 `: R    proxy_pass http://monitor_server;# B- d# H/ A6 S
  }
' k& R+ Q7 r: @6 r3 E& ^  access_log logs/nagios.xxx123.tk_access.log;% V) e* @  [" ]) W& m0 _
}7 a9 o* v2 `; ~8 X, c6 D

6 Y4 j, d$ R& U' [# w  A额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
7 l' o$ Y. ^% R, ^% @! X
+ n) r7 _  I; u( Klog_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '% Y& d. m' V: [: H: [$ _
'$status $body_bytes_sent "$http_referer" '
9 B) X7 h8 \# ?/ \  E'"$http_user_agent" $HTTP_X_Forwarded_For';! `. [! P# n$ T
  . _9 [+ J% w6 A$ v. m5 `
access_log logs/access.log access;+ K, }' i, x7 J8 ?5 Z
. M1 `# ~7 o- E/ i+ h
再看看原来日志的格式长什么样:
. Q! @: e: h% c. {5 E1 `# i$ R3 @' ^  p$ L- ~5 ?
1
% k/ f/ F8 D3 h2  J4 w$ O8 i  b0 q" U- M0 V6 V
3
1 p% g' J8 s# A  j/ ?7 w* {6 k% a4) W2 f0 H% \% D# f1 b
5, C* L, l: Z/ c: P7 A4 {7 t
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '( Y5 Q+ Q& i' K( S
# '$status $body_bytes_sent "$http_referer" '' H4 t. U# m: E
# '"$http_user_agent" "$http_x_forwarded_for"';
" Q+ c& [! v1 ~  i& v  
4 Y( M: m8 U) F( e#access_log logs/access.log main;% t& a5 O6 B$ d" {
看出区别了吧   遇到的问题   之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
8 t: V( ~: |! w4 R
, L5 _0 u1 h/ A  t2 o% t. z! x$ R15 h/ C, z! X, i& _( k
2
. K5 n; X, H( P% d3 v7 F32 d8 a- f; ^- f& ~$ F8 f7 Y
4
- B+ M4 S1 l$ {5
9 @2 g! [6 X) ]  `6
, E2 k& c/ z& x! i7' t' ?; x/ J& b) e; S( k+ e# k
86 s2 q+ _3 y% D
proxy_connect_timeout 300s;
: z: A8 g6 z0 X4 R7 t) d$ m5 \# Xproxy_read_timeout 300s;
  @) v7 E% K3 X* lproxy_send_timeout 300s;$ `0 d4 K7 m( U0 u9 Q% J4 n
proxy_buffer_size 64k;
7 C0 E& @+ G7 n' S) l4 {) S! ?proxy_buffers 4 32k;9 r! E2 {. H8 l- ]  G
proxy_busy_buffers_size 64k;. s) G- r% v4 z
proxy_temp_file_write_size 64k;! Q  A4 B3 n1 D; O( ~9 M
proxy_ignore_client_abort on;4 V3 U6 N7 {$ y* M1 R3 R6 P5 L
报错日志:
9 @. M% b2 Q, U, V& N' E* r, C4 C
" O9 i3 ?. p/ e$ _0 W. I- L...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。
* H. o6 |3 y1 m' f! w6 h3 j/ {; I# e  \
PS:关于域名转发$ a; @$ ]% b) J

1 r" U7 @: r0 z( @  A所谓域名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/ 的内容。
; b' P8 B. D+ V% x" F
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-17 18:43 , Processed in 0.154610 second(s), 20 queries .

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