Почему FastCGI и C в Nginx вместо PHP?

Почему FastCGI и C в Nginx вместо PHP?

Я хочу запускать (скомпилированную) программу на языке C каждый раз, когда Nginx получает запрос на URL, скажемhttps://myserver.com/programs/my-C-file.

А именно, когда PR объединяется в GitHub, мне нужен хук для инициирования пользовательского процесса сборки и выпуска, написанного на C (я хочу использовать C, потому что процесс сборки сложный. Он состоит из множества шагов, и в C проще анализировать stdout, чем в Bash или PHP).

Но есть ли причина, по которой мне следует использовать FastCGI для непосредственного запуска двоичного файла C вместо файла PHP и exec('my C program')?

Я, очевидно, не получаю больше нескольких из них каждые несколько дней, поэтому я не беспокоюсь о масштабировании, и похоже, что FastCGI требует много дополнительной конфигурации, тогда как PHP я могу использовать прямо из коробки. Просто создайте файл PHP, запустите его exec()и создайте блок в Nginx.

Или, может быть, я неправильно представляю себе весь этот процесс и есть более простой способ сделать это.

решение1

Да, можно использовать nginx и FastCGI для запуска вашего двоичного файла C. Вот краткий обзор необходимых шагов:

  • Установить nginx
  • Установить spawn-fcgi
  • Установить базу данных fastcgi (необязательно)
  • Создайте конфигурацию nginx vhost с сервером, который прослушивает ваш IP/домен, и местоположением, которое отправляет FCGI вверх по течению на localhost/port.
  • Скомпилируйте вашу программу на языке C (ваша программа должна включать while (FCGI_Accept() >= 0) { })
  • Запустите процесс spawn-fcgi для прослушивания localhost/port в качестве оболочки для вашей программы.

Подробнее об этом:

Запуск скрипта C FastCGI с использованием NGINX

[вводная статья] Демонстрационная версия программы Nginx + FastCGI (C/C++) и ее развертывание для сборки

решение2

Два возможных решения:

  1. Используйте CGIHTTPServer Python. Никакой настройки, просто поместите скомпилированную программу в cgi-binкаталог и запустите python -m CGIHTTPServerв родительском каталоге. Вы можете вызвать свою программу по пути path /cgi-bin/yourprogramname. Это уже работающий HTTP-сервер, если вы все еще хотите, чтобы Nginx был перед ним, настройте его для простого обратного прокси (proxy_pass должно быть достаточно).

  2. Используйте собственную поддержку CGI Apache. Я собираюсь направить вас кДокументация Apacheдля конфигурации структура каталогов эквивалентна первому варианту.

Вы также можете сократить количество перемещаемых элементов, используя не C, а такой язык, как Go, поскольку вы можете написать HTTP-сервер на Go всего за 10 строк, который может вызывать функцию для выполнения фактического процесса сборки.

Связанный контент