開發者 prophitt 分享了其商業網頁產品 marketyour.games 的開發經驗,該產品採用被視為過時的 C 語言與 CGI 技術棧,但在 2026 年仍能有效運作。該應用具備現代網頁功能,包括用戶帳戶、內容創作者搜尋儀表板、資料夾組織、Stripe 支付及 Postmark 交易郵件,且遵循漸進式增強原則,無需 JavaScript。技術棧被稱為 BCHS(OpenBSD, C, httpd, SQLite),特點是無框架、無模板語言、無獨立資料庫伺服器及無容器。應用編譯為單一靜態連結執行檔,部署時僅需替換檔案,無需重啟伺服器或造成停機時間。每個請求由 httpd 生成新進程執行該 C 程式,程式讀取 CGI 環境變數並直接輸出 HTML。安全性方面,利用 OpenBSD 的 pledge 和 unveil 進行沙箱隔離,httpd 預設在 chroot 環境中執行 CGI 執行檔。依賴僅限 libcurl(處理 Stripe 和 Postmark 請求)、libsodium(處理隨機 ID、密碼雜湊及 Stripe Webhook HMAC 驗證)及 libcjson(處理 JSON 解析)。其中 libcjson 和 SQLite 以單一 C 檔案形式內嵌,僅 libcurl 和 libsodium 為實際建置依賴。所有靜態資源均編譯進執行檔並從記憶體提供服務。開發者認為 CGI 規範自 2004 年發布後未變,學習成本低,且相比現代反向代理架構,CGI 讓網頁伺服器直接調用業務邏輯,除錯更簡單(可直接從 Shell 執行程式)。開發者強調此架構供應鏈風險極低,僅依賴少數知名專案,避免了現代包管理器帶來的龐大間接依賴圖。開發環境使用無插件的 Vim,依賴成熟的 C 語言工具鏈(如 gdb, valgrind)。開發者承認需自行編寫 Cookie、查詢參數及表單處理等工具函式,並考慮未來可能發布 cgi.h 作為共用工具。開發者指出,隨著現代核心對進程分叉的優化,CGI 的效能問題已大幅緩解,若仍有疑慮可升級至 FastCGI。
事件背景
CGI(通用閘道介面)規範於 2004 年發布 1.1 版本,定義了網頁伺服器與外部應用程式之間的介面標準。OpenBSD 是一個以安全性為導向的類 Unix 作業系統,提供 pledge 和 unveil 系統呼叫以限制程序的權限與檔案系統存取範圍。httpd 是 OpenBSD 內建的網頁伺服器,預設在 chroot 環境中執行 CGI 程式。SQLite 是一個嵌入式關係型資料庫引擎,無需獨立伺服器進程,通過 C API 直接存取資料庫檔案。libcurl 是一個用於傳輸資料的開源函式庫,libsodium 是一個提供加密功能的函式庫,libcjson 是一個輕量級的 JSON 解析庫。
社群觀察
社群成員 ramses0 指出 busybox 內建 CGI 支援,並肯定文中關於 pledge/chroot 等權限降級技術的正確性。OleksandrC 分享了一個使用 C++ 和 WebAssembly 的類似極簡專案。Levitating 提到 nginx 原生不支持 CGI,但推薦了 nginx-cgi 專案以及通過 Passenger 運行 Rack 應用(Ruby 的 CGI 類似介面)的方法。lilbigdoot 分享了多年前在僅有 Apache 的伺服器上使用 CGI 添加動態頁面的正面經驗。Panzerschrek 詢問在多並發請求下,SQLite 如何處理來自多個進程的同時寫入存取。



