介绍
早期的网站流量和业务功能都比较简单,单台服务器就可以满足基本需求,但是随着互联网的发展,业务流量越来越大并且业务逻辑也越来越复杂,单台服务器的性能及单点故障问题就凸显出来了,因此需要多台服务器组成应用集群,进行性能的水平扩展以及避免单点故障出现。
根据上图,将会使用Nginx来实现负载均衡,而Nginx的负载均衡是基于反向代理的,只不过此时所代理的服务器不是一台,而是多台。
接下来跟大家分享一下关于Nginx负载均衡的配置
轮询
Nginx将所有请求均匀的分给集群中的每台服务器。
bash
upstream web_app {
server 192.168.10.2:7001;
server 192.168.10.3:7001;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://web_app/;
}
}
upstream:定义一个服务集群。upstream定义服务集群时,配置的服务地址只能是 域名+端口 或者 ip+端口,不能带有协议和路径,否则nginx会报 invalid host in upstream这个错误信息。
proxy_pass: 将匹配的请求代理转发到proxy_pass后面配置的服务上,这里因为需要配置负载均衡,所以这里http://后面必须要跟上upstream定义的服务集群。
权重(weight)
bash
upstream test {
server 192.168.10.2:7001 weight=2;
server 192.168.10.3:7001 weight=1;
}
前面两次请求都会转发到192.168.10.2:7001,后面一次请求会转发到192.168.10.3:7001
如果继续请求,依然是前面两次转发到192.168.10.2:7001,后面一次转发到192.168.10.3:7001
ip_hash
根据用户的ip,计算出一个hash值,如果负载均衡缓存中有这个hash对应的服务器,则直接转发到对应的服务器上。
bash
upstream test {
ip_hash;
server 192.168.10.2:7001;
server 192.168.10.3:7001;
}
使用ip_hash策略后,只要用户的电脑ip不发生变化,就会始终请求同一台服务器。
hash
根据请求的uri计算出一个hash值,然后将该请求转发到一台服务器上面,后续请求通过hash计算后,如果有相同的hash,那么就会将该请求转发到该hash对应的服务器上面。
可以进行hash计算的有remote_addr(客户端ip)、request_uri(请求uri)、args(请求参数)。
bash
upstream test {
hash $request_uri;
server 192.168.10.2:7001;
server 192.168.10.3:7001;
}
另外:
如果 request1 命中了 192.168.10.2 服务器,如果 192.168.10.2 服务器宕机,之前通过 request1 计算出来的哈希值与 192.168.10.2 服务器的对应关系会失效,并且 request1 会重新分发给 192.168.10.3 服务器。后续 192.168.10.2 服务器恢复正常后,request1 还是会分配给 192.168.10.3 服务器。
least_conn
把请求转发给连接数较少的服务器。轮询算法是把请求平均地转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。此负载均衡适合请求处理时间长短不一造成服务器过载的情况。
bash
upstream test {
least_conn;
server 192.168.10.2:7001;
server 192.168.10.3:7001;
}
max_fails
允许服务处理请求时服务出错的次数,默认为1。当服务处理请求发生错误的次数超过max_fails时,后面的请求暂时不会转发到这台发生错误的服务器。
bash
upstream test {
server 192.168.10.2:7001 max_fail=100;
server 192.168.10.3:7001;
}
此时,如果192.168.10.2这台服务器在处理请求时,出现了100次错误,那么后续所有的请求都会被转发到192.168.10.3这台服务器上面。
fail_timeout
如果某个服务处理请求时发生错误的次数超过 max_fails,nginx 将暂时禁止将请求转发到该服务。当达到fail_timeout设置的时间后,nginx会尝试将请求转发到刚才被禁止的服务,如果服务正常,那么后续的请求可以继续转发到这台服务,如果服务错误,那么继续等待fail_timeout时间后再来检测。fail_timeout默认时间是10s。
bash
upstream test {
server 192.168.10.2:7001 max_fail=100 fail_timeout=30s;
server 192.168.10.3:7001;
}
此时,如果192.168.10.2这台服务器在处理请求时,出现了100次错误,那么后续所有的请求都会被转发到192.168.10.3这台服务器上面,当30秒以后,会重新将请求转发到192.168.10.2这台服务器上面,如果192.168.10.2这台服务器处理请求时依然达到了100次错误,将继续被禁止30秒。
down
标识down的服务器暂时不支持被请求。
bash
upstream test {
server 192.168.10.2:7001 down;
server 192.168.10.3:7001;
}
此时,所有请求都会被转发到192.168.10.3这台服务器上面。
backup
备用服务器,当所有非backup服务发生错误被停用或者设置为down时,nginx会启用标识为backup的服务器。
bash
upstream test {
server 192.168.10.2:7001 backup;
server 192.168.10.3:7001;
}
max_conns
单一服务器同时处理请求的个数。
bash
upstream test {
server 192.168.10.2:7001 max_conns=50000;
server 192.168.10.3:7001;
}