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