Подтвердить что ты не робот

C язык FastCGI с Nginx

Я пытаюсь запустить приложение fastcgi, написанное на языке C за веб-сервером Nginx. Веб-браузер никогда не заканчивает загрузку, и ответ никогда не завершается. Я не уверен, как подойти к нему и отладить. Любое понимание было бы оценено.

Приветственное приложение мира было взято с 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;
 }
}
4b9b3361

Ответ 1

Вам нужно вызвать FCGI_Accept в цикле while:

while(FCGI_Accept() >= 0)

У вас есть FCGI_Accept >= 0 в вашем коде. Я думаю, что результат в адрес функции FCGI_Accept сравнивается с 0. Поскольку функция существует, сравнение никогда не является ложным, но функция не вызывается.

Ответ 3

после того, как ваше приложение правильно обрабатывает запросы 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, но также может работать без него.

Ответ 4

Попробуйте:

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

Это работает для меня. Я использую archlinux и следую инструкциям:

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

Ответ 5

Вы можете попробовать это https://github.com/Taymindis/ngx-c-handler

Он построен сверху на fastcgi, он обрабатывает несколько запросов, а также есть некоторые основные функции. Он может отображать функцию обработчика с nginx.

Для запуска nginx с языком c/С++ https://github.com/Taymindis/ngx-c-handler/wiki/How-to-build-a-cpp-service-as-c-service-interface