Мое приложение FastCGI (PHP-FPM) может столкнуться с ситуацией, когда ему потребуется некоторое время, чтобы подлечиться. Я хочу сказать nginx, что он должен подождать несколько секунд, а затем повторно отправить запрос в бэкэнд FastCGI.
Я уже экспериментировал с хакерской настройкой, в которой nginx настроен с fastcgi_next_upstream http_503
(см. документы) с восходящим потоком с той же конфигурацией fastcgi дважды:
upstream php {
server 127.0.0.1:9000;
server 127.0.0.1:9000;
}
location ~ \.php(/|$) {
fastcgi_pass php;
fastcgi_next_upstream http_503
}
Приложение PHP ответит 503
когда ему нужно время и пространство, заставляя nginx «двигаться вперед» к следующему восходящему потоку, который, по-видимому, является тем же сервером. К сожалению, nginx выполняет второй вызов за миллисекунды.
Я хотел бы отложить второй вызов nginx на несколько секунд, чтобы убедиться, что бэкэнд PHP полностью запущен и работает после ошибочной ситуации. Итак, как добавить правильную задержку перед второй попыткой?
За кулисами мне нужно переработать весь процесс PHP-FPM из-за того, как драйвер MongoDB обрабатывает аварийное переключение набора реплик. Вот почему я не могу полностью разобраться с этим случаем на уровне PHP, но мне нужно освободить процесс PHP на короткий период.
Вы можете попробовать использовать HttpEchoModule чтобы выполнить то, что вам нужно. Тогда вы могли бы сделать что-то вроде этого:
location ~ \.php(/|$) {
fastcgi_pass php;
echo_sleep 3;
fastcgi_next_upstream http_503;
}
Это не ответ nginx, но вы можете использовать Varnish в качестве интерфейса для обработки этого конкретного случая. Проверьте Saint mode как возможность.