Как запустить c CGI-скрипт на сервере NGINX

#c #nginx #cgi #fastcgi #nginx-location

#c #nginx #cgi #fastcgi #nginx-расположение

Вопрос:

Я написал нижеприведенные строки в файле конфигурации, созданном в /etc/nginx /conf.d, с именем «helloworld.local.conf».

 server{
     listen 80 default_server;
     server_name hello_world;
     location / {
          root /var/www/helloworld;
          fastcgi_pass 127.0.0.1:9000;
     } 
}
  

Существует index.html файл в /var / www / helloworld, на котором отображается текст «сайт скоро появится».

Мой код на c выглядит следующим образом:

 #include <iostream>
#include "fcgio.h"

using namespace std;

int main(void) {
    cout<<"Content-type:text/htmlrnrn";
    cout<<"<html>n";
    cout<<"<head>n";
    cout<<"<title>Hello World- First CGI Program</title>n";
    cout<<"</head>n";
    cout<<"<body>n";
    cout<<"<h2> hello world</h2>n";
    cout<<"</body>n";
    cout<<"</html>n";
    return 0;
}
  

У меня файл с двоичным кодом c создается с помощью следующей команды

 g   abc.cpp -lfcgi   -lfcgi -o hello_world
  

который необходим для развертывания на сервере NGINX. Я искал и пробовал разные способы запуска этого скрипта в stackoverflow, но все еще чего-то не хватает.

Я также выполнил приведенную ниже команду для подключения файла двоичного кода c к серверу

 cgi-fcgi -start -connect 127.0.0.1:9000 ./hello_world
  

Теперь, когда я посещаю адрес 127.0.0.1: 9000 в браузере, не получаю текст «hello world», который находится в коде c .

Вывод: я предполагаю получить ответ в виде «hello world» из двоичного кода c , который должен отображаться на html-странице.

Чего мне не хватает, пожалуйста, помогите.

ОБНОВЛЕНИЕ: теперь это мой конфигурационный файл.

 server{
    server_name hello;
    location / {
        fastcgi_index index.cgi;
        root /var/www/helloworld;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_name;
        include fastcgi_params;
    }
}
  

Комментарии:

1. Итак, что вы хотите, это отобразить выходные данные вашей программы в виде html на странице, обслуживаемой вашим сервером? Вы упускаете много вещей.

2. Пожалуйста, взгляните на результат, который я должен получить. 3-я строка от последней.

3. Пожалуйста, если я что-то пропустил в приведенном выше сообщении, дайте мне знать.

Ответ №1:

Обновить

Взгляните на этот пост в блоге. В нем довольно подробно объясняется, как настроить C / FCGI / nginx.


ОРИГИНАЛЬНЫЙ ОТВЕТ

Ваш код на C должен быть прослушивателем (когда он запущен, он должен прослушивать порт и возвращать ответы на входящие запросы). Эта часть не имеет никакого отношения к nginx. Итак, сначала убедитесь, что ваш код работает правильно; Запустите свой код и попробуйте получить доступ к указанному порту и посмотреть, получите ли вы ожидаемый ответ.

Затем вам нужно настроить proxy в вашей конфигурации nginx, которая в основном перенаправляет весь трафик, который вы хотите, на ваш порт C (например, 9000 ). Например, вы можете настроить его так, чтобы любой URL в форме https://your_domain.com/api/* перенаправлял на ваш C .

В nginx это довольно просто:

 location /api/ {
    proxy_pass  http://127.0.0.1:9000/;
}
  

Но сначала протестируйте свой C самостоятельно и убедитесь, что он работает нормально

Также вам лучше использовать что-то вроде runit , systemd или аналогичные инструменты, чтобы поддерживать работу вашего прослушивателя C (перезапустите его, если произойдет сбой).

Комментарии:

1. Я думаю, вы, возможно, неправильно поняли OP; он не пытается создать сервер на C , он просто пытается создать CGI-модуль на C .

2. Вы правы #Хосе Фернандо Лопес Фернандес Я пытаюсь создать быстрый CGI-скрипт для печати «hello world» на HTML-странице при посещении любого определенного URL страницы.

3. Спасибо @Amir за ваше время, помощь и усилия. Я прошел по ссылке на этот пост, но это не помогло.

4. Проблема в написанном мной скрипте. Спасибо.

Ответ №2:

Если вы не вызываете свой CGI-скрипт (или исполняемый файл в данном случае) через форму, я думаю, было бы проще без потери общности просто создать этот ваш индекс. В том виде, в каком он у вас сейчас есть, тот факт, что вы ничего не видите, неудивителен. Помните, что модуль CGI ничего не добавляет к первому HTML-файлу. Вы должны объявить тип содержимого в первой строке, потому что это html-файл, который будет отображаться.

Я бы изменил компиляцию на это, хотя:

 g   abc.cpp -lfcgi   -lfcgi -o index.cgi
  

Теперь в вашем файле конфигурации убедитесь, что у вас есть следующее. Обычно я использую Apache, но, если я не ошибаюсь, конфигурация вашей папки должна выглядеть следующим образом, и вы должны быть готовы к работе.

 location / {
    root          /var/www/helloworld;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.cgi
    fastcgi_param SCRIPT_FILENAME $fastcgi_script_name
    include       fastcgi_params
}
  

Из документации fastcgi_param аргумент обычно выглядит следующим образом:

 fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name
  

Поскольку ваш I предполагал, что ваш исполняемый файл будет вызван index.cgi и будет находиться в текущем каталоге, я исключил папку scripts из примера, но имейте в виду, что этот пример чрезвычайно надуманный и ценен действительно только для запуска самой минимальной CGI-системы.

Комментарии:

1. Спасибо за вашу помощь и время. Теперь я пробую ваши предложения. Я прокомментирую здесь обновления.

2. Если я помещу свой index.cgi-скрипт в каталог /var / www / helloworld, то каким должно быть $fast_script_name?

3. На самом деле это просто объявление переменной; эта строка сообщает серверу, как передать параметр SCRIPT_FILENAME. Вы должны оставить это как есть.

4. Я выполнил оба основных шага, которые вы упомянули выше о директиве location и команде для создания index.cgi, а также удалил index.html из каталога /etc/ www / helloworld и разместил index.cgi там, по-прежнему не получая никакого ответа.

5. Есть ли что-нибудь еще, что, по вашему мнению, я пропустил?