我有一个场景,我使用一些 JQuery(是的,一个非常古老的项目),它异步执行 10~100 个 HTTP GET 请求。我只是触发它们,让浏览器处理有多少个正在并行执行。我不关心性能,调用很快。
但是只有少数调用会完成,其余调用会在大约一分钟后从 Nginx 收到 504 网关超时错误。此后“什么”都不起作用(所有调用都会超时)。
php-fpm 日志包含:
2023-09-20T14:42:16.773528255Z [20-Sep-2023 14:42:16] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it
当然,默认情况下是 5(本地开发)。当然我可以将其更改为 100 或 1000,但我真的不想这样。我希望请求要么等待,要么终止,要么超时,但不要“崩溃”php-fpm。
对于 php-fpm,我们使用 docker 。我们确实为池php:php-8.1-fpm-alpine
安装了一些扩展(amqp、gd、imagick、memcached、opcache、xdebug 和其他一些www.conf 文件)(因此这也只是默认设置)。. If needed I can retry/rewrite things to be able to test this in a "clean" environment. The PHP config is the default one. I do NOT have a
docker-compose.yaml
phpfpm:
image: our-own-registry
ports:
- 9000
environment:
xx: xx
volumes:
- .:/opt/project
- ./cachegrinds/:/tmp/cachegrinds
nginx:
image: our-own-registry
volumes:
- ./config/docker-nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf
- ./css:/opt/project/css
- ./js:/opt/project/js
- ./images:/opt/project/images
- ./font:/opt/project/font
ports:
- 8880:80
- 8443:443
links:
- phpfpm
Nginx 配置的总体思路(如果需要我可以全部发布)
server {
listen *:80;
listen [::]:80;
listen *:443 ssl http2;
listen [::]:443 ssl http2;
server_name xx;
root /opt/project;
location /
{
client_max_body_size 10M;
rewrite .* /dispatch.php break;
include fastcgi_params;
fastcgi_pass phpfpm:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
我的 javascript 代码非常简单:
$(".remove-checkbox:checkbox:checked").each(function () {
$.get("file.php?action=xx, function () {
console.log("ok");
}).fail(function () {
console.log("fail");
})
});
第一个可能的入口点(在我们的例子中:)dispatch.php
位于第 1 行,die("test")
因此没有执行任何实际代码。
因此:我单击按钮,然后发出 100 个 http 请求(在本例中为 100 个复选框)。我在浏览器中看到 2~4 个请求成功(HTTP 200,回复为“测试”)。所有其他请求都处于待处理状态,一分钟后从 nginx 收到 HTTP 504。我等了 10 分钟,但即使过了那段时间,我仍然无法做其他任何事情。一分钟后,任何页面加载/刷新都会导致 504。
我需要重新启动我的 php-fpm 才能使其再次工作。
供参考(问题发生后):
/var/www/html # ps auxf
PID USER TIME COMMAND
1 root 0:00 php-fpm: master process (/usr/local/etc/php-fpm.conf)
6 www-data 0:00 php-fpm: pool www
7 www-data 0:00 php-fpm: pool www
8 www-data 0:00 php-fpm: pool www
9 www-data 0:00 php-fpm: pool www
10 www-data 0:00 php-fpm: pool www
11 root 0:00 /bin/sh
17 root 0:00 ps auxf
所以我的问题是:结果是否不应该是“缓慢”但完成,或者终止/超时?但这样 php-fpm 应该仍然可以工作?或者这是预料之中的?