Apache 與 nginx

您可以提高託管客戶網站(Apache) 的 web 伺服器的工作性能,方法使用 nginx,一個輔助的高性能 web 伺服器,通常用作反向代理伺服器。該 web 伺服器專門為交付大容量靜態內容(例如,圖像、視頻、css、xml,等)而設計。與 Apache 相反,nginx 在處理大量並行連接時反而更高效。與 Apache 相比該 web 伺服器的另一個優勢是 nginx 在每個用戶端連接上記憶體佔用小的多。

為了充分利用 nginx 的所有優勢,Plesk 會配置它作為反向代理伺服器置於互聯網和 Apache 之間(如下圖)。也就是說 nginx 會成為處理所有來自網站訪客的接收連接請求的前端 web 伺服器。這些請求會發送到 Apache,會被區分為靜態和動態內容請求。如果請求是靜態檔請求(例如,jpg、css、html,等),Apache 會通過所有註冊的處理常式傳遞請求(應用 .htaccess 目錄級別的配置,覆寫 URL 等等)並返回給 nginx 一個回應,該回應只包含請求檔在檔案系統中所處的位置。nginx 會找到該文件然後發送給用戶端。如果請求是動態檔請求(例如 PHP 腳本),Apache 會執行該檔並發送回應給 nginx,然後由 nginx 交付給用戶端。

nginx 和 Apache 的組合有如下優勢:

  • 併發連接網站的數量增加。
  • 消耗伺服器 CPU 和記憶體資源減少。
    帶有大量靜態內容(例如,相冊、視頻網站,等等)的網站獲益最大。
  • 為連線速度慢(GPRS、EDGE、3G,等等)的客戶提供服務的效率提高了。
    例如,一個 10 KB/秒連線速度的客戶請求一個 PHP 腳本,會產生 100 KB 的響應。如果伺服器上沒有 nginx 而直接由 Apache 交付回應。在要求交付回應的 10 秒鐘內,Apache 和 PHP 會繼續因該連接消耗所有的系統資源。如果安裝了 nginx,Apache 會把回應轉發給 nginx(nginx 到 Apache 的連接非常快,因為兩者都位於同一伺服器上)並釋放系統資源。因為 nginx 記憶體佔用少的多,所有系統上整體的負載會減少。如果您有大量的低速連接,使用 nginx 將會大幅度提升網站的性能。

Plesk 如何在 nginx 的幫助下處理 HTTP 請求的技術詳情將接下來進一步闡述。欲瞭解如何在 Plesk 中打開 nginx,請參閱 安裝 nginx。如果您不想使用 nginx,請根據小節 關閉 nginx 中的說明設定 Apache 為您的前端 web 伺服器。如果您希望 nginx 處理網站內容的所有 HTTP 請求,請存取 調整 Apache Web 伺服器設定

帶有 nginx 支援的 Plesk 如何處理 HTTP 請求

為了無縫整合 nginx 和 Apache,Plesk 會額外使用兩個 Apache 模組:

  • mod_aclr2
    該模組會設定一個處理常式,在所有其它 Apache 模組(mod_rewrite、.htaccess 相關的模組、mod_php,等等)的處理常式後運行。因此,如果請求是動態內容請求,mod_aclr2 將永遠無法獲取,因為該請求將會被某個 Apache 模組(mod_php、mod_perl、 mod_cgi,等等)更高級別的處理常式處理。唯一的例外是 SSI 請求:一旦抵達 mod_aclr2,就會被重定向到相應的處理常式。如果請求是靜態檔請求,mod_aclr2 會搜尋在檔案系統上的確切地址並把地址發送給 nginx。
  • mod_rpaf
    從 Apache 角度來看,其所有的用戶端都有一個相同的 IP 位址 - 即 nginx 伺服器的位址(如上圖)。這會導致把用戶端 IP 位址用於驗證和統計等目的的網站和 web 應用程式出現問題。mod_rpaf 會使用用戶端 IP 位址替代所有請求中的 nginx 伺服器的 IP 位址,從而解決該問題。更精確地說就是該模組會使用特殊的 X-Forwarded-For 請求頭,nginx 會在該請求頭中放入一個用戶端的 IP 位址。

我們進一步來看 Plesk 在這些範本的幫助下是如何處理靜態和動態內容請求的。

處理靜態檔的 HTTP 請求的序列如下(如圖):

  1. 一個客戶發送一個請求給一個 web 伺服器。
  2. nginx 會在請求中添加 X-Accel-Internal(被 mod_aclr2 使用)和 X-Forwarded-For (包含用戶端的 IP 位址)請求頭然後發送請求給 Apache。
  3. Apache 會接收到請求並開始通過註冊的處理常式處理該請求(應用 .htaccess 配置,覆寫 URL,等等)。在此步驟中,mod_rpaf 會使用來自 X-Forwarded-For 請求頭中的用戶端位址替代 REMOTE_ADDR Apache 中 nginx 伺服器的 IP 地址。
  4. 在被所有註冊的處理常式處理過後,請求會抵達 mod_aclr2。該處理常式會檢查 X-Accel-Internal 請求頭是否存在。如果該請求頭存在,該模組會給 nginx 發送一個帶有零內容長度和 X-Accel-Redirect 請求頭的回應。該請求頭包含由 by mod_aclr2 確定的檔的確切位址。
  5. nginx 一旦收到該響應,即會查找文件並交付給用戶端。

下圖是 Plesk 處理常式如何處理 2 KB GIF 文件請求的示例。

static_seq

對於處理動態內容的請求,其前三步驟是相同的。然後請求會傳遞到相應 Apache 模組(mod_php mod_perl mod_cgi,等等)的處理常式。請求永遠不會到達 mod_aclr2(SSI 請求除外)。處理常式會生成一個響應並發送到 nginx,而由 nginx 交付給用戶端。下圖展示了 Plesk 如何處理 PHP 檔請求的過程。


在本節:

安裝 nginx

關閉 nginx

 

安裝 nginx

如果您乾淨安裝 Plesk,將會默認啟用 nginx。如果您從早期版本升級,您則可以在升級後任何時候添加 nginx 元件,具體操作是進入 工具與設定 > 更新與升級 > 添加組件。添加該元件後,啟動 反向代理伺服器 (nginx) 服務(在 工具與設定 > 服務管理 中)。

您可以在 工具與設定 > 伺服器組件 中查看已安裝 nginx 伺服器的版本。

nginx version

  

 

關閉 nginx

若要返回到只有單個 Apache web 伺服器的配置,請停止 反向代理伺服器 (nginx) 服務(在 工具與設定 > 服務管理)。

nginx_stop

若要再次設定 nginx 為前端 web 伺服器,請啟動 反向代理伺服器 (nginx) 服務。

注意:啟動或停止 反向代理伺服器 (nginx) 服務的運行不僅是啟動或停止 nginx,實際上還會切換 web 伺服器配置(nginx 和 Apache 組合或僅設定 Apache 為前端 web 伺服器)。重啟操作與其它任何服務的操作方式相同:nginx 服務已被重啟。

 

Leave your feedback on this topic here

If you have questions or need support, please visit the Plesk forum or contact your hosting provider.
The comments below are for feedback on the documentation only. No timely answers or help will be provided.