利用 NGINX 最大化 Python 效能,第二部分:負載均衡和監控

OneAPM官方技術部落格發表於2016-05-17

【編者按】本文主要介紹 NGINX 的主要功能以及如何通過 Nginx 優化 Python 應用效能。本文系國內 ITOM 管理平臺 OneAPM 編譯呈現。

本文上一篇系: 利用 NGINX 最大化 Python 效能,第一部分:Web 服務和快取

Python 以其高效能指令碼語言而著稱,而 NGINX 則能夠通過增加程式碼的實際執行速度來提供助力。對於單一伺服器來說,如果網頁的一半由靜態檔案組成(很多網頁都有一半由靜態檔案組成),增加靜態檔案快取可使這類網頁效能翻倍,快取動態應用程式內容能夠進一步提升應用程式效能。

但這種方法並不是對所有應用都受用,或者說提升的效能不足夠。這時就要考慮橫向擴充套件了---遷移到多伺服器應用。多伺服器應用不僅功能強大、使用靈活、幾乎能夠無限擴充套件,而且成本較低。讓我們繼續前面的優化 Python 效能。

技巧 6---將 NGINX 作為反向代理伺服器

從單伺服器環境來講,部署反向代理伺服器似乎是個很大的進步,因為這一部署非常簡單,實現的功能卻相當強大。新增反向代理伺服器後,不僅效能立即得到大幅提升,還有機會實現:

  • 增強效能 --- 在現有的 Python 應用程式前放置一個 NGINX 伺服器。無需更改 Web 伺服器軟體或配置。現有的 Web 伺服器和應用程式伺服器相結合並在一個冒泡中執行,無法直接接觸網路流量,由反向代理伺服器提出填鴨式請求。
  • 優化效能 --- 按照我們上一篇介紹 Python 的文章,針對應用程式生成的檔案實施靜態檔案快取微應用快取。但現在,我們要在新的反向代理伺服器而不是應用程式伺服器上實施。執行應用程式的伺服器明顯減輕了工作負載,這樣就擴充了應用程式的容量,讓所有使用者都能感受到更高效能。
  • 橫向擴充套件 — 增加更多應用程式伺服器並對其實施負載均衡,利用持續會話實現每位使用者的連貫體驗。
  • 賦予高可用性 — 讓你的反向代理伺服器映象到線上備份,同時擁有備用的應用程式伺服器,讓你的站點高度可用。
  • 監控與管理 — NGINX Plus 提供了高階監測與管理功能,同時配備主動體檢 —— 如果設定了主動體檢,反向代理伺服器會主動向各個伺服器發出帶外請求,核實各個伺服器的可用性。

利用 NGINX 最大化 Python 效能,第二部分:負載均衡和監控

技巧 7---重寫 URL

Web 伺服器配置通常包括 URL 重寫規則。你可以製作美觀的 URL 方便使用者理解,也可以讓 URL 在資源遷移後仍然不變。

NGINX 配置(包括重寫 URL)使用的指令數量較少,也被眾多人士認為是簡單明瞭。但如果不熟悉,使用前還是要經歷一個學習過程。可以把 Creating NGINX Rewrite Rules 這篇文章當做介紹。

下面給出一個使用重寫指令的 NGINX 重寫規則樣板。此規則查詢了以 /download開頭的 URL,之後還在路徑中包含 /media//audio/ 目錄。此規則用 /mp3/ 替換這些元素,並增加合適的副檔名 .mp3.ra。變數 (1 和 )2 獲取保持不變的路徑元素。例如,/download/cdn-west/media/file1 變成 /download/cdn-west/mp3/file1.mp3

server {
    ...
    rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
    rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra  last;
    return  403;
    ...
}

要在 NGINX 中實現類似 Apache 的效果,你可以在第一個伺服器塊中匹配短 URL 的請求,然後把它們重定向到匹配長 URL 的第二個伺服器塊。

# USE THIS CONVERSION
server {
    listen      80;
    server_name example.org;
    return      301 http://www.example.org$request_uri;
}

server {
    listen      80;
    server_name www.example.org;
    ...
}

技巧 8---實施負載均衡

擴充網站容量、提高網站可用性的終極辦法就是執行多臺應用程式伺服器並實施負載均衡。

利用 NGINX 最大化 Python 效能,第二部分:負載均衡和監控

配備 NGINX 的負載均衡 PHP 伺服器,要實現 NGINX 負載均衡,首先用你需要均衡的各個伺服器來建立一個伺服器群組。然後編寫配置程式碼,程式碼包括伺服器權重---如果伺服器的處理能力較強,請給它分配較大的權重,給它送去更多流量。

upstream stream_backend {
    server backend1.example.com:12345 weight=5;
    server backend2.example.com:12345;
    server backend3.example.com:12346;
}

技巧 9---啟用會話持續性和會話耗盡

網路預設用於無狀態互動;如果需要特定狀態的資訊,可以通過若干方法來實施。如果狀態位於應用程式伺服器上,就得讓這臺伺服器在會話期間處理指定使用者的所有請求,這就叫做會話持續。

要管理多個負載均衡的伺服器,會話耗盡是一項有效工具。利用 NGINX Plus在一臺伺服器上的上游群組中設定耗盡引數,NGINX Plus 會讓這臺伺服器放鬆下來,不會給它傳送新的請求,而是讓現有連線繼續下去,直到會話結束。

技巧 10---啟用監控和管理功能

如果伺服器配置較為複雜,在保持高效能和避免當機時,監測和管理就變得尤其重要。監控 NGINX 狀態頁,在伺服器可能遇到麻煩時通知使用者,讓使用者監測自己的系統,根據資訊在問題發生前採取行動。

NGINX 提供了一個內建控制皮膚來監測 NGINX 伺服器的健康狀況。你可以收集 NGIGX 皮膚資料確定每臺特定伺服器是否有問題。

利用 NGINX 最大化 Python 效能,第二部分:負載均衡和監控

結論

Python 建立的網站要能夠同時吸引眾多使用者,那就需要強大的效能支援,如果你採用的是 Nginx 做 Web 伺服器,可以從上面10個方面來優化效能。

OneAPM 能夠幫你實現 Python 應用層面程式碼級監控,也能夠實現 Nginx 等基礎元件等監控。想閱讀更多技術文章,請訪問 OneAPM 官方技術部落格

本文轉自 OneAPM 官方部落格

原文地址:Maximizing Python Performance with NGINX, Part II: Load Balancing and Monitoring

相關文章