apache php-fpm

apache php-fpm freebsd

FreeBSD 12.0でMPMイベントとPHP-FPMを使用してApache HTTPを構成する方法

[Apache] php-fpmのステータスページを表示する – 端くれプログラマの備忘録

Ubuntu 14.04 の Apache mod_proxy_fcgiphp 動かすのは厳しい話 - はざまブログによると、Apache 2.4.10以降では以下の書き方ができるようになった。

httpd.conf

DirectoryIndex index.php index.html

<FilesMatch \.php$>
    SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>

ファイル名が.phpで終わる場合、127.0.0.1:9000で起動するFastCGI(=PHP-FPM)に処理を任せる、となる。わかりやすいし簡潔な設定になった。DirectoryIndexもきちんと効く。
ApacheでPHP-FPMを動かすなら、ProxyPassMatchではなくSetHandlerを使うのがいいらしい #PHP - Qiita

タイムアウト 504 Gateway Timeout Error

apache + php-fpm な環境での504 Gateway Timeout Errorの対応 #PHP - Qiita 2020

例)120秒にする

→ 504 Gateway Timeout

/usr/local/etc/apache24/httpd.conf
ProxyTimeout 120
(デフォルト未設定 → Timeout 60が待ち時間になる) 

→ 503 Service Unavailable

/usr/local/etc/php.ini
max_execution_time = 120
(デフォルト30)

/usr/local/etc/php-fpm.d/www.conf
request_terminate_timeout = 120
(デフォルト0:Off)

いろいろ調べた結果としての結論は、sleep関数は実行時間には含まれないようです。 要は眠っているだけで何も実行してないから、実行時間ではないという結論です。
PHPのmax_execution_timeにsleepは含まれない - このすみノート 2023

確認

<?php
$sleep_seconds = 40;
sleep($sleep_seconds);
echo "sleep $sleep_seconds done!";

max_execution_time = 30 → 200 OK
request_terminate_timeout = 30 → 503 Service Unavailable

デフォルト値

apache
Timeout 60
https://httpd.apache.org/docs/2.4/ja/mod/core.html#timeout
各イベントについて、リクエストを失敗させるまでにサーバが待つ時間を設定
...
5. mod_proxy 内で、 ProxyTimeout が設定されていない場合のデフォルトの待ち時間

ProxyTimeout Directive
Description: Network timeout for proxied requests
Syntax: ProxyTimeout seconds
Default: Value of Timeout
https://httpd.apache.org/docs/2.4/en/mod/mod_proxy.html#proxytimeout
日本語訳だと300になってる?
https://httpd.apache.org/docs/2.4/ja/mod/mod_proxy.html#proxytimeout

php
max_execution_time = 30
https://www.php.net/manual/ja/info.configuration.php#ini.max-execution-time
max_execution_time int
スクリプトがパーサにより強制終了されるまでに許容される最大の 時間を秒単位で指定します。この命令は、いい加減に書かれた スクリプトがサーバーの負荷を上げることを防止するのに役立ちます。 デフォルトでは、30 に設定されています。 PHPコマンドライン から実行する場合のデフォルト設定は 0 です。

php-fpm
request_terminate_timeout 0
https://www.php.net/manual/ja/install.fpm.configuration.php
request_terminate_timeout mixed
単一のリクエストを処理する際のタイムアウト。この時間を過ぎるとワーカープロセスが kill されます。 このオプションは、'max_execution_time' ini オプションが何らかの理由でスクリプトの実行を止められなかった場合に使われます。 値 '0' は 'Off' を意味します。 使用可能な単位: s(秒)(デフォルト), m(分), h(時間) あるいは d(日)、 デフォルト値: 0

Apparently the're both doing the same thing at different levels. max_execution_time is honored by PHP itself and request_terminate_timeout is handled by the FPM process control mechanism. So whichever is set to the lowest value will kick in first. Also Apache has the idle-timeout parameter that it observes and will give up on the PHP process after that time.

Also

maximum execution time is not affected by system calls, stream operations etc.

so you need to take that into account as well.

php - Does request_terminate_timeout overwrite max_execution_time? - Stack Overflow

ALB apache php-fpm

Apache
ProxyTimeout 120

ALB デフォルト 60秒
属性の編集 アイドルタイムアウト 60 → 120
【AWS】ALBでタイムアウト値を変更する方法 - 気ままに 2018