Contents

懷念 leoboard 論壇:用 Docker 建置 CGI 環境

現在講 Web 應用,多半都在談框架、API 和容器化,但有些舊系統或特殊工具仍然會碰到 CGI。當你想把這類老環境搬進 Docker 時,問題通常不在 Docker 本身,而是在 Apache 模組、ScriptAlias 和執行權限有沒有配好。

CGI 在這裡是什麼角色

CGI 是一種比較早期的 Web 執行模型,讓 Web Server 收到請求後,去呼叫外部程式並把結果回給使用者。即使現在不是主流,在某些遺留系統、簡單工具或歷史專案裡還是看得到。

Docker 裡要注意什麼

把 CGI 放進容器後,最常要確認的有三件事:

  1. Apache 載入的是哪個 CGI 模組。
  2. cgi-bin 路徑有沒有對好。
  3. 腳本檔案有沒有執行權限。

Apache 模組差異

根據 Apache 的 MPM 模式不同,可能會用到不同模組:

1
2
3
<IfModule !mpm_prefork_module>
    LoadModule cgid_module modules/mod_cgid.so
</IfModule>

或:

1
2
3
<IfModule mpm_prefork_module>
    LoadModule cgi_module modules/mod_cgi.so
</IfModule>

這件事如果沒弄清楚,後面你會以為是 CGI 腳本有問題,實際上可能只是模組根本沒載進來。

ScriptAlias 也要對

例如:

1
ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"

這代表 /cgi-bin/ 底下的請求會被映射到實際檔案路徑,並視為可執行腳本處理。

最常見的錯誤

很常看到類似權限問題:

1
Permission denied: exec of '/var/cgi-bin/echo.pl' failed

通常第一件要做的事,就是確認檔案是否真的可執行:

1
chmod +x /var/cgi-bin/echo.pl

小結

用 Docker 建 CGI 環境其實不是不能做,只是要把 Apache 模組、路徑映射和執行權限這三件事先釐清。對現代專案來說它未必是首選,但在維護舊系統或搬遷歷史環境時,這類知識還是很實用。