CGI(Common Gateway Interface)
CGI(Common Gateway Interface)
CGI 是 web 伺服器呼叫外部程式來產生回應的介面,規格是 RFC 3875(CGI/1.1):web 伺服器為每個請求啟動一個新程序,把請求資訊放進環境變數(RFC 稱為 meta-variables)、把請求內容寫進標準輸入,程式把回應寫到標準輸出後結束。它跟語言無關。可先對照 nginx 與 Apache MPM。
概念位置
CGI 是「web 伺服器負責 HTTP、外部程式負責產生內容」這個分工的起點。後來的 FastCGI 保留了同一套參數名稱,只改掉程序壽命(程序常駐、處理很多請求),PHP 的實作是 PHP-FPM。.htaccess 時代的共享主機常用 CGI 加 suEXEC 讓每個站台以自己的帳號執行。
可觀察訊號與例子
$_SERVER的大寫鍵名:REQUEST_METHOD、QUERY_STRING、SCRIPT_FILENAME來自 CGI 的 meta-variables,FastCGI 沿用了它們。- 每個請求一個新 PID:PHP 以
php-cgi被 CGI 呼叫時,每個請求的getmypid()都不同,OPcache 永遠命中不了。 - CVE-2012-1823:PHP 5.3.12 / 5.4.2 之前,以 CGI 方式執行的
php-cgi可能把查詢字串當成命令列選項,只影響這種部署。
設計責任
接手 CGI 部署時,要知道它的每請求啟動成本與隔離方式;換成 PHP-FPM 時,用 pool 的執行帳號保留原本 suEXEC 提供的隔離。詳見 CGI。