FastCGI форк в с - PullRequest
       23

FastCGI форк в с

3 голосов
/ 24 июня 2011

Я сейчас занимаюсь разработкой высоконагруженного проекта, мне нужно использовать комбинацию C / FastCGI / nginx.

Проблема в том, что мне нужно, чтобы мое приложение FastCGI работало в потоках / процессах.

Я знаю два способа сделать это:

1) Скомпилируйте программу и затем используйте spawn-fcgi для разветвления процессов. (Я не могу использовать это)

2) Выполнить FCGX_Init(), затем предварительно обработать до 10 процессов ДО while (FCGX_Accept_r(&request) >= 0)

3) Запустить pthreads ПОСЛЕ while (FCGX_Accept_r(&request) >= 0)

Итак, мой вопрос: что это самый быстрый способ запустить приложение fastcgi. Могу ли я предварительно форкнуть приложение fastcgi после этого:

int sock = FCGX_OpenSocket(":9000", 10);
FCGX_InitRequest(&request, sock, 0);

Могут ли 10 процессов прослушивать один сокет? Нужно ли использовать потоки, если у меня запущено N процессов? Этого будет достаточно?

1 Ответ

4 голосов
/ 24 июня 2011

Я не знаю, какой конкретно API FastCGI вы используете, но в целом вы не можете передать дескриптор файла (т.е. сокет) другому процессу, если он не был открыт до того, как вы разветвились.Процессы имеют независимые таблицы дескрипторов файлов.Все потоки будут использовать одну и ту же таблицу дескрипторов файлов, поскольку они находятся в одном и том же процессе.

Насколько мне известно, вы можете одновременно прослушивать один порт только одним процессом.Обычно делается один поток, единственной задачей которого является прослушивание соединений.Когда он получает его, соединение принимается и передается следующему рабочему потоку в пуле, когда поток принимает принятый сокет (не прослушивающий сокет), пока сокет не закроется.Поток слушателя немедленно возвращается к прослушиванию соединения.

Это должно дать вам минимальные издержки.

...