我想在每次 Nginx 收到 URL 請求時執行一個(編譯的)C 程式https://myserver.com/programs/my-C-file。
更具體地說,當合併 GitHub 中的 PR 時,我想要一個鉤子來啟動用 C 編寫的自定義構建和發布過程(我想使用 C,因為構建過程很複雜。步驟很多,並且更容易解析 stdout使用C 語言而不是Bash 或PHP。
但是我有什麼理由應該使用 FastCGI 直接觸發 C 二進位檔案而不是 PHP 檔案嗎exec('my C program')
?
顯然,每隔幾天我就不會得到更多這樣的東西,所以我不擔心擴展,而且似乎 FastCGI 是很多額外的配置,而 PHP 我可以直接使用。只需建立一個 PHP 檔案運行exec()
並在 Nginx 中建立一個區塊。
或者也許我對整個過程的思考是錯誤的,並且有一種更簡單的方法可以做到這一點。
答案1
是的,可以使用 nginx 和 FastCGI 來運行 C 二進位。以下是必要步驟的粗略概述:
- 安裝nginx
- 安裝spawn-fcgi
- 安裝fastcgi資料庫(選用)
- 使用偵聽您的 IP/網域的伺服器和將 FCGI 上游傳送到本機主機/連接埠的位置建立 nginx 虛擬主機設定。
- 編譯你的C程式(你的程式應該包括
while (FCGI_Accept() >= 0) { }
) - 啟動 spawn-fcgi 程序以偵聽 localhost/port 作為程式的包裝器。
更多內容請閱讀:
答案2
兩種可能的解決方案:
使用Python的CGIHTTPServer。無需配置,只需將編譯好的程式放在一個目錄中並在父目錄中
cgi-bin
啟動即可。python -m CGIHTTPServer
您可以在 path 上呼叫您的程式/cgi-bin/yourprogramname
。這已經是一個正在運行的 HTTP 伺服器,如果您仍然希望 Nginx 位於它前面,請將其配置為簡單的反向代理(proxy_pass 應該足夠了)。使用 Apache 的本機 CGI 支援。我將向您推薦阿帕奇的文檔對於配置,目錄結構相當於第一個選項。
您也可以透過不使用 C 而是使用 Go 等語言來減少移動部分的數量,因為您可以用 Go 編寫 HTTP 伺服器,大約 10 行,它可以呼叫一個函數來執行實際的建置過程。