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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

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

反向代理:

如下图所示,

2 R: y3 g: z& \& a. r0 D. t

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

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

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

/ F# d2 D& @% v, \8 p6 T
从图中,我们可以知道,对于浏览器来说,他会发一个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的这么一个过程便称为反向代理。' I0 v8 V5 z+ o9 h& T# s
/ X, E/ ?" [; {& l' @8 w
那么,Nginx服务器是如何实现这一步的呢,事实上也很简单,只需要在location中做一下简单的配置即可,命令大概如下图所示:(配置完命令记得reload重新加载才能生效)
* X0 A: e- R9 E; R, O: F) \! \* T* Z7 M0 a% W

6 E& e- G( r7 Q: ^9 P
  1. worker_processes 1;& V9 E" L2 w' B$ h7 ^
  2. events{
复制代码
7 m: D5 J# R- e6 Y9 x7 p

! p" t0 X# i# Q0 v) H6 d" @重点在于location处,这样的配置代表的是,所有来自浏览器的请求,在Nginx收到之后,都会代理到http://192.168.1.62:8080所在的地方/ K, L& Q4 \! i
; H8 f# N5 H7 P! ?$ R4 m5 h
比如,我浏览器上发起http://192.168.1.61/a/index.html;Nginx收到之后,将会发出http:// 192.168.1.62:8080/a/index.html这么一个请求到所连接的服务器上,如上图的Tomcat。* r6 [* R7 k9 w6 @5 K! J1 ]
4 _1 V' O4 J2 p# e* g

+ a* I& h. `$ z接下来我们做这样一个假设,假如后端连接着几台。几十台服务器呢,这个时候Nginx也是做同样的代理吗,答案是肯定的。图示如下:那么,在这么多台服务器上,Nginx的转发又是基于怎样的策略呢?这个时候就涉及在负载均衡了,说白了就是,应该怎样的分发,才能做到资源的最大限度的利用?/ ~/ s, c1 L& t  ?6 i2 ~* k

& w3 @% H+ j  p6 V" x5 B4 p( e4 s$ A# o' K# C$ O2 z: P

9 v9 _( d% v  N3 \( z
% M) C8 |, `8 |% {% _) z! _/ L负载均衡策略

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

http:// 192.168.1.62:8080

http:// 192.168.1.63:8080

http:// 192.168.1.64:8080

1.   平均轮询

配置如下图:

/ ~3 I/ ]0 c% _' _. n. }  H. g
, O( n/ {9 A, c6 f( y

) [3 `# O' O- K

这里我们把后台所有的服务器放入upstream中,并在代理中进行引用。! c+ }  F0 ]! V: w# `* p

2.   加权轮询,使用weight参数设置,配置如下
: H, O$ h' w. t( j1 A & R3 |- [; x2 J9 s; g7 A+ D
3.   ip_hash策略
7 E0 b1 ~. p- a8 l5 K(根据用户的IP地址进行hash运算,只要是同个用户发的请求,就会被永远地转发在某台服务器上,比如张三发的请求第一次时是由Tomcat1返回的,李四的是有Tomcat2返回的,那么,以后张三的所有请求,都有由Tomcat1返回,这就是ip_hash策略),配置如下:
* Y; p' A* W+ v1 x 其他地方保持不变,在upstreaem中如下设置:; _3 ]1 @! q. a2 ?8 B- o3 j

. g" v* J; q. P8 a, L( V+ b7 E5 U  n. s1 H# r

" E' K, x' \& F2 J
5 X6 Y, _, t2 k. c4.   fair策略( g/ l5 |4 e$ b; N( V2 f3 v
(动态weight策略,我们的加权轮询是显式指定weight的,而fair策略是根据服务器的响应能力进行动态指定的,而意义上讲,我觉得是更为智能化的解决方法,不过这里要记住一点,fair策略是一个第三方策略)
" g+ ~" \, e. z4 D( Y2 j3 W' @) z" w5.   url_hash策略0 z: g" r; q% h5 r! P0 P
- S& |+ j, o  Z* d' v
(类似于ip,只不过绑定的值是url,这个也是第三方策略)" e* D8 E$ p( R, l- u9 F3 ?' G
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重新编译源文件即可
3 Z( o: d$ S; x( R5 Y" r% i# J: J& i) `1 }. K5 j
9 u8 ], C6 [0 @8 Z4 s' k
+ x' P7 P: L$ i. D7 D$ V
url_hash策略的用处?
5 q/ f6 e) H) h) u* a. `: P+ k& a- T+ A* T+ }
url_hash策略比较适合于大型电子商务网站,对于不同的商品便是不同的url,我们可以据此进行负载均衡。" Q! p/ G* W" A+ e" Y

1 {: ?2 ^0 K0 K1 s  D# l原理就是不同的商品形成不同的静态页面,然后服务器根据不同商品的火爆程度,按照命中率高的放在缓存里,加快访问速度,也就是说实现了一个基于缓存的服务器,相当于把有限的缓存最优化起来;$ a4 z, w; M+ A8 k) `

, [: f$ ]3 K6 e" p' ?* W# ?; x- T; q) ^' e0 a
6 H9 I- t  l9 i
其他的配置
% D% D6 e. O; }% L8 H备份与停机状态:! A* [; I" \9 ?/ f; T* n9 V
server 192.168.1.64 backup;//备份,不参与转发,只有当所有服务器都挂掉时才参与转发;
8 q8 e3 t: }, Q) i6 F6 N" Q- o# l
server 192.168.1.65 down;//临时停机维护,不参与任何转发,是关闭状态,
1 v+ c1 I1 V: a0 z" j6 K. }  G( V9 {: z1 |5 x4 O
down存在的意义在于,有时我们需要对服务器做临时停机更新维护,假如我们直接关闭服务器的话,那么对于Nginx来说,他还是会把请求发到该服务器上的,因为他并不知道服务器已关,而设置down后,Nginx则不会再发到该服务器上了,避免造成无用的请求浪费。
/ q  {  R) m2 Z8 U7 e+ }! k/ [( k4 W- d5 r9 X' w2 V' u

, x  j4 z* Z5 V# l% l/ `+ d& I2 O& Z) W7 {3 i2 y" u1 e  |
max_fails:        达到指定次数后认为服务器挂掉# u) \6 e4 Y) W+ Z/ v

! p" J+ l7 O4 N fail_timeout:挂掉多久后再次测试是否已经挂掉/ s3 q: t: z: F( U$ d' y
, `3 H5 w* V4 }  A/ B2 Q' P6 E
配置命令
) u5 H* _1 G/ P3 B, r" k1 V7 p3 g- z. Z* p. F0 i3 J
server 192.168.1.66 max_fails=2 fail_timeout=60s;) Q" O9 ^8 L3 Z! u0 H4 z
& h( }6 I- H3 ]# W
后记
5 i  i! [7 ~2 G8 W" ?+ x( V我们知道,服务器是会存储用户的session的,那么,如果按照上文所说的,比如fair策略,每次Nginx会根据后端服务器群的能力把请求分发出去,那假如第一次时分在了A,那么我把数据存储到了A服务器上,第二次时,刚好被分配到了B服务器上,那么问题来了,我的session不就不见了?(这就是我们在访问部分网站时有时我们的登录状态会不见)当然了,你可能 会说,ip_hash策略不就可以避免这一点吗?没错,这确实是一个解决方法,那除了ip_hash呢?其他策略下又当如何呢?下篇博客将会讲到负载均衡下如何对session进行处理。5 W7 ~( N- z2 G1 \; Q
  j  O$ M- S7 W+ i

; B" O% K8 D* x5 O3 {
3 I! F) X5 _- j
4 c+ |5 w5 U+ Y0 t. h) `: }8 y
! U8 q; e& |( v) E9 j/ [; P& X; k% P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 11:35 , Processed in 0.068551 second(s), 22 queries .

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