
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 など) と 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 行目 a があるdie("test")
ため、実際のコードは実行されません。
つまり、ボタンをクリックし、100 個の HTTP リクエスト (この場合は 100 個のチェックボックス) を発行します。ブラウザで、2 ~ 4 個が成功していることがわかります (応答として「テスト」を含む 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 は動作するはずですか? それとも、これは何らかの形で予想されますか?