我正在尝试在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;
}
}
答案 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上测试过它。
答案 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并按照以下说明进行操作:
答案 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