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

时间:2012-03-25 20:15:44

标签: c nginx fastcgi

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

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

4 个答案:

答案 0 :(得分:3)

只需按照以下步骤操作即可 -

  1. 使用FCGX_OpenSocket()
  2. 打开套接字
  3. 使用FCGX_InitRequest()
  4. 初始化
  5. 使用FCGX_Accept_r()代替FCGI_Accept()循环
  6. 这是完整的工作示例 -

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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