service
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除 配置如下:
upstream iistest {
server 192.168.1.88:8081;
server 192.168.1.88:8082;
server 192.168.1.88:8083;
}
weight(权重)
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream iistest {
server 192.168.1.88:8081 weight=1;
server 192.168.1.88:8082 weight=4;
server 192.168.1.88:8083 weight=5;
}
max_conns
可以根据服务的好坏来设置最大连接数,防止挂掉,比如1000,我们可以设置800
upstream iistest {
server 192.168.1.88:8081 weight=5 max_conns=800;
server 192.168.1.88:8082 weight=1;
}
max_fails、 fail_timeout
max_fails:失败多少次 认为主机已挂掉则,踢出,公司资源少的话一般设置2~3次,多的话设置1次
max_fails=3 fail_timeout=30s代表在30秒内请求某一应用失败3次,认为该应用宕机,后等待30秒,这期间内不会再把新请求发送到宕机应用,而是直接发到正常的那一台,时间到后再有请求进来继续尝试连接宕机应用且仅尝试1次,如果还是失败,则继续等待30秒...以此循环,直到恢复。
upstream iistest {
server 192.168.1.88:8081 weight=1 max_fails=1 fail_timeout=20;
server 192.168.1.88:8082 weight=2;
}
//关闭掉8081的服务 你会发现在20秒内还是访问8082的,20s后才会访问8081
记得修改完nginx.conf 后,./sbin/nginx -s reload 重启nginx ,然后我们可以让8081关闭来演示
调度算法一般分为两类:
第一类为静态调度算法,即负载均衡器根据自身设定的规则进行分配,不需要考虑后端节点服务器的情。例如:rr、wrr、ip_hash等都属于静态调度算法。
第二类为动态调度算法,即负载均衡器会根据后端节点的当前状态来决定是否分发请求,例如:连接数少的有限获得请求,响应时间短的优先获得请求。例如:least_conn、fair 等都属于动态调度算法。
常见的调度算法:
1)rr 轮循 (round robin 默认调度算法,静态调度算法)
按客户端请求顺序把客户端的请求逐一分配到不同的后端节点服务器,这相当于 LVS 中的 rr 算法,如果后端节点服务器宕机(默认情况下nginx 只检测80端口)。宕机的服务器会自动从节点服务器池中剔除,以便客户端的用户访问不受影响。新的请求会分配给正产的服务器。
upstream iistest {
server 192.168.1.88:8081;
server 192.168.1.88:8082;
server 192.168.1.88:8083;
}
2)wrr (weight 权重轮循,静态调度算法)
在 rr 轮循算法的基础上加上权重,即为权重轮循算法,当使用该算法时,权重和用户访问成正比,权重值越大,被转发的请求也就越多。可以根据服务器的配置和性能指定权重值大小,有效解决新旧服务器性能不均带来的请求分配问题。
upstream iistest {
server 192.168.1.88:8081 weight=1;
server 192.168.1.88:8082 weight=2;
server 192.168.1.88:8083 weight=3;
}
3)ip_hash(静态调度算法)
每个请求按客户端 IP 的 hash 结果分配,当新的请求到达时,先将其客户端IP通过哈希算法哈希出一个值,在随后的客户端请求中,客户 IP 的哈希值只要相同,就会被分配至同一台服务器,该调度算法可以解决动态网页的 session 共享问题,但有时会导致请求分配不均,即无法保证 1:1 的负载均衡,因为在国内大多数公司都是 NAT 上网模式,多个客户端会对应一个外部 IP,所以,这些客户端都会被分配到同一节点服务器,从而导致请求分配不均。LVS 负载均衡的 -P 参数、keepalived 配置里的 persistence_timeout 50 参数都类似这个 Nginx 里的 ip_hash 参数,其功能均为解决动态网页的 session 共享问题。注意:当负载调度算法为 ip_hash时,后端服务器在负载均衡调度中的状态不能有 weight 和 backup ,即使有也不会生效。
upstream iistest {
ip_hash;
server 192.168.1.88:8081;
server 192.168.1.88:8082;
server 192.168.1.88:8083;
}
4)fair(动态调度算法)
fair 调度算法会根据后端节点服务器的响应时间来分配请求,响应时间端的优先分配。这是更加智能的调度算法。此种算法可以依据页面大小和加载时间长短只能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx 本身是不支持 fair 调度算法的,如果需要使用这种调度算法,必须下载 Nginx 的相关模块 upstream_fair。
upstream iistest {
fair;
server 192.168.1.88:8081;
server 192.168.1.88:8082;
server 192.168.1.88:8083;
}
5)least_conn (动态调度算法)
least_conn 调度算法会根据后端节点的连接数来决定分配情况,哪个机器连接数少就分发。
upstream iistest {
least_conn;
server 192.168.1.88:8081;
server 192.168.1.88:8082;
server 192.168.1.88:8083;
}
6)url_hash 算法
url_hash 按访问 URL 的 hash 结果来分配请求,使每个 URL 定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率命中率。(多用于后端服务器为缓存时的场景下)Nginx 本身是不支持 rul_hash的,如果需要使用这种调度算法,必须安装 Nginx 的hash 模块软件包。
upstream iistest {
server 192.168.1.88:8081;
server 192.168.1.88:8082;
server 192.168.1.88:8083;
hash $request_uri;
hash_method crc32;
}
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream iistest {
server 192.168.1.88:8081;
server 192.168.1.88:8082;
server 192.168.1.88:8083;
server 192.168.1.88:8084 backup;
server 192.168.1.88:8085 down;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://iistest;
proxy_set_header Host $host;
proxy_set_header X-Forward-For $remote_addr;
}
}
}