#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. Есть ли что-нибудь еще, что, по вашему мнению, я пропустил?