如上所示,如果其中一个分类在60S内的请求过多,则可以通过以下改进来平滑请求。
- local consistent_key = args.cat
- if not consistent_key or consistent_key == '' then
- consistent_key = ngx_var.request_uri
- end
- -- 大于5000时,生成新key
- local value = balancing_cache:get(consistent_key)
- if value > 5000 then
- consistent_key = consistent_key .. '_' .. value
- end
- if not value then
- success, err = balancing_cache:set(consistent_key, 1, 60)
- else
- newval, err = balancing_cache:incr(consistent_key, 1)
- end
least_conn:将请求负载均衡到最小活跃连接的上游服务器。如果配置的服务器较少,则转为基于权重轮询的算法。
除了上面的负载均衡策略,商业版的Nginx还提供了least_time,就是基于最小平均响应时间进行负载均衡。
失败重试
失败重试主要包含两部分配置:upstream server和proxy_pass。
- upstream backend {
- server 192.168.0.1:8080 max_fails=2 fail_timeout=10s weight=1;
- server 192.168.0.2:8080 max_fails=2 fail_timeout=10s weight=1;
- }
通过配置上游服务器的max_fails和fail_timeout,来指定每个上游服务器,当fail_timeout时间内失败了max_fails次请求,则认为该上游服务器不可用。然后剔除该服务器,fail_timeout时间后会再次将该服务器加入到存活列表中进行重试。
- location /test {
- proxy_connect_timeout 5s;
- proxy_read_timeout 5s;
- proxy_send_timeout 5s;
- proxy_next_upstream error timeout;
- proxy_next_upstream_timeout 10s;
- proxy_next_upstream_tries 2;
- proxy_pass http://backend;
- add_header upstream_addr $upstream_addr;
- }
上述参数详情请参见:《分布式系统超时重试》
健康检查
Nginx对上游服务器的健康检查采用的是惰性策略。(Nginx商业版提供了health_check的主动检查)社区版的Nginx可以集成nginx_upstream_check_module进行主动健康检查。配置如下:
TCP 心跳检查
- upstream backend {
- server 192.168.0.1:8080 weight=1;
- server 192.168.0.2:8080 weight=2;
- check interval=3000 rise=1 fall=3 timeout=2000 type=tcp;
- }
- interval:检测间隔时间,此处配置了每隔3s检测一次。
- fall:检测失败多少次后,上游服务器被标识为不存活。
- rise:检测成功多少次后,上游服务器被标识为存活,并可以处理请求。
- timeout:检测请求超时时间配置。
HTTP心跳检查
- upstream backend {
- server 192.168.0.1:8080 weight=1;
- server 192.168.0.2:8080 weight=2;
- check interval=3000 rise=1 fall=3 timeout=2000 type=http;
- check_http_send "HEAD /status HTTP/1.0rnrn";
- check_http_expect_alive http_2xx http_3xx;
- }
HTTP心跳配置比TCP额外多了2个配置:
- check_http_send:健康检查时所发送的请求内容。
- check_http_expect_alive:当上游服务器返回匹配的状态码,就认为上游服务器存活。
这里面需要注意的是,健康检查的时间间隔不宜过短。否则有可能会造成拥堵,更甚至造成上游服务器挂掉。
长连接配置
可以使用 keepalive 指令配置Nginx与上游服务器可缓存的空闲连接的最大数量。当超出数量时,最近最少使用的连接将被关闭。keepalive指令不限制Worker进程与上游服务器的总连接数。
- upstream backend {
- server 192.168.0.1:8080 weight=1;
- server 192.168.0.2:8080 weight=2 backup;
- keepalive 100;
- }
要想与上游服务器建立长连接,还需要如下配置:
- location / {
- # 支持 keep-alive
- proxy_http_version 1.1;
- proxy_set_header Connection "";
- proxy_pass http://backend;
- }
总长连接数=空闲连接池+释放连接池。首先,长连接配置不会限制Worker进程可以打开的总连接数(超出的作为短连接)。连接池需要根据不同的场景进行设置。
空闲连接池太小,连接不够用,就需要不断的重新建立连接;如果太大,就会造成还没用就超时了。
其他配置 (编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|