Как запустить C ++ CGI скрипт на сервере NGINX - PullRequest
0 голосов
/ 15 марта 2019

Я написал следующие строки в файле конфигурации, созданном в /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;
     } 
}

В файле / var / www / helloworld есть файл index.html, в котором отображается текст "сайт скоро появится".

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

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

using namespace std;

int main(void) {
    cout<<"Content-type:text/html\r\n\r\n";
    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.Я искал и пробовал разные способы запуска этого сценария в стеке, но по-прежнему чего-то не хватает.

Я также выполнил приведенную ниже команду для подключения файла двоичного кода 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;
    }
}

Ответы [ 2 ]

0 голосов
/ 16 марта 2019

Если вы не вызываете свой 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

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

0 голосов
/ 16 марта 2019

UPDATE

Посмотрите на это сообщение в блоге . В нем подробно объясняется, как настроить 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 ++ работал (перезапустите его, если он выйдет из строя).

...