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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

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

反向代理:

如下图所示,


) v7 Z% E$ v. y$ k7 ]9 s; m

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

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

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


) |  o2 f. ]; A# N8 J' {/ r从图中,我们可以知道,对于浏览器来说,他会发一个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的这么一个过程便称为反向代理。
- P% k2 [: M% |3 \* v7 V
, T' X* @9 |; s& ~3 K& o那么,Nginx服务器是如何实现这一步的呢,事实上也很简单,只需要在location中做一下简单的配置即可,命令大概如下图所示:(配置完命令记得reload重新加载才能生效)
+ ^5 A3 h: \7 G6 u, u: z3 A& n* X4 L
% e' _( ~, V- Z/ d$ c0 F) @1 t$ U, I1 ^9 N* b# o. F/ m
  1. worker_processes 1;3 Q! b9 x/ \1 \5 b1 B6 {6 C
  2. events{
复制代码
/ X( l/ g5 ^) P: B7 G

: h9 O& q9 _  ]2 M0 n6 b* n重点在于location处,这样的配置代表的是,所有来自浏览器的请求,在Nginx收到之后,都会代理到http://192.168.1.62:8080所在的地方
3 ~5 P! l' ?3 r6 K: \: d, a5 j# z' l# i( O' V6 b2 t' h
比如,我浏览器上发起http://192.168.1.61/a/index.html;Nginx收到之后,将会发出http:// 192.168.1.62:8080/a/index.html这么一个请求到所连接的服务器上,如上图的Tomcat。+ k8 S* e* ~% B- [: l1 F0 f
/ r5 y2 {' }+ W. N# n- _

# u0 b$ U" ?. K接下来我们做这样一个假设,假如后端连接着几台。几十台服务器呢,这个时候Nginx也是做同样的代理吗,答案是肯定的。图示如下:那么,在这么多台服务器上,Nginx的转发又是基于怎样的策略呢?这个时候就涉及在负载均衡了,说白了就是,应该怎样的分发,才能做到资源的最大限度的利用?
' a  w0 a* C1 b3 U+ T
- e: K: Y1 Y% X$ V  t6 O
+ V. Y% x, s4 ]5 f1 j- B& W# S" E 9 G9 ^1 B& @! r$ d

1 q* |. @- n- H( X5 l  \负载均衡策略

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

http:// 192.168.1.62:8080

http:// 192.168.1.63:8080

http:// 192.168.1.64:8080

1.   平均轮询

配置如下图:


9 s6 x3 x2 r2 V$ o
# l+ N1 g8 ~' W* S/ C
) p! M3 E6 }0 ?/ a+ I8 o. P) @3 x

这里我们把后台所有的服务器放入upstream中,并在代理中进行引用。. j% s' n7 W% U6 |6 }8 i) J

2.   加权轮询,使用weight参数设置,配置如下
8 A; Y  c  v0 U( ^
6 [7 F7 U- R% ]3 Q; R9 H# u) G9 [3.   ip_hash策略
9 h$ c- c' f1 G5 I/ f1 a1 B  f  u(根据用户的IP地址进行hash运算,只要是同个用户发的请求,就会被永远地转发在某台服务器上,比如张三发的请求第一次时是由Tomcat1返回的,李四的是有Tomcat2返回的,那么,以后张三的所有请求,都有由Tomcat1返回,这就是ip_hash策略),配置如下:
$ K7 K6 }: y1 z% n4 e$ u 其他地方保持不变,在upstreaem中如下设置:) S5 B& ~8 w& ?; e$ Y

8 S( d& T2 D( O- @4 T7 N7 W- ]/ c/ G" Z- Q

$ W: h' k3 O  A+ I4 _& t
$ f# M, s. V/ A7 z! C. p, c  q) o4.   fair策略
6 X2 y3 x1 M1 H7 E(动态weight策略,我们的加权轮询是显式指定weight的,而fair策略是根据服务器的响应能力进行动态指定的,而意义上讲,我觉得是更为智能化的解决方法,不过这里要记住一点,fair策略是一个第三方策略)8 t: T9 Y9 r8 x5 l+ M  f& f
5.   url_hash策略
2 B' Y/ a& p& F+ `8 M* o6 a, y; F9 i- |0 W" q% E% C
(类似于ip,只不过绑定的值是url,这个也是第三方策略)3 T# e$ ]6 p) R
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重新编译源文件即可
& ^) x* y4 j$ {8 T, A& {3 `. P" W& u( I
4 l! N3 R2 J4 p" ~, U; [
7 `" S6 G8 S' Y4 Y4 t3 }/ L$ H6 S
url_hash策略的用处?
5 q4 Z: T& {0 N. u/ B# q) p; {; t* A( m
url_hash策略比较适合于大型电子商务网站,对于不同的商品便是不同的url,我们可以据此进行负载均衡。
$ ?! C! |! \8 F+ Z# N+ `1 @8 ~7 W5 ?# a
原理就是不同的商品形成不同的静态页面,然后服务器根据不同商品的火爆程度,按照命中率高的放在缓存里,加快访问速度,也就是说实现了一个基于缓存的服务器,相当于把有限的缓存最优化起来;! H% m5 v" d6 @1 n
  S2 i/ \0 D+ U. a8 D6 M9 J/ Q
; i, j" }9 M  g) n6 O
( L0 h3 z' K5 G! c9 s/ g
其他的配置
9 ], [  a; [+ \' }+ e$ [, C0 H! E5 U备份与停机状态:  a! A( E+ L! b8 y
server 192.168.1.64 backup;//备份,不参与转发,只有当所有服务器都挂掉时才参与转发;4 I' |/ C5 @0 D: ^
9 g3 g. I* r& ~5 ]  I
server 192.168.1.65 down;//临时停机维护,不参与任何转发,是关闭状态,
0 a3 @& H  j, P5 D- k4 ~" I) g2 r( j: E* i5 x, ]6 i4 O' H1 ]
down存在的意义在于,有时我们需要对服务器做临时停机更新维护,假如我们直接关闭服务器的话,那么对于Nginx来说,他还是会把请求发到该服务器上的,因为他并不知道服务器已关,而设置down后,Nginx则不会再发到该服务器上了,避免造成无用的请求浪费。
4 H) @" w5 T% T" Y% x
% ~2 q( `6 A9 a" i4 x1 V; C" i# u6 l( \: G% ^; b/ k& f3 K1 G/ ]) v) z1 Z

! Z. o/ q- X1 \7 G" S1 {# tmax_fails:        达到指定次数后认为服务器挂掉
9 J+ o7 v5 a) n
, `3 T; C" r. e  b6 _0 [ fail_timeout:挂掉多久后再次测试是否已经挂掉9 N1 ?) N; F$ j" R6 Y& X
! W- e& s7 b8 e" K5 A- {
配置命令
# \  f! X+ Z5 l* ^6 p; _  o5 C, C( X& M7 R" g. U
server 192.168.1.66 max_fails=2 fail_timeout=60s;, |3 J: i/ d4 U" B' O" ]

' n) N4 a1 k4 g% X3 J+ U 后记
# o/ ]# K- y) |% F0 ~我们知道,服务器是会存储用户的session的,那么,如果按照上文所说的,比如fair策略,每次Nginx会根据后端服务器群的能力把请求分发出去,那假如第一次时分在了A,那么我把数据存储到了A服务器上,第二次时,刚好被分配到了B服务器上,那么问题来了,我的session不就不见了?(这就是我们在访问部分网站时有时我们的登录状态会不见)当然了,你可能 会说,ip_hash策略不就可以避免这一点吗?没错,这确实是一个解决方法,那除了ip_hash呢?其他策略下又当如何呢?下篇博客将会讲到负载均衡下如何对session进行处理。' ]; z5 Y3 [3 T9 s; w

) s4 w* W4 t7 c) b* K. h3 ~0 w" `6 u" }8 @
# v7 B7 p4 U" D
+ d  _; F# ^! q8 n% R& \' v

0 c4 D, u4 G6 m2 F) J; p6 B
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-5 01:11 , Processed in 0.055044 second(s), 23 queries .

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