【问题标题】:C API for spawning a FCGI server?用于生成 FCGI 服务器的 C API?
【发布时间】:2012-03-25 20:15:43
【问题描述】:

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

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

【问题讨论】:

  • fastcgi 程序与任何其他程序一样启动(即通过main)。您需要配置您的 HTTP 服务器以将其作为 FastCGI 应用程序启动。
  • @BasileStarynkevitch nginx 不会生成 FastCGI 应用程序。
  • 这意味着ngnix 可能不支持FastCGI,或者期望FastCGI 应用程序在外部启动(例如,通过您的系统启动脚本,例如/etc/init.d/)。那么启动FastCGI应用程序仍然是系统管理员的问题,问题不属于这里(因为它与编码无关)。
  • 实际上这是一个编程问题,因为启动 FCGI 是不可能的。 nginx 是一种代理,FCGI 通常由网络服务器启动。它们无法自行启动。我需要编写一个用于侦听连接的 FastCGI 服务器。
  • 网络服务器不需要启动 fcgi 二进制文件。 FWIW,fcgi 程序可能已经在运行,例如通常通过常规发行版初始化机制启动的 php-fpm。

标签: c nginx fastcgi


【解决方案1】:

只需按照以下步骤操作 -

  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】:

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

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

    【讨论】:

    • 我没有使用框架。我正在使用来自 fastcgi.com 的 FCGI API。它说要做的就是致电FCGI_Accept,但这不起作用。它只是像普通的 CGI 一样运行,然后退出。
    【解决方案3】:

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

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

    【讨论】:

    • @unixman83 您的应用程序是服务器,而网络服务器是客户端,只需决定您想要 unix 域套接字的位置并指示您的网络服务器(客户端)连接到指定的套接字路径。不需要更多的套接字,所有消息都通过我说的套接字传递。
    • 您没有显示 STDOUT。如何处理STDOUTSTDERR
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2015-08-18
      • 1970-01-01
      • 2010-12-15
      • 2013-07-30
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      相关资源
      最近更新 更多