cncml手绘网

标题: Nginx服务器作反向代理实现内部局域网的url转发配置 [打印本页]

作者: admin    时间: 2020-2-25 04:54
标题: Nginx服务器作反向代理实现内部局域网的url转发配置
情景 由于公司内网有多台服务器的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
- m7 F* k1 w- d* d, c+ n4 q
) H8 [8 z9 H: F: k! {
  1. ###更新仓库
    5 k: L# i4 d* Y9 A/ D' f; {: x

  2. : x/ v6 E. i. L
  3. apt-get update -y* v: m" |+ N. B1 s  X
  4. apt-get install wget -y' C* W4 R# K8 V  M6 a. ^& S& a& G' U
  5. #下载nginx和相关软件包
复制代码
0 Y  Z2 L5 Y9 P5 |

0 |! Z  Y" R' @pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。# h% x3 k) d4 M; O

6 t) e) Z8 K* ^3 ^! E
  1. cd /usr/local/src
    % @. V- C" N( J# t. a; T4 O! `
  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>! a9 P- ~* U  |" o: G2 i+ t8 F7 x
  3. wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a>
    4 v0 D; x& `% U: x& D
  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>
    ; J& v8 S8 c- ^
  5. tar xf pcre-8.33.tar.gz" g, i; l2 L5 v2 @' [: @% N5 E
  6. tar xf zlib-1.2.8.tar.gz
    5 |! }* N( F$ m9 L. }$ _4 ^; U- {
  7. #安装编译环境- r9 k: R; `( i0 X9 P% v5 ^
复制代码
0 U. E  F! f6 G% h
4 z" K  @! k' Z9 c2 D
apt-get install build-essential libtool -y
. G& b4 w, B- F1 K2 ~% t' u#创建nginx用户
2 C* O7 F6 w' {' Q) R$ X* c
+ C2 J4 ]+ ~8 x" ?) q所谓的unprivileged user
  i! J$ }' Q# q* M
& ]5 \9 y0 h- x/ ^! s# W+ `
  1. useradd -s /bin/false -r -M -d /nonexistent www+ s7 g3 `' a& I& G
  2. #开始编译安装: @, F; h7 \7 l3 c, N

  3. 6 ?- ]) Z& E: Y1 k% G
  4. /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \
    / ~* C, b! V. {2 ]. `. @1 k
  5. --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
    ; J  t8 h% T3 P2 V+ ?
  6. make# e$ m! u3 E& t$ z3 \8 y. X
  7. make install
    / X( x# b$ Z: j2 b
  8. #给文件夹授权
复制代码

& w% s; l9 L" a7 B
7 H" U2 c5 a+ R# V7 `3 e' ~chown -R www:www /usr/local/nginx
  S& s! U+ j4 z. x#修改配置文件" E2 `( [* B" B; m! E0 A3 }
vim nginx.conf
3 m- {; e' H  \- z3 V5 l. F$ W" t- L( G( ^  |% P
user www www;8 a# j5 C% s3 `, H
worker_processes 1;! i  x6 m8 n9 i6 i( L, S. R8 L
error_log logs/error.log;
0 U9 \. s/ c, Z% Q1 [pid logs/nginx.pid;0 U9 {6 ?2 J& h2 ]2 M  A
worker_rlimit_nofile 65535;
! @. B& ]+ A/ N# L& C& mevents {
! |* ~* Y5 S* u9 P& k2 [$ P$ ]  use epoll;
: s7 l/ _+ x  H0 k2 L  worker_connections 65535;
% ?# h, t  z1 ?  }! [* E}; y6 j8 q: M/ i) U
http {& g4 M6 J7 D0 z& k
  include mime.types;
! S6 O3 ?3 \* F4 L$ p3 g# @- Y  default_type application/octet-stream;9 d3 K: B( C4 h' m5 B+ K
  include /usr/local/nginx/conf/reverse-proxy.conf;8 Q1 X7 j" b) v" n. ?
  sendfile on;, n7 `( ^) r9 N' c. x( a
  keepalive_timeout 65;
% p; k3 E  V: u" o1 p$ H  gzip on;
0 y7 q+ u* _6 B8 `7 }8 V# o  client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户7 `6 a/ y* l2 P" m+ ~6 H/ n
  client_body_buffer_size 256k;5 i: J% R* {4 y, ?
  client_header_timeout 3m;5 _: D' J: i9 s9 k
  client_body_timeout 3m;
# I% V0 S: Y  _& R  p; w" U* x/ \  send_timeout 3m;. N  k+ ~7 _9 S+ R9 |
  proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
+ ^1 ^0 Q( [/ n% c  proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)1 \6 K3 |( K! B4 @
  proxy_send_timeout 300s;
5 R9 j5 D# s, Z$ H1 O2 C  proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
; c  k/ d) I! k7 X6 M/ o! o1 [& f  proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置' Y- L! V& D1 |0 F$ |3 z0 c
  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
5 U# B1 `) O- X. I# ~  proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
1 d" [' Y9 \; m2 k# a8 d  proxy_ignore_client_abort on; #不允许代理端主动关闭连接7 Q. U8 w; c' @6 B5 @3 ]
  server {
* j7 c1 W( q0 a3 M0 x9 ^    listen 80;
0 d! q" K0 [: ]) h  G+ V    server_name localhost;
/ h! I( w9 K3 f    location / {% F1 c- K2 b# H: N& t% t
      root html;$ Z/ h  e! _7 k6 W! N
      index index.html index.htm;
& b* F+ r. F- R& Q& |, C    }1 E9 h  P! r- |( K/ s' z
    error_page 500 502 503 504 /50x.html;
' w) e5 }7 `; |( j- h    location = /50x.html {
- }. k) v0 [1 `$ T$ a      root html;) ?# ^' p0 g4 |, B7 t8 j2 v8 E
    }
# a2 ?5 w2 y! S  }. N9 k" [) [1 _3 f# b. }
}1 ^1 p+ ?' g4 t% \% H% q) ^2 m7 H+ U/ n
2 J5 Z# E( j3 t2 `6 k) d
编辑反向代理服务器配置文件:. U# q- @* \+ n0 _

* Z& E# Z( _( {$ ?: yvim /usr/local/nginx/conf/reverse-proxy.conf0 s0 X2 X. c" l1 M# v
9 }; |# |# r2 S& Z/ ?$ V  u
server
+ @- `. n% t( B- a" @{( {/ q3 {8 d$ L) @) ~7 P
  listen 80;
5 D- h; e1 P! w' v. q9 C  server_name xxx123.tk;  `5 M$ L6 Z' b3 s
  location / {
. {. N/ J" K2 I/ {1 b    proxy_redirect off;# V5 u: k& \3 d" s& v9 P
    proxy_set_header Host $host;
3 l7 H0 e- Y3 a5 R6 E6 s. u" F    proxy_set_header X-Real-IP $remote_addr;
' T% Q8 q0 E' w' d& ]    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;) L+ Q) R* W% V$ }* m+ R+ D
    proxy_pass http://192.168.10.38:3000;$ p( ?# t1 H* s/ |
  }' r1 }' L' V: A! ^
  access_log logs/xxx123.tk_access.log;
9 I2 k& `1 N  ?( ^) o}% d  Z3 {; d0 y; X9 e8 l8 G
  # N8 Y  C2 e3 R
server% P) X# S3 a: ?5 Q2 L, n4 K( L+ \
{
5 {- g4 @( ^5 j; `$ Q; ]  listen 80;' m; T9 R2 U8 A1 |0 w
  server_name xxx456.tk;
9 F  o' }* t3 ~1 n: `  _0 Y  location / {% |( V& W; R% J4 P
    proxy_redirect off;
) G; U4 e; k8 n& m; l, J$ }    proxy_set_header Host $host;
8 D" ^6 G( t" u/ d1 ~9 t& k3 ]    proxy_set_header X-Real-IP $remote_addr;8 W9 P- q3 K8 d  B+ o1 S% v3 \' F6 M, u
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
: y) z9 }1 D/ \2 m4 P( m9 a3 g    proxy_pass http://192.168.10.40:80;+ L- e$ x5 s2 [9 x+ z; N
  }4 C( |4 L5 k7 p, f9 h: m
  access_log logs/xxx456.tk_access.log;
  _- F+ G( m( d- p5 \# D}5 Z  e; [2 }5 x, x; \" j3 U8 d

4 s* {+ _8 E  i. I, t+ w. g然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。) `" D; j# w; `1 d6 p  Y  @
# t6 ~* A& i1 b+ n
upstream monitor_server {1 V7 W3 ?& w* U
  server 192.168.0.131:80;
- _" [/ d9 q2 F& A, A    server 192.168.0.132:80;
( ^* a# B* Z2 {- u" p}
2 x4 P9 K9 r3 p8 s% n% ^% e  
. P+ b; m2 g) D+ Mserver/ F# t: h9 U+ U( [
{& y9 }" [# Q( W5 H5 Y6 n3 X6 a/ M- D$ h
  listen 80;& B2 j6 T9 \7 J% W3 a
  server_name nagios.xxx123.tk;
& p  B9 }3 S' C+ S' }6 y  location / {
5 w4 n" q* p+ Q    proxy_redirect off;
' `: U1 w7 U3 {1 ~0 \# ~    proxy_set_header Host $host;
0 j' y0 G" H6 l; }    proxy_set_header X-Real-IP $remote_addr;
9 k) R1 e. Z- z% i8 z9 H$ C) S0 j    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ( c! H) {. @' f2 |8 ~- A+ y  I( X
    proxy_pass http://monitor_server;
& Z0 w8 U% J1 r3 s. w, @  }, ?; G9 F- c1 V3 l' D3 Z
  access_log logs/nagios.xxx123.tk_access.log;' Y9 @3 x  N8 X, N- q$ S8 C
}8 P; J1 t" A" l3 \, `& _

) |" `( p) Y6 ~- z: D6 [- @额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
0 l' q& S3 [- C9 _
) Q  H6 k2 g! y3 m0 }& qlog_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
$ ?$ h8 N. h* l- J. `'$status $body_bytes_sent "$http_referer" '
+ Y5 }) F1 |3 w6 [; w'"$http_user_agent" $HTTP_X_Forwarded_For';
! j4 C7 g3 ~; N+ \2 u: ^* C8 b% l3 c  
; c2 Y4 t6 ?6 {, a, O" W1 |) b! Gaccess_log logs/access.log access;/ ?) s4 `$ @" I. }2 r/ z# Q

# f. I- ~8 f/ {再看看原来日志的格式长什么样:
. i6 P: u' q  [. I, ^1 }; ?4 H9 T; f, ~! G1 S) X# l; M6 E
1
$ Y2 u7 Q, E& ]/ @# W. O4 L2& c, T; e5 L5 Y$ k0 R  J- h5 X
3
8 m3 L8 s4 ^+ D. ^! T4
: h! Q& V! q9 p7 E6 ?. b56 T3 r$ c" X" ?1 s
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '" N/ \0 O4 J+ s" v, N) E4 a
# '$status $body_bytes_sent "$http_referer" '7 C3 x  w4 D4 n9 P+ M( P8 n
# '"$http_user_agent" "$http_x_forwarded_for"';
/ B9 s  a* G/ @( R1 \/ z! c  G  
; U7 y, T* s' m6 n7 F; w#access_log logs/access.log main;6 |- A* G% N2 }; y, X
看出区别了吧   遇到的问题   之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
: D  v9 i6 h5 z) P2 j/ y) k6 s7 Q
( I' m/ B$ z3 {$ @7 R6 `1
6 b, I" j4 M6 z" A/ h  S- v) L2
( V0 w: n4 g, [2 ~* d6 T! t# R38 c; Z. ~: v; i7 \7 y# b* ~2 M$ I
40 U( `, k6 t2 K2 u; i  H# O0 R
57 O" {2 u+ \( o( K/ c& M
6
- n! b  n9 ?, l( @7 \- @/ H; {7
) R  y, q) }" z* E* G8
! s$ U! d3 T" J5 mproxy_connect_timeout 300s;5 [& `; b; o$ H; ]9 c
proxy_read_timeout 300s;
2 P. ^, X, Y/ f8 f: Cproxy_send_timeout 300s;
  U- v. R6 E& wproxy_buffer_size 64k;
  n: O% E! g6 W* h  w$ G* Qproxy_buffers 4 32k;
0 r( V2 q- |/ l& j' O# Jproxy_busy_buffers_size 64k;
/ T! T! k, i. l: J& F. Qproxy_temp_file_write_size 64k;
: @; m& v& l; Wproxy_ignore_client_abort on;
4 P3 h  u/ \, z* x) U8 t报错日志:
+ ?* f; e$ {6 w7 S
: @5 F9 Q1 b  Y...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。  P2 P" U% X% m1 ~

! v- O4 _3 x" F& C, SPS:关于域名转发
& t- k# A4 q8 F+ f9 o# V/ K0 G# k9 O# a( S
所谓域名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/ 的内容。, r$ I8 T8 q9 U+ k# C6 G' |' u





欢迎光临 cncml手绘网 (http://bbs.cncml.com/) Powered by Discuz! X3.2