我有一台装有 Nginx 和 PHP-FPM 的服务器,用于单个 Web 应用程序。一切正常,直到我发出一个页面请求,该请求耗时超过允许的 60 秒。然后 PHP 停止响应任何请求。
产生该问题的步骤如下:
1:我发出一个请求,php/mysql 需要超过 60 秒才能返回。此时一切仍可正常运行。所有其他流量仍可正常工作。
2:然后我在 UI 中发出另一个请求(更改页面)。
3:现在所有 PHP 流量都停止了 - PHP 不再提供内容,因此所有请求都会等待,直到达到超时并且 Nginx 返回“发生错误”。日志显示... upstream timed out (110: Connection timed out) while reading response header from upstream ...
。
Web 应用程序是 AngularJS,它向 PHP 发出 AJAX 请求。我正在 Chrome 中测试 UI,并使用 Safari 请求测试页面,因此 Chrome 并不是傻乎乎地等待请求。
重新启动 php-fpm 即可解决问题。我尝试设置紧急重置,但无效。日志文件 /var/log/php5-fpm.log 为空。
php-fpm.conf
[global]
pid = /var/run/php5-fpm.pid
error_log = /var/log/php5-fpm.log
include=/etc/php5/fpm/pool.d/*.conf
閣下網站
[www]
user = www-data
group = www-data
listen = /var/run/php5-fpm.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
chdir = /
catch_workers_output = yes
nginx 站点配置
...
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
...
答案1
问题是 pm.max_children 太低(也许 200 更好)。还建议我将 pm 改为 ondemand 而不是 dynamic。并将 pm.process_idle_timeout 设置为 1s,这样它就会循环它们。
问题是 ajax 请求占用了 5 个可用工作线程,因此后续请求无法到达任何地方。