我有一个带有 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.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;
}
...
问题是 pm.max_children 太低(也许 200 更好)。还建议我将 pm 更改为按需而不是动态。并将 pm.process_idle_timeout 设置为 1s,以便将它们循环出来。
问题是 ajax 请求占用了 5 个可用的工作人员,因此后续请求无法到达任何地方。