<-
Apache > HTTP Server > 文件 > 第 2.4 版 > 模組

Apache 模組 mod_proxy_fcgi

可用語言:  en  |  fr 

說明mod_proxy 的 FastCGI 支援模組
狀態擴充功能
模組識別碼proxy_fcgi_module
原始程式碼檔案mod_proxy_fcgi.c
相容性可在第 2.3 版或更新版本中使用

摘要

此模組需要 mod_proxy 服務。它提供對 FastCGI 協定的支援。

因此,為取得處理 FastCGI 協定的能力,mod_proxymod_proxy_fcgi 必須存在於伺服器中。

有別於 mod_fcgidmod_fastcgimod_proxy_fcgi 沒有啟動應用程式處理程序的條款;fcgistarter(在某些平台上)有這個目的。或者,外部分啟動或處理程序控管可在正在使用的 FastCGI 應用程式架構中取得。

警告

保護您的伺服器 之前不要啟動代理。開放的代理伺服器會危害您的網路和整體網際網路。

Support Apache!

主題

指令

錯誤修正清單

相關資訊

top

範例

請記住,為使以下範例能運作,您必須啟用 mod_proxymod_proxy_fcgi

單一應用程式執行個體

ProxyPass "/myapp/" "fcgi://127.0.0.1:4000/"

mod_proxy_fcgi 預設會停用連線重複使用,因此在要求已完成後,連線將會由該 httpd 子行程關閉,並且不會重複使用。如果 FastCGI 應用程式能夠從 httpd 處理並行的連線,您可以選擇連線重複使用,如下列範例所示

單一應用程式執行個體,連線重複使用 (2.4.11 及後續版本)

ProxyPass "/myapp/" "fcgi://127.0.0.1:4000/" enablereuse=on

啟用到 FCGI 後端 (例如 PHP-FPM) 的連線重複使用

請記住,PHP-FPM (截至撰寫本文時,2018 年 2 月) 使用前置分支模型,亦即其每個工作程序每次只能處理一個連線。
預設情況下,mod_proxy (設定為 enablereuse=on) 允許一個連線池有 ThreadsPerChild 到後端的連線,供每個 httpd 程序使用執行緒 mpm (例如 workerevent),因此應考慮下列使用案例

  • 在 HTTP/1.1 負載下,這很可能會導致建立多達 MaxRequestWorkers 個到 FCGI 後端的連線。
  • 在 HTTP/2 負載下,由於 mod_http2 的實作方式,有額外 h2 工作執行緒可能會強制建立其他後端連線。池中的總連線數量可能會增加到超過 MaxRequestWorkers

PHP-FPM 工作執行緒的最大數量需要明智地設定,因為有可能所有這些工作執行緒最後都「忙碌」於處理閒置的持續連線,而沒有空間建立新的連線,而最終使用者體驗將是一堆 HTTP 要求逾時。

以下範例將要求 URI 傳遞為 PHP-FPM 背景程式執行的檔案系統路徑。要求 URL 會自動新增到第二個參數。fcgi:// 之後的 hostname 和 port 是 PHP-FPM 的傾聽位置。連線池/重複使用已啟用。

PHP-FPM

ProxyPassMatch "^/myapp/.*\.php(/.*)?$" "fcgi://127.0.0.1:9000/var/www/" enablereuse=on

以下範例將要求 URI 傳遞為 PHP-FPM 背景程式執行的檔案系統路徑。在此情況中,PHP-FPM 正在 unix 網域 socket (UDS) 上傾聽。需要 2.4.9 或後續版本。使用這個語法時,fcgi:// 後面的 hostname 和選用 port 會被忽略。

使用 UDS 的 PHP-FPM

ProxyPassMatch "^/(.*\.php(/.*)?)$" "unix:/var/run/php5-fpm.sock|fcgi://127.0.0.1/var/www/"

平衡式閘道需要 mod_proxy_balancer 和至少一個負載平衡器演算法模組,例如 mod_lbmethod_byrequests,以及上面列出的 proxy 模組。 mod_lbmethod_byrequests 為預設值,且將用於此範例設定。

平衡式閘道,傳送至多個應用程式執行個體

ProxyPass "/myapp/" "balancer://myappcluster/"
<Proxy "balancer://myappcluster/">
    BalancerMember "fcgi://127.0.0.1:4000"
    BalancerMember "fcgi://127.0.0.1:4001"
</Proxy>

您也可以透過建立合適的處理常式傳遞,強制要求以反向代理要求來處理。下方範例設定將使用反向代理,將 PHP 指令碼的所有要求傳遞給指定的 FastCGI 伺服器。這項功能在 Apache HTTP Server 2.4.10 及更新版本中提供。基於效能考量因素,您會希望定義一個 工作程序,代表相同的 fcgi:// 後端。這種模式的優點在於它允許伺服器對 URI 執行正常的對應至檔名對應,且會將本機檔案系統的結果傳遞至後端。當 FastCGI 是以此方式設定時,伺服器就能計算出最精確的 PATH_INFO。

透過處理常式進行代理

<FilesMatch "\.php$">
    # Note: The only part that varies is /path/to/app.sock
    SetHandler  "proxy:unix:/path/to/app.sock|fcgi://127.0.0.1/"
</FilesMatch>

# Define a matching worker.
# The part that is matched to the SetHandler is the part that
# follows the pipe. If you need to distinguish, "localhost; can
# be anything unique.
<Proxy "fcgi://127.0.0.1/" enablereuse=on max=10>
</Proxy>

<FilesMatch ...>
    SetHandler  "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>

<FilesMatch ...>
    SetHandler  "proxy:balancer://myappcluster/"
</FilesMatch>
top

環境變數

除了控制 mod_proxy 行為的設定指令外,也有多個 環境變數 控制 FCGI 協定提供者

proxy-fcgi-pathinfo
當透過 ProxyPassProxyPassMatch 設定時,mod_proxy_fcgi 將不會設定 PATH_INFO 環境變數。這允許後端 FCGI 伺服器正確判斷 SCRIPT_NAMEScript-URI,並符合 RFC 3875 第 3.3 節。如果您需要 mod_proxy_fcgiPATH_INFO 產生「最佳猜測」,請設定這個環境變數。這是針對部分 FCGI 執行中錯誤的一種解決方法。此變數可以設定為多個值,以調整最佳猜測的選取方式 (僅在 2.4.11 和後續版本中提供)
first-dot
PATH_INFO 是從 URL 中的「第一個」句點後的分隔斜線分割而來的。
last-dot
PATH_INFO 是從 URL 中的「最後一個」句點後的分隔斜線分割而來的。
full
PATH_INFO 是透過嘗試將 URL 對應至本機檔案系統計算的。
unescape
PATH_INFO 是 URL 的路徑組成部分,以未轉譯 / 已解碼顯示。
任何其他值
PATH_INFO 與 URL 的路徑組成部分相同。原本,這是唯一的 proxy-fcgi-pathinfo 選項。
top

ProxyFCGIBackendType 指令

說明指定後端 FastCGI 應用程式類型
語法ProxyFCGIBackendType FPM|GENERIC
預設值ProxyFCGIBackendType FPM
內容伺服器設定、虛擬主機、目錄、.htaccess
狀態擴充功能
模組mod_proxy_fcgi
相容性於 2.4.26 及後續版本提供

本指令允許指定後端 FastCGI 應用程式類型。有些 FastCGI 伺服器(例如 PHP-FPM)將環境變數的歷史怪癖用於識別正在使用的代理伺服器類型。如果您的非 PHP-FPM 應用程式難以詮釋由伺服器設定的環境變數(例如 SCRIPT_FILENAME 或 PATH_TRANSLATED),請將此指令設為「GENERIC」。

一個根據此指令設定而變更的值範例是 SCRIPT_FILENAME。在過去使用 mod_proxy_fcgi 時,SCRIPT_FILENAME 會附加字串「proxy:fcgi://」為字首。此變數是某些一般 FastCGI 應用程式用於讀取其指令輸入,但 PHP-FPM 會移除字首,然後記住它正在與 Apache 通訊。在 2.4.21 到 2.4.25 中,此字首會自動由伺服器移除,導致 PHP-FPM 無法偵測和在某些情況下與 Apache 互動。

top

ProxyFCGISetEnvIf 指令

說明允許設定傳送至 FastCGI 伺服器的變數
語法ProxyFCGISetEnvIf 條件運算式 [!]環境變數名稱 [值運算式]
內容伺服器設定、虛擬主機、目錄、.htaccess
狀態擴充功能
模組mod_proxy_fcgi
相容性於 2.4.26 及後續版本提供

在將要求傳遞至已設定的 FastCGI 伺服器之前,網路伺服器核心會根據目前要求的詳細資料設定多個環境變數。FastCGI 程式通常會使用這些環境變數作為輸入,以決定他們將處理哪些基礎指令或直接產生什麼輸出。

值得注意的環境變數範例包括

此指令允許覆寫上述或任何其他有興趣的環境變數。本指令會在為這些變數設定初始值後評估,因此可用於條件運算式和值運算式。

參數語法

條件運算式
指定控制是否會修改之後環境變數的運算式。有關運算式語法的資訊,請參閱下列範例或 ap_expr 文件的完整規格。
環境變數名稱
指定要變更的 CGI 環境變數,例如 PATH_INFO。如果在前面加上驚嘆號,則不會設定變數。
值運算式
指定前一個環境變數的替換值。可從 條件運算式 中的正規表示式擷取包含反向參考(例如「$1」)。如果略過此步驟,則變數會設定(或覆寫)為空字串——但請參閱下方的備註。
# A basic, unconditional override
ProxyFCGISetEnvIf "true" PATH_INFO "/example"

# Use an environment variable in the value
ProxyFCGISetEnvIf "true" PATH_INFO "%{reqenv:SCRIPT_NAME}"

# Use captures in the conditions and backreferences in the replacement
ProxyFCGISetEnvIf "reqenv('PATH_TRANSLATED') =~ m|(/.*prefix)(\d+)(.*)|" PATH_TRANSLATED "$1$3"

備註:取消設定與清空

下列將會取消設定 變數,避免它傳送至 FastCGI 伺服器
ProxyFCGISetEnvIf true !VARIABLE
而下列將會刪除 變數 的任何現有(將其設定為空字串),但空的 變數 仍會傳送至伺服器
ProxyFCGISetEnvIf true VARIABLE
CGI/1.1 規範 並未區分包含空值和不存在的變數。然而,許多 CGI 和 FastCGI 實作會區分(或允許腳本區分)這兩種情況。是否使用這項功能取決於您的實作,以及您修改變數的原因。

可用語言:  en  |  fr 

top

意見回饋

注意事項
這裡不是問答區。貼在這裡的意見應著重於提供建議,以改善文件或伺服器。我們的版主可能會刪除已實作、或認定為無效/離題的意見。關於如何管理 Apache HTTP 伺服器的問題,應 направлять 至我們的 IRC 頻道,即 Libera.chat 上的 #httpd,或寄送至我們的 郵件列表