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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 17987|回复: 0
打印 上一主题 下一主题

[centos] 浅谈Nginx之反向代理与负载均衡

[复制链接]
跳转到指定楼层
楼主
发表于 2020-2-25 23:05:39 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

Nginx的负载均衡是基于反向代理实现的,因此,本文先讨论什么是反向代理,再在这个的基础上讨论负载均衡以及负载均衡时应该注意哪些策略。

反向代理:

如下图所示,


6 R) [5 n% ]  l2 u: N0 l+ M) ?

  ↓-----Nginx将结果返回给浏览器---丨                                                          对Tomcat来说,只知道服务对象是Nginx服务器

浏览器  -发起对该域的访问请求->   Nginx  --------------Nginx将请求来转发给Tomcat服务器---->  Tomcat...

                                                          丨-对Tomcat来说,只对nginx负责,将结果返回给Nginx服务器---↑

' c9 t$ x: h7 W
从图中,我们可以知道,对于浏览器来说,他会发一个http://www.a.com/uri请求到Nginx服务器,对于他来说,他认为数据就是从http://www.a.com/uri域中返回的,事实上,当http://www.a.com/uri到达Nginx服务器后,Nginx服务器会将其转发给http://www.b.com/uri,从http://www.b.com/uri域中取得数据并将其返回给浏览器,这个步骤浏览器是不知道的,也就是说,浏览器并不知道http://www.b.com/uri该域的存在,同理,http://www.b.com/uri所在的域(图中的Tomcat)也并不知道浏览器的存在,他也只对Nginx负责。Nginx的这么一个过程便称为反向代理。8 J  |/ t: `( w1 ]
% g$ P$ ^# \+ o
那么,Nginx服务器是如何实现这一步的呢,事实上也很简单,只需要在location中做一下简单的配置即可,命令大概如下图所示:(配置完命令记得reload重新加载才能生效)- d3 J) L5 e5 m7 M& f' u" a: m3 c

8 N1 p8 ~5 Q6 J2 u5 ^. T2 g. u
  1. worker_processes 1;5 d9 g8 j- X2 v
  2. events{
复制代码

5 V& ?$ d, Z8 t( Y, O& u
0 H1 O2 s( t; k1 j重点在于location处,这样的配置代表的是,所有来自浏览器的请求,在Nginx收到之后,都会代理到http://192.168.1.62:8080所在的地方
, Q( ?: Q7 N4 F& k4 s- H" L7 ]# C5 j/ T# J+ L) k; @
比如,我浏览器上发起http://192.168.1.61/a/index.html;Nginx收到之后,将会发出http:// 192.168.1.62:8080/a/index.html这么一个请求到所连接的服务器上,如上图的Tomcat。. I4 _; m2 U' X' w; {' D
2 M2 _4 e: a5 O  _: M

% F4 K7 r# u' O  e6 g2 ^接下来我们做这样一个假设,假如后端连接着几台。几十台服务器呢,这个时候Nginx也是做同样的代理吗,答案是肯定的。图示如下:那么,在这么多台服务器上,Nginx的转发又是基于怎样的策略呢?这个时候就涉及在负载均衡了,说白了就是,应该怎样的分发,才能做到资源的最大限度的利用?, F5 s7 u- `# s' s* k# \( X

$ @5 w; B' N& D: j/ E; q: ]/ z' o; f! a- w8 P6 q

- a7 l1 |$ b5 _1 q: @3 A' V! n, e6 s
负载均衡策略

我们这里假设三台服务器的IP地址分别为

http:// 192.168.1.62:8080

http:// 192.168.1.63:8080

http:// 192.168.1.64:8080

1.   平均轮询

配置如下图:

6 ?4 y- O  Z- t3 Q0 E- {

) K& r$ A$ Z8 W+ r# W$ N* K9 D
1 z9 V3 }/ H5 B- c2 r( c2 s6 G, m7 d

这里我们把后台所有的服务器放入upstream中,并在代理中进行引用。1 m# z, y$ v! B) v) G

2.   加权轮询,使用weight参数设置,配置如下9 m7 u# _$ z, S! }

, z+ d% Q) `" l$ x) O) r3.   ip_hash策略3 D) @/ `& J" D" j4 N# |
(根据用户的IP地址进行hash运算,只要是同个用户发的请求,就会被永远地转发在某台服务器上,比如张三发的请求第一次时是由Tomcat1返回的,李四的是有Tomcat2返回的,那么,以后张三的所有请求,都有由Tomcat1返回,这就是ip_hash策略),配置如下:. u: {8 Q' L$ v: \5 m9 P
其他地方保持不变,在upstreaem中如下设置:
& r1 b  }. W2 C! H: W4 J' t  Z) C
" g$ Q/ Q5 z9 @' s, N

3 |- D! \9 _/ ^( ~! r& C) ~1 c3 s' d/ X# {
4.   fair策略9 [' ~( f5 i/ h: g: O
(动态weight策略,我们的加权轮询是显式指定weight的,而fair策略是根据服务器的响应能力进行动态指定的,而意义上讲,我觉得是更为智能化的解决方法,不过这里要记住一点,fair策略是一个第三方策略)) ~0 ?- f7 w7 B# d: R; b! {
5.   url_hash策略
* r1 ]2 h$ p# P* [$ Q+ k( R' J& r" z" Y, ^3 j1 ]
(类似于ip,只不过绑定的值是url,这个也是第三方策略)
# e0 j2 ?8 W) d& r0 d  T: Q2 E4 Ifair策略与url_hash策略的配置与ip_hash策略的类似,直接把upstream tomcats 中的ip_hash替换为fair和url_hash即可,不过这里需要注意的是fair和url_hash都是第三方扩展,因此需要先安装第三方扩展模块,直接百度搜索nginx-upstream-fair-master.zip与upstream-url-hash -master.zip;解压安装使用make&&make install重新编译源文件即可
/ E  S' H6 J7 R. u- r- f9 n2 Z& N! G+ h0 r9 m* h/ e) n  V
3 A# Q+ ^, O8 E. R: v  q& s) V
: A+ Q$ n1 X6 M3 A" I% k( n! q1 W
url_hash策略的用处?
$ [7 U* }$ f% b
8 F# k  t/ O9 ]% }, a% y' jurl_hash策略比较适合于大型电子商务网站,对于不同的商品便是不同的url,我们可以据此进行负载均衡。
  `0 J5 v; o' L& g0 O$ H7 W7 |
$ ?# C, w# Y% Y4 b* X/ M7 v& s原理就是不同的商品形成不同的静态页面,然后服务器根据不同商品的火爆程度,按照命中率高的放在缓存里,加快访问速度,也就是说实现了一个基于缓存的服务器,相当于把有限的缓存最优化起来;/ m% v; F8 X7 e! p8 j

$ t+ G8 U7 v' K
% r0 [. w% C0 j' }
$ M* v* @; j& F& k2 k3 N6 g+ ^* g/ M其他的配置
  k0 B: D* L6 c8 N% N- S备份与停机状态:% D) i% X  _8 I) p
server 192.168.1.64 backup;//备份,不参与转发,只有当所有服务器都挂掉时才参与转发;, w* q! k6 @" L" z0 T  D
: A+ k5 J( Y' p/ |) \! ?! Z
server 192.168.1.65 down;//临时停机维护,不参与任何转发,是关闭状态,  [0 s# _8 h, Y* K- H# G3 L

7 I( v9 Z* |) ]down存在的意义在于,有时我们需要对服务器做临时停机更新维护,假如我们直接关闭服务器的话,那么对于Nginx来说,他还是会把请求发到该服务器上的,因为他并不知道服务器已关,而设置down后,Nginx则不会再发到该服务器上了,避免造成无用的请求浪费。
( E$ O: y& B! z* C* X% t1 E
6 _$ M) z+ D& _# y4 C# ~$ `3 Q  A; b8 b" z* |" \1 T/ E/ }
! e0 I1 D" _8 L6 ]/ l) D% `
max_fails:        达到指定次数后认为服务器挂掉
4 D9 P9 T) W  D' N' z9 r/ k$ j4 c1 O: i& S6 h
fail_timeout:挂掉多久后再次测试是否已经挂掉3 r% `7 _5 {6 T, Z

7 X) @( Q8 ?% ]. Z1 v% F5 U1 C" d配置命令
& g$ P% m( j3 ?- i8 Y# \1 \, b; n+ L$ b  T- y* X
server 192.168.1.66 max_fails=2 fail_timeout=60s;
" S: r+ W( }+ `4 V2 T) ~5 L/ _/ u! B% q  O% ?+ K- V/ x9 i) n6 s
后记
* d% \4 Y% E: T) K$ d4 e+ Z% o我们知道,服务器是会存储用户的session的,那么,如果按照上文所说的,比如fair策略,每次Nginx会根据后端服务器群的能力把请求分发出去,那假如第一次时分在了A,那么我把数据存储到了A服务器上,第二次时,刚好被分配到了B服务器上,那么问题来了,我的session不就不见了?(这就是我们在访问部分网站时有时我们的登录状态会不见)当然了,你可能 会说,ip_hash策略不就可以避免这一点吗?没错,这确实是一个解决方法,那除了ip_hash呢?其他策略下又当如何呢?下篇博客将会讲到负载均衡下如何对session进行处理。- h$ }0 j) ]+ @2 ]
- j- b0 i8 O: z8 E; \  N. T
( B5 C% C( v9 t' B+ u( M- ]6 ]
- x, `5 u' l. l

& y% ~6 M4 ]; r9 G0 V* ]- v! R& C2 ~$ g% S0 A0 g# |6 B7 c, G
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 21:46 , Processed in 0.088054 second(s), 23 queries .

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