Язык C FastCGI с Nginx

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

Приложение 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

or

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;
 }
}

person Arek B.    schedule 27.01.2010    source источник
comment
(в spawn-fcgi) адрес локального хоста 120.0.0.1, должен измениться на 127.0.0.1   -  person engineerX    schedule 18.08.2016


Ответы (5)


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

while(FCGI_Accept() >= 0)

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

person Sinan Ünür    schedule 27.01.2010
comment
да. Спасибо, что указали на эту ошибку. Это были недостающие скобки. - person Arek B.; 27.01.2010
comment
Я пытаюсь сделать то же самое, но когда я запускаю «cgi-fcgi -connect 127.0.0.1:9000 ./echo», он просто выводит строку и репозиторий nginx: «Страница, которую вы ищете, временно недоступна. Пожалуйста, повторите попытку позже.' Любая идея, ссылка или ресурс? - person rtacconi; 03.02.2012
comment
@rtacconi Ваша система, вероятно, настраивает nginx для отображения одной и той же страницы для всех ошибок 50x. Проверьте заголовок HTTP на наличие номера состояния. - person jdh8; 29.04.2014
comment
Извините, что вернул пост, но можно ли как-то настроить его, чтобы он не запускался автоматически при вводе вашего IP-адреса ?? Например, предположим, что у меня есть домашняя страница .html, которую я хочу использовать при поиске моего IP-адреса. И затем, когда пользователь нажимает кнопку, я хочу запустить CGI-скрипт. Может ли что-то подобное работать или это невозможно? - person trynacode; 01.07.2016

Вот отличный пример nginx, ubuntu, c++ и fastcgi.

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

Если вы хотите запустить его код, я поместил его в репозиторий git с инструкциями. Вы можете проверить это и запустить его для себя. Я тестировал его только на Ubuntu.

https://github.com/homer6/fastcgi

person Homer6    schedule 11.01.2013
comment
Спасибо @Homer6 за репозиторий, он помог мне запустить пример Криса. Однако, когда я захочу запустить ваш код, я поймаю это исключение ошибки: basic_string::_S_create - person Saman; 18.06.2015
comment
Привет @Saman, позвольте мне увидеть, что я могу воссоздать вашу ошибку. Можете ли вы предоставить более подробную информацию? Какую версию ubuntu и gcc вы используете? - person Homer6; 18.06.2015
comment
@Saman Похоже, вам нужно убедиться, что файл существует при его запуске. По общему признанию, сообщение об ошибке не очень описательно. Тем не менее, это было доказательство концепции. Например. spawn-fcgi -p 8050 -n hello_world README.md - person Homer6; 18.06.2015

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

person bhelm    schedule 24.06.2014

Попробуйте с:

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

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

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

person pau    schedule 16.02.2012

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

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

Чтобы запустить nginx с языком c/c++ https://github.com/Taymindis/ngx-c-handler/wiki/How-to-build-a-cpp-service-as-c-service-интерфейс

person Oktaheta    schedule 30.09.2017