Я настроил событие Apache 2.4 MPM с PHP7.3-FPM на довольно загруженном веб-сервере следующим образом:
Timeout 90
<Proxy "unix:/run/php/php7.3-fpm.sock|fcgi://php-fpm">
ProxySet disablereuse=on timeout=90
</Proxy>
<FilesMatch ".+\.php$">
SetHandler proxy:fcgi://php-fpm
</FilesMatch>
Конфигурация PHP в /etc/php/7.3/fpm/php.ini установлена на
max_execution_time=60
PHP-FPM настроен в /etc/php/7.3/fpm/pool.d/www.conf для
request_terminate_timeout=90
Таймауты чтения настраиваются в /etc/apache2/mods-enabled/reqtimeout.conf следующим образом:
RequestReadTimeout header=20-120,minrate=50
RequestReadTimeout body=60-120,minrate=50
В журнале FPM теперь я вижу каждую минуту 1-2 воркера для неизвестных запросов, которые завершаются через 90+ секунд.
[16-May-2019 09:25:32] WARNING: [pool www] child 105567, script '' (request: " ") execution timed out (113.002653 sec), terminating
[16-May-2019 09:25:32] WARNING: [pool www] child 105567 exited on signal 15 (SIGTERM) after 4050.136381 seconds from start
[16-May-2019 09:25:32] NOTICE: [pool www] child 110414 started
Если я не установлю request_terminate_timeout
чтобы убить этих воркеров, они дольше (~ 5 минут) остаются в состоянии «Чтение заголовков» и блокируют пул PHP-FPM.
Кажется, что потоки в Apache MPM все равно не блокируются. Ничто не достигает максимальных значений рабочих.
Как я могу увидеть, к какому сценарию / запросу принадлежат эти PHP-воркеры? Почему эти скрипты запускаются даже после max_execution_time
60 секунд истекло? Как я могу избежать блокировки пула PHP такими запросами?
Я подозреваю, что иногда могут быть неполные запросы HTTPS, которые каким-то образом запускают рабочий PHP. Есть ли способ избежать запуска работника PHP для этого?