带有Nginx的C语言FastCGI

时间:2010-01-27 19:30:10

标签: c nginx fastcgi

我正在尝试在Nginx Web服务器后面运行用C语言编写的fastcgi应用程序。 Web浏览器永远不会完成加载,响应永远不会完成。我不知道如何处理和调试。任何见解都将不胜感激。

hello world应用程序取自fastcgi.com并简化为:

#include "fcgi_stdio.h"
#include <stdlib.h>

int main(void)
{

 while(FCGI_Accept >= 0)
 {
  printf("Content-type: text/html\r\nStatus: 200 OK\r\n\r\n");

 }

  return 0;
}

输出可执行文件使用以下任一项执行:

  

cgi-fcgi -connect 127.0.0.1:9000 a.out

  

spawn-fcgi -a120.0.0.1 -p9000 -n ./a.out

Nginx配置是:

server {
        listen   80;
        server_name _;

 location / {
                        # host and port to fastcgi server
                        root   /home/user/www;
                        index  index.html;

                        fastcgi_pass 127.0.0.1:9000;
 }
}

5 个答案:

答案 0 :(得分:15)

您需要在FCGI_Accept循环中调用while

while(FCGI_Accept() >= 0)

您的代码中有FCGI_Accept >= 0。我认为这导致FCGI_Accept函数的地址与0进行比较。由于该函数存在,因此比较永远不会为false,但不会调用该函数。

答案 1 :(得分:5)

这是nginx,ubuntu,c ++和fastcgi的一个很好的例子。

http://chriswu.me/blog/writing-hello-world-in-fcgi-with-c-plus-plus/

如果你想运行他的代码,我已经将它放入带有指令的git仓库中。您可以查看并自行运行。我只在Ubuntu上测试过它。

https://github.com/homer6/fastcgi

答案 2 :(得分:2)

在您的应用程序正确处理fastcgi请求后,您需要负责启动应用程序。 nginx永远不会自己生成fcgi进程,所以你需要一个守护进程来处理它。

我建议使用uwsgi来管理fcgi进程。它能够产生准备输入的工作进程,并在它们死亡时重新启动它们。它具有高度可配置性,易于安装和使用。

http://uwsgi-docs.readthedocs.org/en/latest/

这是我的配置:

[uwsgi]
fastcgi-socket = /var/run/apc.sock
protocol = fastcgi
worker-exec = /home/app/src/apc.bin
spooler = /home/app/spooler/
processes = 15
enable-threads = true
master = true
chdir = /home/app/
chmod-socket = 777

这很好地集成了systemd服务,但也可以在没有。

的情况下运行

答案 3 :(得分:1)

尝试:

$ cgi-fcgi -start -connect localhost:9000 ./hello

它对我有用。 我正在使用archlinux并按照以下说明进行操作:

https://wiki.archlinux.org/index.php/Nginx

答案 4 :(得分:0)

你可以试试这个 https://github.com/Taymindis/ngx-c-handler

它建立在fastcgi之上,它处理多个请求,并且还有一些核心功能。它可以处理与nginx的函数映射。

使用c / c ++语言启动nginx https://github.com/Taymindis/ngx-c-handler/wiki/How-to-build-a-cpp-service-as-c-service-interface