Windows и upstream php-cgi.exe
gewisser
nginx-forum на forum.nginx.org
Пн Апр 6 11:17:30 UTC 2020
Всем привет. Имеем под windows:
run php-cgi.exe -b 127.0.0.1:9001-c php.ini
run php-cgi.exe -b 127.0.0.1:9002-c php.ini
run php-cgi.exe -b 127.0.0.1:9003-c php.ini
run php-cgi.exe -b 127.0.0.1:9004-c php.ini
run php-cgi.exe -b 127.0.0.1:9005-c php.ini
upstream backend {
server 127.0.0.1:9001;
server 127.0.0.1:9002;
server 127.0.0.1:9003;
server 127.0.0.1:9004;
server 127.0.0.1:9005;
}
Есть проект в котором скрипт php выполнив определённую работу, должен
продолжить работу в фоне.
Раньше с Apache у меня работал вот этот кусок кода:
https://gist.github.com/bubba-h57/32593b2b970366d24be7
Решил хоть как то заставить это работать с nginx. Для начала попытался
отключить буферизацию ответов FastCGI:
header("X-Accel-Buffering: no");
И ответ стал возвращаться браузеру.
По логике работы web приложения, в браузере к nginx идут последующие
запросы... и вот тут то возникают для меня непонятки. Следующий запрос как
правило (но не всегда) остаётся в режиме "pending" и остаётся до того как не
истечёт "fastcgi_read_timeout" по умолчанию 60 сек.
По какой то причине nginx зная, что один из апстримов находится в режиме
ожидания ответа, последующий запрос ставит в очередь на этот апстрим и не
выбирает другой... Чтобы nginx выбрал другой upstream, нужно соединение с
браузером которое может быть keep-alive разорвать. Чтобы разорвать
соединение нужно отправить заголовок header("Connection: close"); который
при любых обстоятельствах не пропускается nginx брвузеру.
Мы можем выставить fastcgi_read_timeout, например в 2 секунды и тогда nginx
закроет по таймауту соединение с апстримом, скрипт успешно выполнит свою
долгую работу в фоне, апстрим будет свободен для приёма сообщений и т.д.
но! Что если нам реально нужно ждать ответ от апстрима более 2,3,4...100
сек?
Как можно сказать nginx закрыть соединение с fastcgi? А лучше аналогично как
мы через хедеры говорим nginx не буферизовать вывод (X-Accel-Buffering: no),
так же сказать закрыть соединение с апстримом.
PS.
Про FPM и fastcgi_finish_request() знаю.
Posted at Nginx Forum: https://forum.nginx.org/read.php?21,287560,287560#msg-287560
Подробная информация о списке рассылки nginx-ru