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

用于生成FCGI服务器的C API?,c,nginx,fastcgi,C,Nginx,Fastcgi,我使用fastcgi.com的API用C编写了一个FCGI程序。我已经像医生说的那样给FCGI_Accept打了电话。当我运行生成的可执行文件时,它就像CGI程序一样运行,然后退出 我需要web服务器的API,它在UNIX域套接字上侦听。我使用的是nginx,它本身和fastcgi.com的API库不生成FCGI程序。我不想使用其他服务器或库生成我的FCGI程序。Unixman,nginx本身不会生成FCGI服务。您的程序需要启动并有一个主循环,它将接受FastCGI请求。Nginx将这些请求转

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


我需要web服务器的API,它在UNIX域套接字上侦听。我使用的是
nginx
,它本身和fastcgi.com的API库不生成FCGI程序。我不想使用其他服务器或库生成我的FCGI程序。

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


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

只需创建一个unix域套接字侦听器并将套接字描述符复制到STDIN\u FILENO即可

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

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

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

  • 使用FCGX_OpenSocket()打开套接字
  • 使用FCGX_InitRequest()初始化
  • 使用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;
    }
    
    #包括
    #定义路径\u SOCKET“/tmp/hello.sock”
    int main(){
    int-sock=FCGX_-OpenSocket(路径_-SOCKET,10);
    FCGX_请求;
    FCGX_Init();
    FCGX_InitRequest(&request,sock,0);
    while(FCGX_Accept_r(&request)==0){
    FCGX\u FPrintF(request.out,“内容类型:text/plain\r\n\r\n”
    “你好,世界!\r\n”);
    FCGX_完成_r(&请求);
    }
    返回0;
    }
    
    fastcgi程序与任何其他程序一样启动(即通过
    main
    )。您需要将HTTP服务器配置为将其作为FastCGI应用程序启动。@BasileStarnKevitch nginx不生成FastCGI应用程序。这意味着
    ngnix
    可能不支持FastCGI,或者期望从外部启动FastCGI应用程序(例如,通过系统启动脚本启动,例如
    /etc/init.d/
    )。那么,启动FastCGI应用程序仍然是一个系统管理问题,这个问题不属于这里(因为它与编码无关)。实际上,这是一个编程问题,因为无法启动FCGI。nginx是一种代理,FCGI通常由web服务器启动。它们不能自己发射。我需要编写一个FastCGI服务器来侦听连接。不要求Web服务器必须启动fcgi二进制文件。FWIW,fcgi程序可能已经在运行了,例如,php-fpm,它通常是通过常规的发行版初始化机制启动的。我正在使用fastcgi.com上的FCGIAPI。它说要做的就是调用
    FCGI\u Accept
    ,但这不起作用。它就像正常的CGI一样运行,然后退出。@unixman83您的应用程序是服务器,而Web服务器是客户端,只需确定unix域套接字的位置,并指示您的Web服务器(客户端)连接到指定的套接字路径即可。不需要更多的套接字,所有消息都通过我说的套接字传递。你没有显示STDOUT。如何处理
    STDOUT
    STDERR