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;
}
}
Ответы
Ответ 1
Вам нужно вызвать FCGI_Accept
в цикле while
:
while(FCGI_Accept() >= 0)
У вас есть FCGI_Accept >= 0
в вашем коде. Я думаю, что результат в адрес функции FCGI_Accept
сравнивается с 0
. Поскольку функция существует, сравнение никогда не является ложным, но функция не вызывается.
Ответ 2
Вот отличный пример nginx, ubuntu, С++ и fastcgi.
http://chriswu.me/blog/writing-hello-world-in-fcgi-with-c-plus-plus/
Если вы хотите запустить его код, я поместил его в репозиторий git с инструкциями. Вы можете проверить это и запустить его для себя. Я тестировал его только на Ubuntu.
https://github.com/homer6/fastcgi
Ответ 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