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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 14126|回复: 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
+ M; v  Z& ]! J: Z- k$ f
* c$ T5 Y2 a; i( i
  1. ###更新仓库# H) P7 t9 F9 d9 E& q  U

  2. / o6 ]* O; ^* }" y
  3. apt-get update -y  N2 @8 m: r0 p$ O; ^
  4. apt-get install wget -y' Z# W( t6 r0 A& a2 u0 a0 f
  5. #下载nginx和相关软件包
复制代码

& [  E' O  J2 I3 [1 i' U; \; o
9 I8 h2 d1 \! _: ipcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。; C/ E" G! G* {; \

' s* x& s6 U4 t
  1. cd /usr/local/src
    / z2 [/ P# o, B0 _$ T9 B
  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>
    6 W( W8 t; C  c/ V5 `4 m
  3. wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>
    5 P8 l" ^( R9 `: F9 j
  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>
    4 w* U) @- J! I# l$ i
  5. tar xf pcre-8.33.tar.gz" c4 ^* f/ u/ R% _# i
  6. tar xf zlib-1.2.8.tar.gz- U; H$ _2 k" T' f
  7. #安装编译环境
    * A; b" G, f9 V) _- @
复制代码

3 \4 Y$ S) T4 Z8 L# h
1 a. W9 C& Y% n! H, [ apt-get install build-essential libtool -y
1 j, R3 T; y: e8 G#创建nginx用户
- V" }. U' g0 }4 t  T" F  ~7 c) b0 T2 p: R
所谓的unprivileged user. H, {# L+ E: l( g+ w3 p

+ v% i) `' d$ s+ \& t
  1. useradd -s /bin/false -r -M -d /nonexistent www  y1 `" ^# n1 Y0 W
  2. #开始编译安装: k6 e* \, W- N" U7 r
  3. 1 D0 J, {  W; m: m
  4. /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \, K4 \7 G4 `& w" D/ [, a% l
  5. --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module1 i  ?# i& o6 ~
  6. make- V& O( }- ^2 ?' ]4 l+ P
  7. make install
    # C7 s7 B8 p+ `1 [  S
  8. #给文件夹授权
复制代码
0 Y9 m2 y6 I3 r
3 f4 e; H; f- U
chown -R www:www /usr/local/nginx
" s$ K) }# c8 X* S0 W  d! a3 ^#修改配置文件- s% v6 q5 c' ]) K" Y/ K/ m
vim nginx.conf* ?" ^* X2 [( B$ `$ E

% T* \. [9 _3 e9 o8 i* duser www www;* {8 |. B$ h) F
worker_processes 1;
! B) J/ q& O5 \* M# uerror_log logs/error.log;
# T( s. q& w" ?* F  Rpid logs/nginx.pid;# s0 f' Q, b7 S% \0 n9 p: N
worker_rlimit_nofile 65535;% r% M% ^& R2 @1 G( M$ P1 E
events {, S3 N( l; N$ {
  use epoll;. C, q8 D& q3 I9 Q8 I
  worker_connections 65535;
- E4 o9 V( l7 X2 G0 |}9 a  ]; [& P- J# L6 f+ v
http {3 m9 o. R7 I* z( {4 o3 s9 G# k
  include mime.types;4 I" `8 d% ~! s+ o5 _8 d5 ]
  default_type application/octet-stream;. d. R- K! P% {5 k5 a0 f9 m
  include /usr/local/nginx/conf/reverse-proxy.conf;
" Q! g: _* D% b9 E; t  sendfile on;
- l, P/ Y& Z$ g" Z3 r, X  keepalive_timeout 65;
+ P# W- E  B9 G1 V  B$ q  gzip on;' T- n! u( b9 s- w1 A
  client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户* d0 O9 ^; [% D9 M9 r) |. {
  client_body_buffer_size 256k;
4 v3 H$ B4 C! ~1 M6 E1 b. B( G  client_header_timeout 3m;* _5 T3 C! ]/ u4 A2 e
  client_body_timeout 3m;1 s1 h5 w6 T* L8 T6 T
  send_timeout 3m;& }' O: c. D2 G& g! _
  proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)9 m; _5 @) T" f, R
  proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
+ ^" f) u  U% M( g2 n  proxy_send_timeout 300s;
/ @( B9 d% R8 \7 k$ W$ s. S0 M  proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小8 e  U3 ]& D# _# X
  proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
8 R" l: V3 D8 M  d* l  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
, `+ }1 m& X* b- h* f  proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
" B: z: O) P4 _" s4 w; q; ^  proxy_ignore_client_abort on; #不允许代理端主动关闭连接
1 A* R) [3 \4 b" \' }  server {. h9 ~" x! w1 o' [
    listen 80;6 M* G6 X  Y# D+ P
    server_name localhost;+ d0 x, C3 c6 z0 }
    location / {
- W. Z  C" V6 S      root html;
6 S9 q6 W" D9 y) l      index index.html index.htm;
  b% I* V) _9 |0 o+ V2 ^; p0 _    }$ P+ `; Y3 u& R, V5 F
    error_page 500 502 503 504 /50x.html;
1 [; l  m) A- A$ t- z1 }    location = /50x.html {0 G( h9 D( H* T+ V
      root html;6 M; y* ?! e. l$ E! m
    }
+ F: G& L7 V$ p8 A0 ^  }& c; _, q% |/ L/ l3 V5 Y" E9 j/ V$ ^" O
}
* L( L: S1 C  [: K
! V4 e1 ^# x) f7 k! S8 j; t# C编辑反向代理服务器配置文件:
" l5 F( r/ y* t& P; t# v+ \: N/ S! e( g- Q
vim /usr/local/nginx/conf/reverse-proxy.conf2 M  z! {/ n  p+ o. j9 ~3 u
$ B. P' q. s5 V5 F6 T
server6 R- \; a. n; e+ J
{
6 ]% b+ d, y+ @# ~  listen 80;
; I, r3 g7 |2 I4 B0 F$ G5 Z  server_name xxx123.tk;
" Z/ ?  g5 `% c$ O% M  location / {2 f9 @" z2 [8 R$ f" S6 D8 L
    proxy_redirect off;
. t1 g6 u: E# b6 R$ v5 \, Z    proxy_set_header Host $host;+ V3 ]( O+ T/ P8 n& H0 v) E, f
    proxy_set_header X-Real-IP $remote_addr;6 s4 d' Y# y$ ?* _. X
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- C- }6 c7 [- ~6 l1 y    proxy_pass http://192.168.10.38:3000;
4 @+ F2 T- C: ?8 N  }# V% V% K7 |( K7 y' w8 e
  access_log logs/xxx123.tk_access.log;( e: j% U+ {- n2 d
}3 l1 G1 P7 `' u! T9 B% z
  
# t  P: `" h8 q1 lserver! C7 v$ Q6 Y5 t& }7 k/ O+ b7 |
{
! [/ S; l5 q9 m- u  listen 80;
( |9 G7 l# ]/ {+ q% L, q, a% q! ?  server_name xxx456.tk;
4 i; ?% a1 I  \7 b6 x  location / {& t! l' O  A! l" n9 T# P
    proxy_redirect off;" Y# w: Q1 M  X, E; U
    proxy_set_header Host $host;4 w& Y" D$ a$ k. j) R2 t" U/ Y; ?
    proxy_set_header X-Real-IP $remote_addr;
6 v- F" x& o9 I! Q: _* z/ f    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
% ?. M' d- }# j3 e- V    proxy_pass http://192.168.10.40:80;% n2 w2 E7 G% E2 ]# L' [. c2 y; r
  }
; z9 B; K7 R, Z1 g# \% H5 ]  access_log logs/xxx456.tk_access.log;9 @* `' J+ P1 s* f5 g  j
}) E& a# W3 {4 F+ n! T/ ?4 p
# j% P6 w6 a/ B) u$ \
然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。2 T% m: c1 N7 g6 b- B( \+ I6 g

' ~- W% l! M/ I, d$ J, dupstream monitor_server {
- _, P; ^/ B4 N2 s+ A  server 192.168.0.131:80;
+ L( N0 k& t6 _5 @; w4 J, q    server 192.168.0.132:80;
3 b# V' \- K1 d/ A! D  F}
8 ]& A/ Y- J0 b0 j5 p  
: P9 S% v! A0 \/ Hserver/ M1 R* ?' ]! |% u# C
{/ d& K! j6 U5 |! \2 e
  listen 80;
' r, {7 e" D. p7 q; n  server_name nagios.xxx123.tk;0 S: o& v1 f# l" O4 U& H2 a  W
  location / {
4 M8 g1 `; }: M. G2 q  |    proxy_redirect off;8 ~2 b7 b+ V. R8 |* \
    proxy_set_header Host $host;
8 b& l# {; J2 ?# `: D) _    proxy_set_header X-Real-IP $remote_addr;! \. B% `& D2 ]5 C5 i- B
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # ~! R* p# S( W; p7 Q9 ?1 G2 B
    proxy_pass http://monitor_server;
) B+ g- O6 F( T2 L& M2 M. [4 [  }
+ {2 b! h6 r# @, J) S: g4 B  access_log logs/nagios.xxx123.tk_access.log;7 j+ B! g) W0 s$ p
}
1 C3 G7 n. @* L/ |9 Z
4 @  K- [# f9 k. \; y额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:7 w: q/ m, @8 k# K7 @& \+ P6 ]( K
1 J, L1 Z/ n- v
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
7 f' s! P. }& @' L'$status $body_bytes_sent "$http_referer" '7 i$ p8 q+ z9 `% w! u
'"$http_user_agent" $HTTP_X_Forwarded_For';1 T; b: o) H* W7 K1 q! h: P! x
  . K# q) {" ~+ |7 m$ Y1 F' U
access_log logs/access.log access;
9 y  F$ W$ n7 Z" \% Z4 C
+ x5 }  ~: L2 u. y" z2 j/ s+ o再看看原来日志的格式长什么样:* [6 G& f  W' \8 @2 f% L

$ N% a+ @+ @. u9 ?9 a1
5 p  F# y9 \7 R+ a2 |2
; D- V& [% B& j$ q4 i31 H6 W0 x  q. \6 y9 ^- Y
4
/ C5 P' y  [  D$ N52 }9 @( d4 o! K
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '  l8 p+ U9 ?( V+ M
# '$status $body_bytes_sent "$http_referer" '
) l& M! w, X& c3 M/ P# '"$http_user_agent" "$http_x_forwarded_for"';
5 j+ G# }( v! S. \1 O) ^+ l    O5 z  T8 N% z* U' s2 K
#access_log logs/access.log main;4 `* ]! E+ [- V8 y
看出区别了吧   遇到的问题   之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查% g* V2 X: U8 {
  N4 m2 j2 _8 r1 ?
17 ^" \( L6 W" {) S0 M& I
2
4 V# [) k2 U7 ~- p  W, E. u5 S3
  q7 ]8 ^% J# c. V4
1 b' S6 Q9 W4 n, _, h. L5* n# l$ f0 u# W) O6 {- r* U
6
9 a& Q* f" Z5 D4 q. x% V. Y9 J+ V7
$ C, ^& R/ L! @9 e9 D/ \+ }8
4 ?( q& T) X* N1 }" A2 q9 X) dproxy_connect_timeout 300s;
# H% K; b8 X9 s# A; s! f) C% Sproxy_read_timeout 300s;
9 f7 `& |" n' Q. b  G" s9 c; Tproxy_send_timeout 300s;
# ^0 F( y) U: o# yproxy_buffer_size 64k;
5 v$ I0 m/ o) r  Dproxy_buffers 4 32k;
$ F; L: t$ E) o& s2 q7 V/ sproxy_busy_buffers_size 64k;
! t* z. O: m' D( [1 hproxy_temp_file_write_size 64k;
# K8 x/ d( L+ I/ M$ n' _proxy_ignore_client_abort on;
# P9 g! c4 W- ^+ k( D' f报错日志:0 ]4 s. O( O4 i% Q* f3 X0 m( V& I

0 p5 [+ G! e! U( m...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。( U! {" l6 d' E4 S4 I
( `/ X: N6 {( ?; M  [( S
PS:关于域名转发$ [6 A; _/ h0 t6 J$ H; R
& v% B/ m3 S+ T
所谓域名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/ 的内容。8 U3 V; i" c+ F
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-19 22:39 , Processed in 0.055464 second(s), 19 queries .

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