Nginx负载均衡

���Ľ�������л�����Ķ�

正向代理

====

场景:在国内是无法正常使用google.com。如果想要访问google.com,可以购买一台国外的服务器A,此时你和服务器A的网络是相通的。而服务器A又跟google.com相通, 此时可以由服务器A代理你(客户端),去访问google.com。这个过程称之为正向代理,服务端(google.com)只需要知道代理服务器的ip,不需要知道客户端的ip。 结论:正向代理,是用于代理客户端的。

反向代理

====

场景:当一个服务器接受过多来自客户端的请求时,服务器难以处理和响应这些请求,会使得整个系统性能下降。为了解决这个难题,可以提供多台部署相同应用的服务器,让客户端的请求分别发送到不同的服务器上,这样单机服务器的压力就会降低很多,整体性能便会提升。但是有一个问题,每个服务器ip都是不同的,也就是说客户端的请求要发送到多个不同的ip上。让客户手动指定ip进行请求,这种方式很不明智。首先是客户的随机性,不知道会访问哪台服务器,其次,会造成一部分服务器压力大,一部分服务器几乎没有使用,浪费资源。因此,这里就需要一个角色去代理服务器,让客户端的请求直接发送到这个角色上,由这个角色去分发请求到不同的服务器上。 这个角色就是反向代理服务器。 结论:反向代理,是用于代理服务端的。

负载均衡

====

场景:反向代理过程中,每台服务器处理来自客户端的请求都应该是均衡的。 原理:使用一个反向代理服务器指向多台部署相同应用的服务器,客户端请求直接向反向代理服务器发起,反向代理服务器根据负载均衡机制,将请求转发到不同的应用服务器上。 负载均衡机制:

Nginx负载均衡方法

===========

Nginx负载均衡(工作在七层“应用层”)功能主要是通过upstream模块实现,Nginx负载均衡默认对后端服务器有健康检测的能力,仅限于端口检测,在后端服务器比较少的情况下负载均衡能力表现突出。 1、轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,则自动剔除故障机器,使用户访问不受影响。 2、weight 指定轮询权重,weight值越大,分配到的几率就越高,主要用于后端每台服务器性能不均衡的情况。 3、ip_hash 每个请求按访问IP的哈希结果分配,这样每个访客固定访问一个后端服务器,可以有效的解决动态网页存在的session共享问题。 4、fair(第三方) 更智能的一个负载均衡算法,此算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。如果想要使用此调度算法,需要Nginx的upstream_fair模块。 5、url_hash(第三方) 按访问URL的哈希结果来分配请求,使每个URL定向到同一台后端服务器,可以进一步提高后端缓存服务器的效率。如果想要使用此调度算法,需要Nginx的hash软件包。 在upstream模块中,可以通过server命令指定后端服务器的IP地址和端口,同时还可以设置每台后端服务器在负载均衡调度中的状态,常用的状态有以下几种: 1、down 表示当前server暂时不参与负载均衡。 2、backup 预留的备份机,当其他所有非backup机器出现故障或者繁忙的时候,才会请求backup机器,这台机器的访问压力最轻。 3、max_fails 允许请求的失败次数,默认为1,配合fail_timeout一起使用 4、fail_timeout 经历max_fails次失败后,暂停服务的时间,默认为10s(某个server连接失败了max_fails次,则nginx会认为该server不工作了。同时,在接下来的 fail_timeout时间内,nginx不再将请求分发给失效的server。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
http
{
upstream whsirserver
{
server 192.168.0.120:80 weight=5 max_fails=3 fail_timeout=20s;
server 192.168.0.121:80 weight=1 max_fails=3 fail_timeout=20s;
server 192.168.0.122:80 weight=3 max_fails=3 fail_timeout=20s;
server 192.168.0.123:80 weight=4 max_fails=3 fail_timeout=20s;
}
server
{
listen 80;
server_name blog.whsir.com;
index index.html index.htm;
root /data/www;
location /
{
proxy_pass http://whsirserver;
proxy_next_upstream http_500 http_502 error timeout invalid_header;
}
}
}

upstream负载均衡开始,通过upstream指定了一个负载均衡器的名称为whsirserver,这个名称可以自己定义,在后面proxy_pass直接调用即可。 proxy_next_upstream参数用来定义故障转移策略,当后端服务器节点返回500、502和执行超时等错误时,自动将请求转发到upstream负载均衡器中的另一台服务器,实现故障转移。 nginx提供了以下三种方法: 1)round-robin:请求以循环、轮转的方式分发到服务器 2)least-connected:下一个请求被分配到拥有最少活动连接数的服务器 3)ip-hash:使用一个哈希函数,基于客户端ip地址判断下一个请求应该被分发到哪台服务器

相关配置说明


1)循环、轮转负载均衡 round-robin:默认情况下,使用循环、轮转的方式分发请求到服务器。 当不指定负载均衡方式时,默认以round-robin方式实现。所有请求都会被代理到myapp服务器,根据负载均衡机制分发请求。 配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
http{
upstream myapp{
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
server{
listen 80;
location / {
proxy_pass http://myapp;
}
}
}

2)最少连接负载均衡 least-connected:当一些请求处理的时间比较长时,最少连接负载均衡能够争取到更大的公平。 配置示例:

1
2
3
4
5
6
upstream myapp{
least-conn;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}

3)基于ip地址的负载均衡 ip-hash:采用目标地址散列调度(Destination Hashing Scheduling)算法,根据请求的目标ip地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器可用且未超载,则将请求发送带服务器,否则返回空。

1
2
3
4
5
6
upstream myapp{
ip-hash;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}

1.单纯使用Nginx,会造成配置维护成本变高。 2.单点故障率增加,因为热点服务的访问量很高,如果这个服务的负载均衡服务出现问题,整个服务都会挂掉。

Nginx配置说明

=========

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#user  nobody;
worker_processes 4;
events {
# 最大并发数
worker_connections 1024;
}
http{
# 待选服务器列表
upstream myproject{
# ip_hash指令,将同一用户引入同一服务器。
ip_hash;
server 125.219.42.4 fail_timeout=60s;
server 172.31.2.183;
}

server{
# 监听端口
listen 80;
# 根目录下
location / {
# 选择哪个服务器列表
proxy_pass http://myproject;
}

}
}

0%