我使用fastcgi.com的API在C中制作了一个FCGI程序。就像文档说的那样,我打电话给FCGI_Accept
。当我运行生成的可执行文件时,它就像CGI程序一样运行,然后退出。
我需要用于侦听UNIX域套接字的Web服务器的API。我正在使用nginx
,它不会在自己和fastcgi.com的API库中生成FCGI程序。我不想使用其他服务器或库来生成我的FCGI程序。
答案 0 :(得分:3)
只需按照以下步骤操作即可 -
这是完整的工作示例 -
#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 kit或Wt 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 /等。我不知道这是否有助于你的情况,但这是我最终最终使用的。