
我有一個場景,我使用一些 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 個(本地開發)。 Ofc 我可以將其更改為 100 或 1000,但我真的不想要那樣。我希望請求等待或終止或超時,但不要“崩潰”php-fpm。
對於 php-fpm,我們使用 docker php:php-8.1-fpm-alpine
。我們確實為池安裝了一些擴充功能(amqp、gd、imagick、memcached、opcache、xdebug 和其他一些. 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
www.conf` 檔案(因此這也是預設的)。
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 行 a die("test")
,因此不會執行任何實際程式碼。
所以:我點擊按鈕,觸發 100 個 http 請求(在本例中為 100 個複選框)。我在瀏覽器中看到 2~4 成功(HTTP 200,回覆「test」)。所有其他人都陷入待處理狀態,一分鐘後從 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 應該仍然可以工作嗎?還是這是某種預期的?