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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

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

反向代理:

如下图所示,


; j/ m6 T5 K! A2 A' h# }

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

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

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


. ^8 m. o$ b* d/ {( b, Y从图中,我们可以知道,对于浏览器来说,他会发一个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的这么一个过程便称为反向代理。
. l$ g9 {. E& Q0 S: h$ V2 g* N, \7 l: W2 o* G. R: X
那么,Nginx服务器是如何实现这一步的呢,事实上也很简单,只需要在location中做一下简单的配置即可,命令大概如下图所示:(配置完命令记得reload重新加载才能生效)/ C% w/ `1 n% e0 h& T
5 G( I* r  r. [

& A' o* q: t- r" ~
  1. worker_processes 1;* _& H1 Q0 a" w" B* d
  2. events{
复制代码
/ I; G& c4 s6 t0 C0 E6 O

- S+ H/ g' _; E' z+ j1 t重点在于location处,这样的配置代表的是,所有来自浏览器的请求,在Nginx收到之后,都会代理到http://192.168.1.62:8080所在的地方+ Z0 T$ l/ t5 D( Y

. D' L- d( d, s. u* ^, n- z比如,我浏览器上发起http://192.168.1.61/a/index.html;Nginx收到之后,将会发出http:// 192.168.1.62:8080/a/index.html这么一个请求到所连接的服务器上,如上图的Tomcat。
- n+ Z7 t5 J& k* W8 b1 C& n. T( n
! @! j/ [! b% z
接下来我们做这样一个假设,假如后端连接着几台。几十台服务器呢,这个时候Nginx也是做同样的代理吗,答案是肯定的。图示如下:那么,在这么多台服务器上,Nginx的转发又是基于怎样的策略呢?这个时候就涉及在负载均衡了,说白了就是,应该怎样的分发,才能做到资源的最大限度的利用?
3 C& `* I+ }0 |( g! F" d7 O+ N* J1 p: D! k. o* E0 r& ~
) A9 O1 {% i- M) A+ y, m  ?- V2 n
* C1 g& o7 K8 ^6 s- O& k/ |5 r; }

- v% t3 v9 ^9 s( a1 O负载均衡策略

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

http:// 192.168.1.62:8080

http:// 192.168.1.63:8080

http:// 192.168.1.64:8080

1.   平均轮询

配置如下图:


" R) j% n3 \, ]  c) \" b- ]
6 x( }4 P+ C( {& {7 j9 ]$ h2 p8 H# C  z1 L2 s  \

这里我们把后台所有的服务器放入upstream中,并在代理中进行引用。
4 N* S* C6 ^/ V, b6 |  P, l

2.   加权轮询,使用weight参数设置,配置如下
; Y) |- b" l9 f7 ?1 D
+ `4 ~& J/ B# j, ?: s& W7 h; @. f3.   ip_hash策略: ^4 ^' S6 M0 k; i# q2 V5 u& P' x
(根据用户的IP地址进行hash运算,只要是同个用户发的请求,就会被永远地转发在某台服务器上,比如张三发的请求第一次时是由Tomcat1返回的,李四的是有Tomcat2返回的,那么,以后张三的所有请求,都有由Tomcat1返回,这就是ip_hash策略),配置如下:9 {7 i" U5 W9 L* `$ q5 x8 \$ H+ Q
其他地方保持不变,在upstreaem中如下设置:
; q# A6 B$ ^+ N2 m7 [0 ]5 P/ s& a8 c: i2 w: J% P  m# O
1 o4 i- O- z) s# Z8 x0 F
. a7 j( p5 o: p! y* ]

; y6 @1 _$ D. [4.   fair策略
* `" `2 {. E2 k0 X$ Z8 l: Q(动态weight策略,我们的加权轮询是显式指定weight的,而fair策略是根据服务器的响应能力进行动态指定的,而意义上讲,我觉得是更为智能化的解决方法,不过这里要记住一点,fair策略是一个第三方策略)6 D% U1 K  f5 {! s/ s/ o( f9 E9 x
5.   url_hash策略" K) Y' l% M- n1 S
0 t8 J2 J% a- o
(类似于ip,只不过绑定的值是url,这个也是第三方策略), [7 l0 H$ A: d5 D# t5 ?3 z& b
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重新编译源文件即可/ d0 B. i, r( x5 K9 V, i

; v9 P( d/ ?3 I2 s1 h, `/ q
% c/ w7 R- h" t5 }6 C1 N8 Q6 J* _& E) l
url_hash策略的用处?! ?; c" s0 ]) v
9 f1 \$ i% r9 B- s1 e
url_hash策略比较适合于大型电子商务网站,对于不同的商品便是不同的url,我们可以据此进行负载均衡。! J, z# s' ^# n: {7 z
# ^/ ^1 k4 g3 E% K% F
原理就是不同的商品形成不同的静态页面,然后服务器根据不同商品的火爆程度,按照命中率高的放在缓存里,加快访问速度,也就是说实现了一个基于缓存的服务器,相当于把有限的缓存最优化起来;
8 g* R# T8 \. y' m4 B  E/ f/ ?+ i* Y, i5 M/ h' Z1 _

* I  x, t2 X$ Y
9 C  |( V& x8 ?0 ^0 h/ }其他的配置- O, M0 Y8 S$ O( Y/ e! ]4 n' \
备份与停机状态:, b# Y1 i: h8 e$ _
server 192.168.1.64 backup;//备份,不参与转发,只有当所有服务器都挂掉时才参与转发;
7 U( S$ S" z0 [; r; {$ I2 D- f( c7 ^; j
server 192.168.1.65 down;//临时停机维护,不参与任何转发,是关闭状态,
0 I. X  o9 ~% j' }) V
0 w. K4 k! q! Wdown存在的意义在于,有时我们需要对服务器做临时停机更新维护,假如我们直接关闭服务器的话,那么对于Nginx来说,他还是会把请求发到该服务器上的,因为他并不知道服务器已关,而设置down后,Nginx则不会再发到该服务器上了,避免造成无用的请求浪费。# w2 P8 d0 A5 r9 @" h; a2 h& ^! G

, A, f. v" w3 z
3 z# U& {$ G, X% [" G9 z1 A$ a* x+ }8 f' ?- R/ t
max_fails:        达到指定次数后认为服务器挂掉
, [% \# U. o6 g) d6 a
3 y2 x8 W4 U; M3 D9 G' @7 {+ v fail_timeout:挂掉多久后再次测试是否已经挂掉
* r* p) K) v: l2 b1 Z+ ~9 l
+ E- Z2 L% Z1 V9 i$ A配置命令+ T' s1 j8 @# f/ z# A

; o+ E+ M  K- E0 H4 e2 eserver 192.168.1.66 max_fails=2 fail_timeout=60s;* \6 G- J0 z5 R( X
0 e: ~8 _$ J/ H* A3 k. {+ Q
后记' ^- t  `. b1 e4 ^) m
我们知道,服务器是会存储用户的session的,那么,如果按照上文所说的,比如fair策略,每次Nginx会根据后端服务器群的能力把请求分发出去,那假如第一次时分在了A,那么我把数据存储到了A服务器上,第二次时,刚好被分配到了B服务器上,那么问题来了,我的session不就不见了?(这就是我们在访问部分网站时有时我们的登录状态会不见)当然了,你可能 会说,ip_hash策略不就可以避免这一点吗?没错,这确实是一个解决方法,那除了ip_hash呢?其他策略下又当如何呢?下篇博客将会讲到负载均衡下如何对session进行处理。
0 T! I6 d: x3 g4 l) y8 V7 v
) n; a3 v+ l& }4 l% _
% O& G. g; L: S; N5 W  u) I
9 W9 s' w( R& e- A" e0 n* n
3 a* U0 E' t5 d  _# S: q; _9 ?2 m5 F
# \" R2 k1 i; t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 11:39 , Processed in 0.064949 second(s), 25 queries .

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