PHP-FPM 觸發「pm.max_children」但永遠不會恢復

PHP-FPM 觸發「pm.max_children」但永遠不會恢復

我有一個場景,我使用一些 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 awww.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 應該仍然可以工作嗎?還是這是某種預期的?

相關內容