Nginx/php-fpm 超时

Nginx/php-fpm 超时

我有一个设置,包括一个负载均衡器、两个运行 nginx/php-fpm7.1 的 Web 服务器和一个运行 mariadb 的数据库服务器。

在过去的几个月里,我一直在努力找出原因并解决不规则的超时问题,最后我在这里询问大家的想法。据我所知,在发生这种情况时,什么都没有改变。此外,我还看到 php-fpm 完全失败,不得不重新启动服务。

我看到如下错误,并且全天通过 xymon 接收警报:

2018/07/11 14:27:23 [error] 13461#13461: *920760 upstream timed out (110: Connection timed out) while reading response header from upstream, client: *.*.*.*, server: www.something.com, request: "GET /something/something HTTP/1.1", upstream: "fastcgi://unix:/run/php-fpm/something.com.sock", host: "www.something.com"

设置中托管了大约 5 个站点,其中只有一个通过负载均衡器运行,所有其他站点都指向 Web 服务器 1,因为我会收到针对所有站点的警报,而我只在 Web 服务器 1 上查看这些站点。

所有站点使用的通用 nginx 配置如下:

worker_processes        2;

user    nginx www-data;
pid     /run/nginx.pid;
worker_rlimit_nofile     100000;

events {
    worker_connections  1024;
    multi_accept        on;
    use                 epoll;
}

http {
    include             mime.types;
    default_type        application/octet-stream;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    keepalive_requests 200;
    client_max_body_size 16m;
    client_body_timeout 32;
    client_header_timeout 32;
    reset_timedout_connection   on;
    send_timeout   600;
    proxy_connect_timeout 600;
    proxy_send_timeout 600;
    proxy_read_timeout 600;

    fastcgi_buffers 8 128k;
    fastcgi_buffer_size 256k;

    open_file_cache max=10000 inactive=30s;
    open_file_cache_valid 60s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;

此外,我在每个虚拟主机中都有类似这样的位置

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/run/php-fpm/something.com.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_read_timeout 30s;
        include fastcgi_params;
    }

并且每个站点都有自己的 fpm 池,所有 fpm 池均有以下变化:

pm = ondemand
pm.max_children = 12
pm.start_servers = 4
pm.min_spare_servers = 4
pm.max_spare_servers = 8
pm.max_requests = 15000

通过负载均衡器运行的主站点对其池进行了以下 fpm 更改

pm = dynamic
pm.max_children = 100
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 8
pm.max_requests = 15000

我尝试过的所有方法都没有效果,包括更新所有 yum 软件包并重新启动。目前,这些机器上没有高负载,尽管这种情况可能发生。

关于如何进一步调试的任何想法或帮助都将非常有用!

更新

慢速日志确实会报告如下内容:

[11-Jul-2018 14:53:12] WARNING: [pool something.com] child 53001, script '/var/www/something.com/index.php' (request: "GET /index.php?q=/404.html&") executing too slow (11.267915 sec), logging

那么可能与玛丽亚服务器更相关吗?

答案1

随着时间的推移,最有可能发生变化的是网络服务器上的数据库大小。

这和可能低效的 SQL 语句/DB 结构可能会导致 DB 查询花费的时间过长,从而发生超时。

相关内容