PHP-FPM은 "pm.max_children"을 트리거하지만 복구하지 않습니다.

PHP-FPM은 "pm.max_children"을 트리거하지만 복구하지 않습니다.

10~100개의 HTTP GET 요청을 비동기로 수행하는 일부 JQuery(예, 아주 오래된 프로젝트)를 사용하는 시나리오가 있습니다. 그냥 실행하고 브라우저가 병렬로 수행되는 작업 수를 처리하도록 합니다. 공연은 상관없어요, 통화가 빨라요.

그러나 몇 개의 호출만 완료되고 나머지는 약 1분 후에 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 및 기타 몇 가지 . 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;
      }

내 자바스크립트 코드는 매우 간단합니다.

        $(".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개의 성공이 표시됩니다(응답이 "test"인 HTTP 200). 다른 모든 항목은 보류 중이며 1분 후에 nginx에서 HTTP 504를 받습니다. 10분을 기다렸는데 그 시간이 지나도 여전히 아무것도 할 수 없습니다. 페이지를 로드하거나 새로 고치면 1분 후에 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은 계속 작동할까요? 아니면 이것이 어떻게 든 예상됩니까?

관련 정보