tutorial - Lenguaje C FastCGI con Nginx
php fpm (5)
Aquí hay un gran ejemplo de nginx, ubuntu, c ++ y fastcgi.
http://chriswu.me/blog/writing-hello-world-in-fcgi-with-c-plus-plus/
Si quieres ejecutar su código, lo puse en un repositorio git con instrucciones. Puedes comprobarlo y ejecutarlo por ti mismo. Solo lo he probado en Ubuntu.
Estoy intentando ejecutar una aplicación fastcgi escrita en lenguaje C detrás del servidor web Nginx. El navegador web nunca termina de cargarse y la respuesta nunca se completa. No estoy seguro de cómo abordar y depurar. Cualquier idea sería apreciada.
La aplicación hello world se tomó de fastcgi.com y se simplificó para que se vea así:
#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;
}
El ejecutable de salida se ejecuta con uno de los siguientes:
cgi-fcgi -connect 127.0.0.1:9000 a.out
o
spawn-fcgi -a120.0.0.1 -p9000 -n ./a.out
La configuración de Nginx es:
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;
}
}
Intenta con:
$ cgi-fcgi -start -connect localhost:9000 ./hello
Esto funciona para mi. Estoy usando archlinux y siguiendo las instrucciones en:
Puedes probar esto https://github.com/Taymindis/ngx-c-handler
Está construido en la parte superior en fastcgi, maneja solicitudes múltiples, y también hay algunas características básicas. Puede manejar la función de mapeo con nginx.
Para iniciar un nginx con el lenguaje c / c ++ https://github.com/Taymindis/ngx-c-handler/wiki/How-to-build-a-cpp-service-as-c-service-interface
Una vez que su aplicación maneje las solicitudes de fastcgi correctamente, debe encargarse de iniciar la aplicación. nginx nunca generará los procesos fcgi en sí, por lo que necesita un demonio que se encargue de eso.
Recomiendo usar uwsgi para gestionar procesos fcgi. Es capaz de generar procesos de trabajo que están listos para la entrada y reiniciarlos cuando mueren. Es altamente configurable y fácil de instalar y usar.
http://uwsgi-docs.readthedocs.org/en/latest/
Aquí está mi configuración:
[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
Esto se integra muy bien como servicio systemd, pero también puede ejecutarse sin.
FCGI_Accept
llamar a FCGI_Accept
en el bucle while:
while(FCGI_Accept() >= 0)
Tienes FCGI_Accept >= 0
en tu código. Creo que eso hace que la dirección de la función FCGI_Accept
se compare con 0
. Como la función existe, la comparación nunca es falsa, pero la función no se está invocando.