Nginx 负载均衡

Nginx 负载均衡详解

负载均衡简介

什么是负载均衡

负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

简单的来说。负载均衡可以减少服务器的压力,将原本一台服务器所要承受的访问量分给了多台,并提高了项目的可用性,当一台服务器挂掉的时候也不会导致整个项目瘫痪。

负载均衡的目的

负载均衡的目的是为了解决单个节点压力过大,造成Web服务响应过慢,严重的情况下导致服务瘫痪,无法正常提供服务,由于一个Web服务同时能处理的用户并发请求的数量有限,同时还有机器故障的情况,所以一个Web站点通常会在N台机器上各部署一套同样的程序。当某一个服务挂掉的时候,还有第二个、第三个、第N个服务。。。继续为用户提供服务,给用户的感觉,你的服务还在正常的运行!在这些提供同样服务的机器当中,在硬件配置方面也各不一样,这样就会存在部份机器性能非常好,能快速计算并响应用户的请求,另外一部份机器可能配置差点,响应用户的请求的时间会长一些。

这就需要我们思考一个问题?如果有一个服务正在同时处理1000个用户的请求,这个服务的上限可能最多能同时处理1000个用户的请求,这时它已经很忙了,如果此时又有一个新请求过来,我们仍然把这个请求分配给这台机器,这时候这个请求就只能在干等着,等这个服务处理完那些请求后,再继续处理它。这样在浏览器中的反应就像12306我们在春节买票一样,卡在那不动了,让用户眼巴巴的干着急。而能提供同样服务的其它机器,这时确很空闲。这样不仅是对服务器资源的浪费,也充分发挥不出弄多台服务器装同一个服务的最高价值。我们通常称对某一台机器的访问量称为负载量,如何将一个用户的请求,合理的分配到一台能快速响应用户请求的服务器上,我们就需要用到一些负载策略。也就体现出了文章主题的用意了:负载均衡,将用户的所有HTTP请求均衡的分配到每一台机器上,充分发挥所有机器的性能,提高服务的质量和用户体验。负载均衡可以通过负载均衡网络硬件设备和Web服务器软件来实现,前者设备成本较高,小公司通常负担不起,所以后者一般是我们的首选。实现负载均衡常用的Web服务器软件有Nginx、HAProxy、LVS等,本文主要介绍Nginx的负载均衡策略。

负载均衡的常用功能

客户端的请求转发功能:按照一定的算法【权重、轮询】,将客户端请求转发到不同应用服务器上,减轻单个服务器压力,提高系统并发量。

服务器的故障转移功能:通过心跳检测的方式,判断应用服务器当前是否可以正常工作,如果服务器宕掉,自动将请求发送到其他应用服务器。

服务器故障恢复自动添加功能:如检测到发生故障的应用服务器恢复工作,自动将其添加到处理用户请求队伍中。

Nginx内置三种负载策略

Nginx负载均衡是通过upstream模块来实现的,内置实现了三种负载策略;

配置负载均衡服务器集群:

upstream mysvr { 
      server 192.168.10.121:3333;
      server 192.168.10.122:3333;
 }
 server {
        ....
        location  ~*^.+$ {         
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表         
        }
 }

upstream:定义一个服务集群。
proxy_pass: 将匹配的请求代理转发到proxy_pass后面配置的服务上,这里因为需要配置负载均衡,所以这里http://后面必须要跟上upstream定义的服务集群。

注意:upstream定义服务集群时,配置的服务地址只能是域名+端口或者ip+端口,不能带有协议和路径,否则nginx会报nginx: [emerg] invalid host in upstream这个错误信息。

轮询(默认weight=1)

img

nginx默认就是轮询其权重都默认为1,nginx将所有请求均匀的分给集群中的每台服务器。服务器处理请求的顺序:ABABABABAB....

upstream test {
	server 127.0.0.1:7001; 		# 等同于server 127.0.0.1:7001 weight=1;
	server 150.109.118.85:7001; # 等同于server 150.109.118.85:7001 weight=1;
}

server {
	listen 8081;
	server_name localhost;

	location / {
		proxy_pass http://test/;
	}
}

权重轮询(weight)

通过配置权重,指定轮询几率,权重和访问比率成正比,用于应用服务器性能不均的情况。如果后端服务器down掉,能自动剔除。比如以下配置,下面服务器的请求顺序为:ABBABBABBABBABB....

upstream bakend {
    server 192.168.1.10 weight=1;
    server 192.168.1.11 weight=2;
}

ip_hash

img

每个请求按访问ip的hash结果分配,会让相同的客户端 ip 请求相同的服务器。可以解决session不能跨服务器的问题。如果后端服务器down掉,要手工down掉。

upstream mysvr { 
      server 127.0.0.1:7878; 
      server 192.168.10.121:3333;
      ip_hash;
    }

Nginx负载均衡相关参数

down

标识down的服务器暂时不支持资源请求。

upstream test {
	server 127.0.0.1:7001 down;
	server 150.109.118.85:7001;
}

上面负载均衡的例子中,因为127.0.0.1:7001标识为down,所以不会有请求转发到这个服务,所有的请求都会转发到150.109.118.85:7001这个服务。

weight

集群中服务的权重值,默认是1。在只有weight这一个影响条件下,且集群中服务都正常,nginx会将更多的请求转发到weight更大的服务。

upstream test {
	server 127.0.0.1:7001 weight=2;
	server 150.109.118.85:7001 weight=1;
}

这个集群中127服务和150服务各处理的请求比例为2:1。

max_fails

允许服务处理请求时服务出错的次数,默认为1。当服务处理请求发生错误的次数超过max_fails时,后面的请求暂时不会转发到这台发生错误的服务。

upstream test {
	server 127.0.0.1:7001 max_fail=1;
	server 150.109.118.85:7001;
}

fail_timeout

当服务处理请求发生错误的次数超过max_fails以后,nginx会暂时禁止将请求转发到这个服务。当过去fail_timeout设置的时间以后,nginx会尝试将请求转发到刚才被禁止的服务,如果服务正常,那么后续的请求可以继续转发到这台服务,如果服务错误,那么继续等待fail_timeout时间后再来检测。fail_timeout默认时间是10s。

upstream test {
	server 127.0.0.1:7001 max_fail=1 fail_timeout=10s;
	server 150.109.118.85:7001;
}

backup

备用服务器,当所有非backup服务发生错误被停用或者设置为down时,nginx会启用标识为backup的服务。

upstream test {
	server 127.0.0.1:7001 backup;
	server 150.109.118.85:7001;
}

max_conns

这个功能存在于nginx商业版。同一服务同时处理请求的个数。防止服务因处理请求过多,服务器性能不足,发生宕机的情况。

upstream test {
	server 127.0.0.1:7001 max_conns=10000;
	server 150.109.118.85:7001;
}

slow_start

这个功能存在于nginx商业版。当集群中错误服务等待fail_timeout时间后,nginx检测到这个服务能够正常使用后,再等待slow_start时间后,才正式使用这个服务。

upstream test {
	server 127.0.0.1:7001 slow_start=30s;
	server 150.109.118.85:7001;
}

总结

upstream backend {
  #down表示当前的服务器暂时不可用,不参与负载均衡
  server www.aaa.com down;
  #max_conns=100表示此服务器的最大连接数为100
  server www.bbb.com:1234 max_conns=100;
  #weight表示权重,权重越大,被分配到的次数就越多
  server www.ccc.com weight=3;
  #backup表示这是预留的备份服务器,只在其他的节点都不可用的时候才启用
  server www.ddd.com backup;
  #max_fails在连续超过3次失败后,30秒内不要再分发请求到此服务器,默认fail_timeout为10秒
  server x.x.x.x:8080 max_fails=3 fail_timeout=30s;
}

 server {
    listen 80; 
    location / {
    	# 表示将所有请求转发到tomcats服务器组中配置的某一台服务器上。
        proxy_pass http://tomcats;
     }
 }
}

参考

原文地址:https://www.cnblogs.com/hanlk/p/14219928.html