nginx+fpm+upstream调优

最近发现服务器经常出现502的问题,但是并发量并没有达到那么高(fpm设置了500个进程)。看了一下nginx的配置

upstream fastcgi_backend {
    server 127.0.0.1:9000;
    server 127.0.0.2:9000;
    server 127.0.0.3:9000;
    server 127.0.0.4:9000;
}

4个IP的问题,问了运维,说是为了增加可以支撑连接数,但实际上这四个IP都是本地的fpm(我感觉这波优化没什么卵用)fpm总共500个,端口也能即时回收,所以应该也不是端口沾满的问题。

后来看日志,发现有一些timeout的请求,而且每一波502的请求附近都会有一些504,但是504也不算太多,不会将所有的fpm进程都占满。

看了nginx的文档后发现如果一个server无法处理响应了,会使用其它的server重试,并且多次无法处理响应(默认1次),nginx会临时将这个节点摘掉(默认10秒)。而fpm超时就被nginx认为是无法处理响应了,这时理论上会重试4次(相当于放大了问题)。

这就意味着如果10秒内有4个请求造成了fpm超时就会造成500个fpm进程都被认为是不可用。

优化程序是一种方案(正常来说不应该这么慢)。另外也可以优化一下nginx的配置

upstream fastcgi_backend {
    server 127.0.0.1:9000 max_fails=0 fail_timeout=0;
}

鉴于我对4个IP的不认同,我将IP改回了一个。并且设置mx_fails=0即无论fpm是否可用都将请求转发至fpm,我觉得这样也没什么问题,如果fpm真的挂了,nginx应该也能处理。fail_timeout是一个无关紧要的参数,即如果服务挂了临时摘掉多少秒,因为mx_fails=0,所以这个参数设不设都可以。

最后/usr/local/openresty/nginx/sbin/nginx -t校验,/usr/local/openresty/nginx/sbin/nginx -s reload重新加载配置,问题解决。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注