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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 15342|回复: 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) H8 O1 E. [  I

% v$ P# g5 Y, n, j$ {' u
  1. ###更新仓库
    . `5 l' [0 M) \. r" o  W
  2. & V  N; g. O! C, I8 J# e$ ]5 M
  3. apt-get update -y
    * u' d& |9 k# B  K; n8 D1 z; S$ n7 L
  4. apt-get install wget -y7 h) s3 _6 l& q; `% B
  5. #下载nginx和相关软件包
复制代码

) G1 a( |) N& U/ N" g9 |: @# p$ [/ q$ `- O
pcre是为了编译rewrite模块,zlib是为了支持gzip功能。额,这里nginx版本有点旧,因为我还要做升级nginx的实验用。大家可以装新版本。
, U, u- h! p4 l$ I. u4 ]
( H9 H, W! H+ a5 Y7 ^' n, _& R
  1. cd /usr/local/src
    0 G/ j5 r  P% v+ l  @+ W; _% C
  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>3 p: w# p3 e1 i! @$ e
  3. wget <a href="http://zlib.net/zlib-1.2.8.tar.gz">http://zlib.net/zlib-1.2.8.tar.gz</a># o4 t, c' [2 b& @! V7 A
  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>
    / t! M  b, c; b. F" y+ P
  5. tar xf pcre-8.33.tar.gz
    5 x8 Y6 p2 _; i! D6 e  k
  6. tar xf zlib-1.2.8.tar.gz! N2 b6 Y, K4 p6 @% y
  7. #安装编译环境
    4 @+ G7 C1 I( v! @+ x, z' h2 L( e
复制代码
8 D* B2 v. w& [
+ w4 K2 b% U2 y1 P. E
apt-get install build-essential libtool -y9 d9 R1 o: b, Z7 N+ ^
#创建nginx用户
7 F4 E& n. x8 Q- s9 H
  M2 X8 w: R! T( D+ S所谓的unprivileged user  ?2 j- O" K9 I. [2 ?- ?! a
% ^: i) i7 R+ l, a3 e* L
  1. useradd -s /bin/false -r -M -d /nonexistent www
    : ~- `, `" Q% W3 t" l( M' r* Y
  2. #开始编译安装
    4 }+ v* z7 b8 O& y- Y/ @  m- [, \
  3. 1 c. C. u2 A9 B2 q& b
  4. /configure --with-pcre=/usr/local/src/pcre-8.33 --with-zlib=/usr/local/src/zlib-1.2.8 --user=www --group=www \) j( i5 [4 K3 o: |
  5. --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module9 p4 q/ z/ q# [% I  p6 z
  6. make
    3 T2 }$ |* r4 K3 B
  7. make install
    / c/ L3 ]$ k. s0 r+ M
  8. #给文件夹授权
复制代码
5 K. H- ]8 k( N

0 P/ s2 a+ h! w# x9 ]chown -R www:www /usr/local/nginx
- c# g8 ^1 d: N  l9 z0 R#修改配置文件
, @, V( q8 Y2 F' V! ]+ F2 yvim nginx.conf
; ^  ^% \' H9 c# z3 g# l+ h- J1 A; B9 P. c6 j( w
user www www;
$ B" q6 K. q+ U1 h# k6 hworker_processes 1;; c' R# Q- X- c5 z
error_log logs/error.log;
( L# K9 U7 R, k! cpid logs/nginx.pid;
% `! E- p- ^" x5 j# zworker_rlimit_nofile 65535;
2 U' H  u8 x) g4 L' e' X; }$ Qevents {
/ T: j3 A! ?, o8 k# a, q2 `" L1 C  use epoll;
+ N  L4 O9 \8 {  c+ K$ g  J  worker_connections 65535;4 _- l# |+ Y9 n: [
}
/ u$ L2 ~; W6 y0 z+ l& ]http {
- C. e# M5 F" ^% x) ^/ \; d  include mime.types;
. }2 ]* w" S2 S2 ^  default_type application/octet-stream;$ A0 S% }) c7 P, j( g3 x
  include /usr/local/nginx/conf/reverse-proxy.conf;
: P) @  ~0 q! U) i! e6 Z' `  sendfile on;3 ]+ F6 ^4 p. y" }- T# a
  keepalive_timeout 65;
; m1 |4 I' B! t8 s8 H. ?  gzip on;& {7 y- i8 {) f- Z" z8 Q
  client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
# P  g3 |# L; o" N  client_body_buffer_size 256k;
' {5 {' b9 x- c, M" ?+ r  client_header_timeout 3m;$ Z' k) v+ }( Z3 a: Z5 {
  client_body_timeout 3m;
" x# \! E# T. ~. F, Y+ y& S) p  send_timeout 3m;  h4 {' n5 x" t* n3 H$ a
  proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
) S- {5 G# k/ Q2 f5 _0 e% v6 j  proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
6 Z4 l8 v0 |( O  ]; k0 Y7 s  proxy_send_timeout 300s;, n2 _$ r+ z4 P% @$ l
  proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小. n/ |7 }* Y% U4 t3 H
  proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
* V% x3 C4 L# w. V4 D) o4 m6 R  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
5 e: E$ w) l3 [2 U, }' A  proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
! j# ]' g$ t/ I7 G9 P; K  proxy_ignore_client_abort on; #不允许代理端主动关闭连接
" k& M2 v& e. m) G  server {
5 I3 B- t( e6 S$ n    listen 80;, E$ \# g( R3 ^2 C+ l
    server_name localhost;
3 k5 u/ |. y; x, T4 X1 s: I    location / {
2 x* l0 m: W$ m4 O3 N) H( i      root html;
  C! p( o) ]! A      index index.html index.htm;
/ l& e( r9 f* a" [5 `    }) S4 v* w  O. s
    error_page 500 502 503 504 /50x.html;2 S4 N! k. \5 d7 K# @. d# s) a! b
    location = /50x.html {+ K% d" G- i" V8 l
      root html;4 D8 V- o; M/ t5 }: Y
    }% F) v4 N, w+ T0 }) {: E
  }
* M* O7 p" e, k$ O$ r}! x, \" E) M8 A- |" J- [
2 l0 [$ M+ {3 p0 }
编辑反向代理服务器配置文件:& u! `( o% @! y; Q1 B8 u" u

  s3 |6 i/ N; f! |vim /usr/local/nginx/conf/reverse-proxy.conf9 c: y/ [9 V' U: c# @
2 K0 F8 Z# N$ t
server2 A4 J+ |% p7 C: z
{
8 ^" W# M- ]% V4 K# @2 _  listen 80;
2 P$ R! s; s$ |# ^& a  server_name xxx123.tk;
7 V2 y/ P" {7 l( |% ]+ b  location / {  L$ H* w, w* |3 W
    proxy_redirect off;" F- J% X6 V8 V) y
    proxy_set_header Host $host;4 J5 `* \3 X% b. j% z- B& N/ M
    proxy_set_header X-Real-IP $remote_addr;* u8 A$ A/ i( o; j3 C: P9 P! h
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ ~! l5 Q8 t; C0 ~    proxy_pass http://192.168.10.38:3000;& q5 G% X) b4 R, F7 I
  }
; N- _+ o9 b+ {6 p  U: x  access_log logs/xxx123.tk_access.log;! F$ k0 i  N: ]0 M. H2 @
}
# y  [3 t1 e  c: O% k% g  
- s% `2 C" H1 a2 a7 ^/ g& F8 u; bserver) l7 \2 O& @: k: L9 a2 ~. _
{
8 E5 q, ~% R( ?5 c  listen 80;5 d8 ?" R. j& G. }( f/ R
  server_name xxx456.tk;
% R; F% I: B, ?' \  location / {( ~. M' r8 C. A
    proxy_redirect off;1 V7 z2 N' g; d" q& S/ R
    proxy_set_header Host $host;& _8 Y0 _" N; w" w) y5 O5 d
    proxy_set_header X-Real-IP $remote_addr;
, X9 U( x1 Z4 x- [) s    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;; n: u8 m: [  s, W7 A+ Z! l
    proxy_pass http://192.168.10.40:80;
  Z6 g; H1 o2 s- X0 Z4 P  }
9 K, J7 c- d$ h6 F  @) r. `  access_log logs/xxx456.tk_access.log;
8 T- f/ I' m! {2 [( I% d}- I" D. Z2 g4 ^# D% G! }& [& T- G+ ]

0 n4 o& Z! x; U然后重新加载nginx配置文件,使之修改生效,再把xxx123.tk域名指向公司静态IP,这样就成功的做到了在浏览器中输入xxx123.tk的时候访问的内网服务器192.168.10.38的3000端口,输入xxx456.tk访问192.168.10.40的80端口的作用。 如果想对后端机器做负载均衡,像下面这配置就可以把对nagios.xxx123.tk的请求分发给内网的131和132这两台机器做负载均衡了。
4 P5 I# w7 y& K5 ]' w# u2 _
4 E" H: I( @6 g7 n/ Jupstream monitor_server {
7 J( @. ~2 y, ~2 q% |; M: S, y$ ]  server 192.168.0.131:80;
  `, j; h) G# E6 c1 s' Y7 V1 N: j    server 192.168.0.132:80;
4 C+ {7 H! v' J: Z+ b2 G; f. F8 I/ P, o( B}( I& E! V- ?8 ^" C1 u- y. Q' w
  0 i: \8 ]( N. y+ K: t# `
server" H" w, F+ v$ ]! Q6 [
{. h1 |8 m  E# R/ |
  listen 80;- u+ Q1 N+ K( O: I- h: p
  server_name nagios.xxx123.tk;  n* B% u: Q6 s+ V
  location / {
  B! l) v4 f2 z6 W    proxy_redirect off;; M% E/ J7 y7 d" ^
    proxy_set_header Host $host;
! {. W! n: p' l- n/ @. R+ H4 ~( r    proxy_set_header X-Real-IP $remote_addr;! I. o2 H% ?7 |: T; e" t5 q
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 2 D. Y# M" F4 _# p+ R8 _
    proxy_pass http://monitor_server;& o: Q1 q  s+ r, n. a
  }
4 @) U% H3 m  U$ ~* E8 G" a  access_log logs/nagios.xxx123.tk_access.log;
/ z3 [) o7 ]' N  a* p}
$ o1 I" I; c" @3 y4 j
+ y! _  K* b- [1 j$ O/ |: \额,关于负载均衡和缓存就不多说了,这里只是要起到一个简单的“域名转发”功能。 另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。 要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx: 在后端配置文件里面加入这一段即可:
! d4 _+ P3 B" M4 L5 r, V
- ]+ T) s7 [6 ?3 Elog_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" ': `- |2 o& i/ b: V  o
'$status $body_bytes_sent "$http_referer" '/ M7 _" J, r2 U( u
'"$http_user_agent" $HTTP_X_Forwarded_For';
; c- F7 j7 J7 _  : P0 I+ w+ m3 ]
access_log logs/access.log access;
0 q, R% l! e6 e" w( i# I" ~
6 v' ~$ ]% Q5 w% A. ]再看看原来日志的格式长什么样:5 J1 m6 e( p7 X+ l' ?, V6 ^, z  }3 O
# x. ]: _# A0 Q- ?& L
1
6 |' q; ]: z: d! R7 @( A* l9 m2
9 U5 S, B" X, k7 |$ e) ?0 _7 w3
" I9 @) x4 F5 [- V# B" s3 L! T  l4, X+ Q2 H7 W3 u. i
5
1 \- y2 G$ h4 ^8 R0 l! {; a, V#log_format main '$remote_addr - $remote_user [$time_local] "$request" '; C9 k$ T0 |5 [! {
# '$status $body_bytes_sent "$http_referer" '
) ?/ B/ Q% N, |+ K# '"$http_user_agent" "$http_x_forwarded_for"';; ]& Y0 S, X$ I) ~# g5 {, |9 H7 A6 v
  
2 |9 W8 _2 s1 v: G* d9 k#access_log logs/access.log main;  P5 E: j! ?5 G: @% v
看出区别了吧   遇到的问题   之前没配置下面这段,访问时候偶尔会出现504 gateway timeout,由于偶尔出现,所以不太好排查
; J- ?% q! I) j5 E9 x3 H# b5 @$ y% Y$ }3 T) A
1
. \2 f) M- P9 ?% P2
8 |0 J  o- Q7 I  \* m3
! X! r7 W% f) c4
, R4 t4 Q+ z6 @2 g5
' ]# Y9 Z6 w6 X& ?7 r  a5 V9 E6
. ?5 |9 b) z$ W8 V8 z3 |- i5 J( V7
- f8 h1 x0 N" R8
0 J* R9 Y# X5 j$ wproxy_connect_timeout 300s;
) p7 H& ~, X% \+ A+ |proxy_read_timeout 300s;# u  U+ `2 v7 A; F4 t
proxy_send_timeout 300s;
: @0 W. @! I  u9 mproxy_buffer_size 64k;- U9 x; ~3 e& r! f9 }. E& y
proxy_buffers 4 32k;
1 c5 G8 f( x- L( zproxy_busy_buffers_size 64k;
. b6 V. G) k. s5 g+ h1 x8 `+ @proxy_temp_file_write_size 64k;
3 u% s2 q7 O& o/ Wproxy_ignore_client_abort on;) H, @% `+ ?8 w
报错日志:2 L. D- M$ @. I2 j% ^

( v7 Q2 L/ ~! a, |...upstream timed out (110: Connection timed out) while reading response header from upstream, client: ...(后面的省略) 从日志看来是连接超时了,网上一通乱查之后估计可能是后端服务器响应超时了,本着大胆假设,小心求证的原则,既然假设了错误原因就要做实验重现错误:那就调整代理超时参数,反过来把代理超时阀值设小(比如1ms)看会不会次次出现504。后来发现把proxy_read_timeout 这个参数设置成1ms的时候,每次访问都出现504。于是把这个参数调大,加入上面那段配置,解决问题了。3 m* x1 `2 k) B/ X7 _

- o( M$ B+ t7 V% `" ^5 rPS:关于域名转发, S+ a9 a2 P" i
+ t/ T: B+ l1 g, e
所谓域名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/ 的内容。
1 [: E$ Z( F+ m! W0 d- ]3 Z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 05:49 , Processed in 0.063945 second(s), 19 queries .

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