Welcome! Log In Create A New Profile

Advanced

Windows и upstream php-cgi.exe

April 06, 2020 07:17AM
Всем привет. Имеем под 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() знаю.
Subject Author Posted

Windows и upstream php-cgi.exe

gewisser April 06, 2020 07:17AM

Re: Windows и upstream php-cgi.exe

Maxim Dounin April 06, 2020 08:44AM

Re: Windows и upstream php-cgi.exe

gewisser April 06, 2020 11:25AM

Re: Windows и upstream php-cgi.exe

gewisser April 29, 2020 12:46PM

Re: Windows и upstream php-cgi.exe

Maxim Dounin April 29, 2020 02:58PM

Re: Windows и upstream php-cgi.exe

gewisser April 30, 2020 06:47AM

Re: Windows и upstream php-cgi.exe

Aleksandr Sytar April 30, 2020 07:42AM

Re: Windows и upstream php-cgi.exe

gewisser April 30, 2020 09:17AM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 82
Record Number of Users: 6 on February 13, 2018
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready