用于产生FCGI服务器的C API?

我用C使用fastcgi.com的API做了一个FCGI程序。 我已经打电话给FCGI_Accept就像文档说的那样。 当我运行生成的可执行文件时,它只是像CGI程序一样运行,然后退出。

我需要用于在UNIX域套接字上侦听的Web服务器的API。 我正在使用nginx ,它自己并没有产生FCGI程序和fastcgi.com的API库。 我不想使用其他服务器或库来产生我的FCGI程序。

我遇到同样的问题,尝试启动使用nginx使用fcgi_stdio库编写的FastCGI应用程序。 如果我正常启动应用程序,它就像正常的CGI一样,并立即退出。 我不确定通常使用什么秘密酱来让应用程序像http守护程序(而不是CGI)那样运行而不是CGI,但是spawn-fcgi是这样做的。 它可以在EPEL存储库中用于RHEL / CentOS / Amazon Linux /等。 我不知道这是否有助于你的情况,但这是我最终结束了使用。

只要按照这些步骤 –

  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; } 

Unixman,nginx不会自己产生FCGI服务。 你的程序需要启动,并有一个主循环接受FastCGI请求。 Nginx会将这些请求转发给你的软件。

如果你想要一个简单的方法(虽然代码是C ++而不是C!),你可以使用(F)CGI工具包或Wt FCGI工具包 。 这两个函数都可以处理你的主循环,然后你只需要在处理函数中调用你的C代码。

只需创建一个unix域套接字侦听器,然后将套接字描述符复制到STDIN_FILENO。

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