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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

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

反向代理:

如下图所示,

+ g+ d. [& L+ t1 @

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

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

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


* X  F' ]0 p1 `; R3 L  _从图中,我们可以知道,对于浏览器来说,他会发一个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的这么一个过程便称为反向代理。' ?1 p: T1 N: k
5 F5 U/ y. j. W$ D
那么,Nginx服务器是如何实现这一步的呢,事实上也很简单,只需要在location中做一下简单的配置即可,命令大概如下图所示:(配置完命令记得reload重新加载才能生效)
0 \, w0 C5 f1 v  w" v
0 I+ q0 Z: L& T; n! i) Y
9 v& y$ I, G3 E0 M" H; C
  1. worker_processes 1;
    . Q$ e! K% |: \
  2. events{
复制代码
1 Y6 h3 W# q& r" R: d
  f- [+ B0 ^$ g4 }& i8 L2 d$ I
重点在于location处,这样的配置代表的是,所有来自浏览器的请求,在Nginx收到之后,都会代理到http://192.168.1.62:8080所在的地方+ s1 p5 `6 z7 L

, D7 Z8 m0 o( L5 Y比如,我浏览器上发起http://192.168.1.61/a/index.html;Nginx收到之后,将会发出http:// 192.168.1.62:8080/a/index.html这么一个请求到所连接的服务器上,如上图的Tomcat。* |* w0 @$ P/ t" r3 V

" T3 i% H% {% M( E$ q4 P1 @% V) j8 P# t2 n1 \* G, w
接下来我们做这样一个假设,假如后端连接着几台。几十台服务器呢,这个时候Nginx也是做同样的代理吗,答案是肯定的。图示如下:那么,在这么多台服务器上,Nginx的转发又是基于怎样的策略呢?这个时候就涉及在负载均衡了,说白了就是,应该怎样的分发,才能做到资源的最大限度的利用?
6 v' K- d  E) S* I+ z2 ]: L# F9 b9 U8 y0 Y, }
3 T! t5 e# |+ R6 b# m$ u7 ?3 E' V

0 r3 D! A, c- b' O% j& g7 L  e( d) C0 J# H9 C2 F0 }$ x& p
负载均衡策略

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

http:// 192.168.1.62:8080

http:// 192.168.1.63:8080

http:// 192.168.1.64:8080

1.   平均轮询

配置如下图:


# Y5 P0 }- G: `9 D( K( p7 n   t9 G7 w6 [0 J% V3 j
* D2 u/ `9 {9 t

这里我们把后台所有的服务器放入upstream中,并在代理中进行引用。
5 }6 {; K! [& Y) Z6 {. ]

2.   加权轮询,使用weight参数设置,配置如下6 o% r* k* {5 J: F# I! I( @  N

# o7 i. D+ G& [( J* `3.   ip_hash策略
3 J6 [& @7 f/ Y2 o, |, S(根据用户的IP地址进行hash运算,只要是同个用户发的请求,就会被永远地转发在某台服务器上,比如张三发的请求第一次时是由Tomcat1返回的,李四的是有Tomcat2返回的,那么,以后张三的所有请求,都有由Tomcat1返回,这就是ip_hash策略),配置如下:
2 ^2 \. f  S* |* D8 S$ w 其他地方保持不变,在upstreaem中如下设置:) k# z5 a  \( ]+ E$ g, p

; E1 c8 }: x; v' N/ s( ]
& o+ n. C' a( Y; n$ t' ]
- t" K4 s  N9 j" z. y5 m% a' T5 k" [+ e
4.   fair策略
# u! F; d$ C' Z- U, n5 n(动态weight策略,我们的加权轮询是显式指定weight的,而fair策略是根据服务器的响应能力进行动态指定的,而意义上讲,我觉得是更为智能化的解决方法,不过这里要记住一点,fair策略是一个第三方策略)
! E+ r. {' Z" H8 Z' |( [: z5.   url_hash策略: ^5 i  W" x6 a; Q' r
; d5 W1 h/ w6 M$ l, ~
(类似于ip,只不过绑定的值是url,这个也是第三方策略)$ S0 `* s! ?& O2 E
fair策略与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重新编译源文件即可% f, o1 x1 H3 r7 @  u7 f8 H0 V
* f  u7 p+ j/ {' Q  _$ M
( a5 y/ V. l5 N  Y
5 T; A; r4 O9 q# v( o( ^% {
url_hash策略的用处?
) C5 J% a' S6 @& z( k: Z
$ W$ L' G9 t: S% Purl_hash策略比较适合于大型电子商务网站,对于不同的商品便是不同的url,我们可以据此进行负载均衡。
$ h" M! P% N8 O' w, s
, ?: M* ]: q7 i/ S$ I原理就是不同的商品形成不同的静态页面,然后服务器根据不同商品的火爆程度,按照命中率高的放在缓存里,加快访问速度,也就是说实现了一个基于缓存的服务器,相当于把有限的缓存最优化起来;% t/ z* J) m* @& U' V% Q
/ n5 f* B6 g+ p) N
; e0 Z0 A# t5 h
' \9 r8 s7 Z) t- l& ]
其他的配置. h! o# i& c! W" s8 B4 k
备份与停机状态:
7 C0 d: k/ L. S8 N, Z' L/ ?( Vserver 192.168.1.64 backup;//备份,不参与转发,只有当所有服务器都挂掉时才参与转发;& s+ V" x7 O2 Z. @
% m0 T  l$ K1 A- K7 e0 Y
server 192.168.1.65 down;//临时停机维护,不参与任何转发,是关闭状态,
( P" g. C8 m, c3 ^) ^$ J7 x+ v4 @- Q; x# e, f; X: V
down存在的意义在于,有时我们需要对服务器做临时停机更新维护,假如我们直接关闭服务器的话,那么对于Nginx来说,他还是会把请求发到该服务器上的,因为他并不知道服务器已关,而设置down后,Nginx则不会再发到该服务器上了,避免造成无用的请求浪费。
. Z& m- f. C; B  k( W4 M9 Q9 u5 H9 I% A9 p" f

$ Q4 Z: E6 X7 ^3 T6 t- }+ m8 j! f9 Q  a4 c8 z9 j4 C( q
max_fails:        达到指定次数后认为服务器挂掉
. h1 T' A5 Z- P! o7 \8 W+ F% e( Z+ C
fail_timeout:挂掉多久后再次测试是否已经挂掉  |, r( y( f; E; `; S

. c- f+ Y; P8 Q5 W/ w- H; x配置命令- x- G7 _4 G  J5 ?( n; @& v

1 @  c4 [: W7 x* |server 192.168.1.66 max_fails=2 fail_timeout=60s;7 E. D! l' r. o' i
4 v9 y$ q, a6 f# Q" V9 S
后记
& y7 _% _6 q" t  B+ X我们知道,服务器是会存储用户的session的,那么,如果按照上文所说的,比如fair策略,每次Nginx会根据后端服务器群的能力把请求分发出去,那假如第一次时分在了A,那么我把数据存储到了A服务器上,第二次时,刚好被分配到了B服务器上,那么问题来了,我的session不就不见了?(这就是我们在访问部分网站时有时我们的登录状态会不见)当然了,你可能 会说,ip_hash策略不就可以避免这一点吗?没错,这确实是一个解决方法,那除了ip_hash呢?其他策略下又当如何呢?下篇博客将会讲到负载均衡下如何对session进行处理。
: t8 F7 i/ y8 A7 U
5 O! B( P: J4 T' ]( A0 h
4 }; v2 J  Q' n1 V) J. h% c' U5 u: q4 [+ O
* N7 L, `+ U- |) i1 x1 }. |
7 F4 V1 U0 H8 U8 @- t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-17 18:32 , Processed in 0.115695 second(s), 23 queries .

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