Роль FCGI_LISTENSOCK_FILENO в приложениях FCGI - PullRequest
0 голосов
/ 01 мая 2020

Я прочитал fcgi spe c, но все еще не могу понять, как работает связь между:

web-Server <-> FCGI-Server <-> Application

. Спецификация FastCGI гласит, что «веб-сервер» оставляет файл-дескриптор FCGI_LISTENSOCK_FILENO (0), который можно использовать для чтения пакетов fcgi. Но как это должно работать, если сервер FCGI находится на сервере, отличном от веб-сервера? Для меня это звучит так, как будто в спецификации предполагается, что процесс FCGI размещен в той же системе, что и веб-сервер, или путает веб-сервер с fcgi-сервером.

Это мое текущее понимание fcgi -livecycle:

  1. Веб-сервер получает HTTP-запрос и запускает fcgi-запрос к предварительно сконфигурированному сокету / сетевому адресу, скажем: 192.168.20.2:9090.
  2. FastCGI-приложение / Сервер прослушивает порт 9090 на предмет входящих запросов и принимает соединения. Нет FCGI_LISTENSOCK_FILENO, как указано в спецификации, и нет файлового дескриптора / сокета, созданного веб-сервером. Сервер fcgi делает это без какого-либо существующего сокета. Он отвечает за мультиплексирование входных / выходных данных.
  3. Если на самом FCGI-сервере не реализовано приложение, сервер, выступающий в качестве ответчика, запускает новый процесс с помощью stdin, stdout, передаваемого в FastCGI. сервер. Если CGI-приложение записывает что-то в стандартный вывод, процесс FastCGI инкапсулирует данные в fcgi-пакеты.

Как реально работает жизненный цикл? Какие стороны участвуют? Где FCGI_LISTENSOCK_FILENO входит в игру? Почему в спецификации говорится, что веб-сервер оставляет сокет / fd, для которого приложение должно вызвать Accept (). Для меня это абсолютно бессмысленно, потому что, если веб-сервер создает прослушивающий сокет, другой конец должен вызвать connect, чтобы установить sh соединение, но обычно веб-сервер отвечает за установление FCGI-соединения. Сервер FCGI (/ Application) отвечает на запрос соединения только с помощью вызова Accept ().

...