Я хочу запускать (скомпилированную) программу на языке 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 в качестве оболочки для вашей программы.
Подробнее об этом:
решение2
Два возможных решения:
Используйте CGIHTTPServer Python. Никакой настройки, просто поместите скомпилированную программу в
cgi-bin
каталог и запуститеpython -m CGIHTTPServer
в родительском каталоге. Вы можете вызвать свою программу по пути path/cgi-bin/yourprogramname
. Это уже работающий HTTP-сервер, если вы все еще хотите, чтобы Nginx был перед ним, настройте его для простого обратного прокси (proxy_pass должно быть достаточно).Используйте собственную поддержку CGI Apache. Я собираюсь направить вас кДокументация Apacheдля конфигурации структура каталогов эквивалентна первому варианту.
Вы также можете сократить количество перемещаемых элементов, используя не C, а такой язык, как Go, поскольку вы можете написать HTTP-сервер на Go всего за 10 строк, который может вызывать функцию для выполнения фактического процесса сборки.