Apache HTTP Server 第 2.4 版
說明 | mod_proxy 的 FastCGI 支援模組 |
---|---|
狀態 | 擴充功能 |
模組識別碼 | proxy_fcgi_module |
原始程式碼檔案 | mod_proxy_fcgi.c |
相容性 | 可在第 2.3 版或更新版本中使用 |
此模組需要 mod_proxy
服務。它提供對 FastCGI 協定的支援。
因此,為取得處理 FastCGI
協定的能力,mod_proxy
和 mod_proxy_fcgi
必須存在於伺服器中。
有別於 mod_fcgid 和 mod_fastcgi,mod_proxy_fcgi
沒有啟動應用程式處理程序的條款;fcgistarter
(在某些平台上)有這個目的。或者,外部分啟動或處理程序控管可在正在使用的 FastCGI 應用程式架構中取得。
在 保護您的伺服器 之前不要啟動代理。開放的代理伺服器會危害您的網路和整體網際網路。
請記住,為使以下範例能運作,您必須啟用 mod_proxy
和 mod_proxy_fcgi
。
ProxyPass "/myapp/" "fcgi://127.0.0.1:4000/"
mod_proxy_fcgi
預設會停用連線重複使用,因此在要求已完成後,連線將會由該 httpd 子行程關閉,並且不會重複使用。如果 FastCGI 應用程式能夠從 httpd 處理並行的連線,您可以選擇連線重複使用,如下列範例所示
ProxyPass "/myapp/" "fcgi://127.0.0.1:4000/" enablereuse=on
請記住,PHP-FPM (截至撰寫本文時,2018 年 2 月) 使用前置分支模型,亦即其每個工作程序每次只能處理一個連線。
預設情況下,mod_proxy (設定為 enablereuse=on
) 允許一個連線池有 ThreadsPerChild
到後端的連線,供每個 httpd 程序使用執行緒 mpm (例如 worker
或 event
),因此應考慮下列使用案例
MaxRequestWorkers
個到 FCGI 後端的連線。mod_http2
的實作方式,有額外 h2 工作執行緒可能會強制建立其他後端連線。池中的總連線數量可能會增加到超過 MaxRequestWorkers
。PHP-FPM 工作執行緒的最大數量需要明智地設定,因為有可能所有這些工作執行緒最後都「忙碌」於處理閒置的持續連線,而沒有空間建立新的連線,而最終使用者體驗將是一堆 HTTP 要求逾時。
以下範例將要求 URI 傳遞為 PHP-FPM 背景程式執行的檔案系統路徑。要求 URL 會自動新增到第二個參數。fcgi:// 之後的 hostname 和 port 是 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 會被忽略。
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>
除了控制 mod_proxy
行為的設定指令外,也有多個 環境變數 控制 FCGI 協定提供者
ProxyPass
或 ProxyPassMatch
設定時,mod_proxy_fcgi
將不會設定 PATH_INFO 環境變數。這允許後端 FCGI 伺服器正確判斷 SCRIPT_NAME 和 Script-URI,並符合 RFC 3875 第 3.3 節。如果您需要 mod_proxy_fcgi
為 PATH_INFO 產生「最佳猜測」,請設定這個環境變數。這是針對部分 FCGI 執行中錯誤的一種解決方法。此變數可以設定為多個值,以調整最佳猜測的選取方式 (僅在 2.4.11 和後續版本中提供)說明 | 指定後端 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 互動。
說明 | 允許設定傳送至 FastCGI 伺服器的變數 |
---|---|
語法 | ProxyFCGISetEnvIf 條件運算式 [!]環境變數名稱 [值運算式] |
內容 | 伺服器設定、虛擬主機、目錄、.htaccess |
狀態 | 擴充功能 |
模組 | mod_proxy_fcgi |
相容性 | 於 2.4.26 及後續版本提供 |
在將要求傳遞至已設定的 FastCGI 伺服器之前,網路伺服器核心會根據目前要求的詳細資料設定多個環境變數。FastCGI 程式通常會使用這些環境變數作為輸入,以決定他們將處理哪些基礎指令或直接產生什麼輸出。
值得注意的環境變數範例包括
此指令允許覆寫上述或任何其他有興趣的環境變數。本指令會在為這些變數設定初始值後評估,因此可用於條件運算式和值運算式。
參數語法
# 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 VARIABLECGI/1.1 規範 並未區分包含空值和不存在的變數。然而,許多 CGI 和 FastCGI 實作會區分(或允許腳本區分)這兩種情況。是否使用這項功能取決於您的實作,以及您修改變數的原因。