C API для порождения сервера FCGI? - PullRequest
2 голосов
/ 26 марта 2012

Я создал программу FCGI на C, используя API fastcgi.com.Я позвонил FCGI_Accept, как говорят доктора.Когда я запускаю полученный исполняемый файл, он просто запускается, как CGI-программа, и завершается.

Мне нужен API для веб-серверов, где он прослушивает сокет домена UNIX.Я использую nginx, который не порождает программы FCGI самостоятельно и API библиотеки fastcgi.com.Я не хочу использовать другие серверы или библиотеки для запуска моей программы FCGI.

Ответы [ 4 ]

3 голосов
/ 11 ноября 2013

Просто следуйте этим шагам -

  1. Открыть сокет с помощью FCGX_OpenSocket ()
  2. Инициализация с использованием FCGX_InitRequest ()
  3. Цикл с использованием FCGX_Accept_r () вместо FCGI_Accept ()

Вот полный рабочий пример -

#include <fcgi_stdio.h>

#define PATH_SOCKET "/tmp/hello.sock"

int main() {
    int sock = FCGX_OpenSocket(PATH_SOCKET, 10);
    FCGX_Request request;

    FCGX_Init();
    FCGX_InitRequest(&request, sock, 0);

    while (FCGX_Accept_r(&request) == 0) {
        FCGX_FPrintF(request.out, "Content-Type: text/plain\r\n\r\n"
                "Hello World!\r\n");
        FCGX_Finish_r(&request);
    }

    return 0;
}
2 голосов
/ 10 апреля 2012

Просто создайте прослушиватель сокетов домена unix и скопируйте дескриптор сокета в STDIN_FILENO.

dup2(socket, STDIN_FILENO);
while(FCGI_Accept() >= 0) {
    /* ... */
}
2 голосов
/ 26 марта 2012

Unixman, nginx не создает сервисы FCGI самостоятельно. Ваша программа должна запуститься и иметь основной цикл, который будет принимать запросы FastCGI. Nginx направит эти запросы вашему программному обеспечению.

Если вам нужен простой способ сделать это (хотя код C ++, а не C!), Вы можете использовать либо (F) CGI kit , либо Wt FCGI kit, Обе они могут / будут обрабатывать основной цикл для вас, и тогда вам просто нужно добавить вызов к вашему C-коду в функцию обработчика.

1 голос
/ 18 апреля 2012

У меня такая же проблема при попытке запустить приложение FastCGI, написанное с использованием библиотеки fcgi_stdio для использования с nginx.Если я запускаю приложение нормально, оно действует как обычный CGI и сразу же завершает работу.Я не уверен, какой секретный соус обычно делается для того, чтобы приложение работало как FastCGI вместо CGI с помощью http-демона (чего не делает nginx), но spawn-fcgi делает это.Он доступен в репозитории EPEL для использования с RHEL / CentOS / Amazon Linux / и т. Д.Я не знаю, поможет ли это вашей ситуации, но это то, чем я наконец-то воспользовался.

...