2012-03-25 2 views
2

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

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

+0

Программа fastcgi запускается как любая другая программа (т.е. через «главное»). Вам необходимо настроить HTTP-сервер, чтобы запустить его как приложение FastCGI. –

+0

@BasileStarynkevitch nginx не создает приложения FastCGI. – unixman83

+0

Это означает, что 'ngnix' может не поддерживать FastCGI или ожидает, что приложения FastCGI будут запущены извне (например, с помощью сценариев запуска системы, например, в'/etc/init.d/'). Затем для запуска приложения FastCGI все еще остается проблема с системным администратором, и вопрос здесь не принадлежит (поскольку он не связан с кодированием). –

ответ

1

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

2

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

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

+0

Я не использую фреймворк. Я использую FCGI API от fastcgi.com. Все, что он говорит, это вызвать 'FCGI_Accept', но это не работает. Он просто работает, как обычный CGI, а затем выходит. – unixman83

2

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

dup2(socket, STDIN_FILENO); 
while(FCGI_Accept() >= 0) { 
    /* ... */ 
} 
+0

@ unixman83 Ваше приложение - сервер, а веб-сервер - это клиент, просто выберите, где вы хотите сокет домена unix, и поручите вашему веб-серверу (клиенту) подключиться к указанному пути сокета. Нет необходимости в дополнительных сокетах, все сообщения передаются через сокет, который я сказал. – chansen

+0

Вы не показываете STDOUT. Как обрабатывать 'STDOUT' и' STDERR'? – unixman83

3

следующие действия -

  1. Открыть сокет с помощью FCGX_OpenSocket()
  2. Initialize с помощью FCGX_InitRequest()
  3. Loop с использованием 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; 
} 
Смежные вопросы