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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

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

反向代理:

如下图所示,

: I! O4 d; I5 D+ x

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

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

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


8 d  w' o0 k7 ^" {- V从图中,我们可以知道,对于浏览器来说,他会发一个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的这么一个过程便称为反向代理。; U/ S3 I( s. ~# n0 W

1 S5 [- ]+ b1 `5 S% O那么,Nginx服务器是如何实现这一步的呢,事实上也很简单,只需要在location中做一下简单的配置即可,命令大概如下图所示:(配置完命令记得reload重新加载才能生效)1 l. S; X) a! Q+ Z' z3 Q7 w
$ n: U. C5 M3 [# b% k5 _

* C" `0 y; i% u6 X/ h+ G6 z
  1. worker_processes 1;
    3 a  G1 b! T# O, C' Q3 i( y3 \
  2. events{
复制代码
! B) R7 U0 c% c+ X6 q$ {

/ Q1 Q% _& J( Z重点在于location处,这样的配置代表的是,所有来自浏览器的请求,在Nginx收到之后,都会代理到http://192.168.1.62:8080所在的地方( P0 M8 i; Q* D  G; `0 s
" L1 r# l$ y8 t& K6 G, a! q
比如,我浏览器上发起http://192.168.1.61/a/index.html;Nginx收到之后,将会发出http:// 192.168.1.62:8080/a/index.html这么一个请求到所连接的服务器上,如上图的Tomcat。
. [7 g3 u. I' A% u# C' L5 D+ T* [7 m$ {- _' b) h. Z4 @* Y7 A

+ b8 y9 g! j# p  `4 L接下来我们做这样一个假设,假如后端连接着几台。几十台服务器呢,这个时候Nginx也是做同样的代理吗,答案是肯定的。图示如下:那么,在这么多台服务器上,Nginx的转发又是基于怎样的策略呢?这个时候就涉及在负载均衡了,说白了就是,应该怎样的分发,才能做到资源的最大限度的利用?3 I7 S, M8 |6 R. e& Z

. O& q0 N7 z& z9 D% w: T- P
6 l9 Q5 {8 J! y' s: Q % }% e: i& i$ m* C
5 G, u( }+ g8 m/ ~2 Q
负载均衡策略

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

http:// 192.168.1.62:8080

http:// 192.168.1.63:8080

http:// 192.168.1.64:8080

1.   平均轮询

配置如下图:


$ I! W: V1 K: q* k" S
8 {5 d! F" P" g) x& _$ K  a& O4 i- W3 r( h6 ^! ?1 u; b

这里我们把后台所有的服务器放入upstream中,并在代理中进行引用。7 V: Q4 F1 }! o/ [1 U, ]7 A. D- T/ E

2.   加权轮询,使用weight参数设置,配置如下
$ L7 T* t' F3 M( x* x9 ~9 F6 r ! B! j' Q+ u. h: S; ^- g
3.   ip_hash策略5 v9 @5 ^2 K  z6 d1 g% I
(根据用户的IP地址进行hash运算,只要是同个用户发的请求,就会被永远地转发在某台服务器上,比如张三发的请求第一次时是由Tomcat1返回的,李四的是有Tomcat2返回的,那么,以后张三的所有请求,都有由Tomcat1返回,这就是ip_hash策略),配置如下:; o6 `+ x- C# Q8 h( U( P# R9 \
其他地方保持不变,在upstreaem中如下设置:  I7 x! o# H4 H% T; v( r% U1 @9 T
+ f! ?0 L8 E  _( a! |# h) m

. B/ ]6 T+ P! }4 E
& O8 x+ m" u$ k( v9 N
& U. n+ Y3 X4 _4.   fair策略# }8 E& K1 z! B% E# C3 I" L- ]6 n- \
(动态weight策略,我们的加权轮询是显式指定weight的,而fair策略是根据服务器的响应能力进行动态指定的,而意义上讲,我觉得是更为智能化的解决方法,不过这里要记住一点,fair策略是一个第三方策略)) f3 [$ Z& b5 q
5.   url_hash策略; p& f4 F4 d  x9 y- [6 S3 R

+ x+ g! `( y& w  n* S2 |: j" O" J* Z(类似于ip,只不过绑定的值是url,这个也是第三方策略)% H1 j0 q( n* o0 ~5 I
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重新编译源文件即可
) I3 Z8 J% X6 `/ K: a2 r3 I+ p5 W0 _; F, I
8 p9 k- l) C& M. y8 a8 L# J- w* l
, W$ \" D/ @* I6 M+ S9 t
url_hash策略的用处?
4 ?1 f% R- h2 C) k# |& R& w+ l8 U$ i. x; z
url_hash策略比较适合于大型电子商务网站,对于不同的商品便是不同的url,我们可以据此进行负载均衡。
' m6 x3 h0 ~' {3 x9 S
( d' S, C) X1 e* F原理就是不同的商品形成不同的静态页面,然后服务器根据不同商品的火爆程度,按照命中率高的放在缓存里,加快访问速度,也就是说实现了一个基于缓存的服务器,相当于把有限的缓存最优化起来;
" e3 i" u" M: f$ a. n+ @" {# r% l. ?2 W; o; R( K7 K1 c
7 Q3 B# S; y, ?; w/ S+ L7 P

! ]% p; ~3 ]2 K  e: _; L其他的配置
6 L$ ?1 L% s6 e( w6 |备份与停机状态:0 T& N* |6 x+ u0 z2 T5 n2 C
server 192.168.1.64 backup;//备份,不参与转发,只有当所有服务器都挂掉时才参与转发;! d3 r% v& c' `

3 {& [, c$ {" z; H/ O" U0 yserver 192.168.1.65 down;//临时停机维护,不参与任何转发,是关闭状态,
: N; V- v, T+ K/ l0 z
1 E- p# `) P& |, z# l6 Cdown存在的意义在于,有时我们需要对服务器做临时停机更新维护,假如我们直接关闭服务器的话,那么对于Nginx来说,他还是会把请求发到该服务器上的,因为他并不知道服务器已关,而设置down后,Nginx则不会再发到该服务器上了,避免造成无用的请求浪费。6 X' t7 \6 i8 U  s4 p

0 I, i& z! o* H2 V$ f" g  I  u. B. \+ h- D8 w4 s  k; X

$ l. F: \* U5 o  n$ t6 Rmax_fails:        达到指定次数后认为服务器挂掉3 Q/ f7 a7 }1 d5 X% F! }3 g2 `
. K" |: ^/ @2 j. G  ]  ^- o
fail_timeout:挂掉多久后再次测试是否已经挂掉3 h3 A. c) Y' ~& c6 V5 P- @# z

% O$ }; `- M9 G9 G4 ?& m配置命令
" D! a1 w, D" e' p3 C+ O7 l8 N' c6 E5 K$ H% y* S
server 192.168.1.66 max_fails=2 fail_timeout=60s;2 a- y$ j4 E9 l5 h8 g+ Z

" Z7 J& s0 p4 j$ J! O 后记
$ N2 f% i. c2 _; Y我们知道,服务器是会存储用户的session的,那么,如果按照上文所说的,比如fair策略,每次Nginx会根据后端服务器群的能力把请求分发出去,那假如第一次时分在了A,那么我把数据存储到了A服务器上,第二次时,刚好被分配到了B服务器上,那么问题来了,我的session不就不见了?(这就是我们在访问部分网站时有时我们的登录状态会不见)当然了,你可能 会说,ip_hash策略不就可以避免这一点吗?没错,这确实是一个解决方法,那除了ip_hash呢?其他策略下又当如何呢?下篇博客将会讲到负载均衡下如何对session进行处理。
4 r$ i4 Z8 g8 n- N- a0 w  \/ Y+ |1 c  C/ g% A' @

, `1 z* ?6 ]' j% J. Y
9 @, [6 E3 H) O& S# [, X- l& }% |: t3 q
2 ?& \- B3 k! u- D4 L
, c8 g2 P; |0 R0 m+ |; s
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 04:47 , Processed in 0.051872 second(s), 22 queries .

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