我想每次 Nginx 收到 URL 请求时运行一个(编译好的)C 程序,比如https://myserver.com/programs/my-C-file。
更具体地说,当 GitHub 中的 PR 合并时,我想要一个钩子来启动用 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 上游发送到本地主机/端口。
- 编译你的 C 程序(你的程序应该包括
while (FCGI_Accept() >= 0) { }
) - 启动 spawn-fcgi 进程来监听 localhost/port 作为程序的包装器。
更多内容:
答案2
两种可能的解决方案:
使用 Python 的 CGIHTTPServer。无需配置,只需将编译后的程序放在目录中
cgi-bin
并python -m CGIHTTPServer
从父目录中启动即可。您可以在路径上调用您的程序/cgi-bin/yourprogramname
。这已经是一个可以运行的 HTTP 服务器,如果您仍希望在它前面运行 Nginx,请将其配置为简单的反向代理(proxy_pass 应该足够了)。使用 Apache 的原生 CGI 支持。我将向您推荐Apache 的文档对于配置,目录结构相当于第一个选项。
您还可以通过不使用 C 而是使用像 Go 这样的语言来减少移动部件的数量,因为您可以在 10 行内用 Go 编写一个 HTTP 服务器,它可以调用一个函数来执行实际的构建过程。