
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 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;
}
내 자바스크립트 코드는 매우 간단합니다.
$(".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은 계속 작동할까요? 아니면 이것이 어떻게 든 예상됩니까?