我有一个设置,包括一个负载均衡器、两个运行 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 查询花费的时间过长,从而发生超时。