天天看點

利用 NGINX 最大化 Python 性能,第一部分:Web 服務和緩存

python 的著名之處在于使用簡單友善,軟體開發簡單,而且據說運作性能優于其它腳本語言。(雖然最新版本的 php、php 7 可能會與它展開激烈競争。)

所有人都希望自己的網站和應用程式運作得更快一些。但是,每個網站在流量增長或驟然出現流量峰值時都很容易發生性能問題、甚至當機(這一般會在伺服器最繁忙的時候發生)。此外在運作期間,無論是流量穩步增長還是使用量急速飛漲,幾乎所有的網站都會經曆性能問題。

而關于網站性能問題,那就到了 nginx 和 nginx plus 發揮作用的時候。一般可以通過以下三種方式改善網站性能:

做多個應用程式伺服器的負載均衡器---首先要部署反向代理伺服器,然後同時運作多個應用程式伺服器,并使用 nginx 或 nginx plus 來均衡經過它們傳送的流量,進行擴充。通過這種部署,你可以輕松的根據流量需求來衡量網站性能,增加可靠度和正常運作時間。如果你需要既定的使用者會話儲存在同一個伺服器上,配置負載均衡器還可以支援會話持久性。

無論是将其用作 python 的 web 伺服器、反向代理伺服器、負載均衡器,還是同時使用以上三種功能,nginx 和 nginx plus 都能帶來很大好處。

下面介紹改善 python 應用程式性能的5個技巧,本文會分多個章節進行介紹,包括把 nginx 和 nginx plus 作為 web 伺服器,如何實施靜态檔案緩存,以及微程式緩存應用程式生成檔案。

再就是下篇文章會介紹如何把 nginx 和 nginx plus 當作反向代理伺服器和多個應用程式伺服器的負載均衡器。

檢驗 python 應用程式的性能分有兩種不同情況。

第一種是在日常合理使用者數量的情況下;第二種則是負載很大的情況下。

另一個就是所有人都擔心的情境:網站繁忙時出現的性能問題,例如運作嚴重減緩和崩潰。此外,很多黑客攻擊也會表現為使用者數量急劇增長,是以改善網站性能也是解決攻擊問題的重要一步。

伺服器會為每位使用者配置設定一定數量的記憶體,例如 apache http 伺服器,随着使用者數量的增長,實體記憶體就會出現超負載,伺服器開始将資料交換到磁盤上,性能驟降,随之産生性能不良和崩潰。而使用 nginx 将會有助于解決這一問題。

python 尤其容易發生記憶體相關的性能問題,因為它在執行任務時一般比其它腳本語言占用更多的記憶體(是以它的執行速度更高)。是以,在同等條件下,基于 python 的應用程式可能比其他語言的應用程式能承受的使用者負載量更小。

優化應用程式或多或少會有幫助,但是這通常不是流量相關網站性能問題的最佳或最快解決方案。本文後續會列出解決流量相關問題的最佳/最快解決方案。當你看完本文後,無論如何都要回去優化你的應用程式,或者使用微服務架構重寫。

小網站隻要配置單一伺服器就可以運作良好,大網站則需要有多個伺服器。而如果你處于中間地帶,或者你的網站正在由小網站發展壯大起來,那你就要做些有意思的選擇了。

如果你隻具配置有單一伺服器的能力,那麼在流量峰值或整體流量迅速增長時,你會面臨極大風險。因為此時你的擴充性會受限,此時解決問題的方法可以包括優化應用程式、把網絡伺服器改成 nginx、換一個更大更快的伺服器,或者把存儲任務轉移到内容分發網絡(cdn)等。這其中每一個選項都需要耗費時間、成本,并且在實施過程中都可能會引入錯誤和問題。

此外,配置單一伺服器的情況下,你的網站就有一個單一的失敗節點,會有很多問題造成你的網站下線而且沒有很快很簡捷的解決方法。

利用 NGINX 最大化 Python 性能,第一部分:Web 服務和緩存

如果把配置單一伺服器改成使用 nginx,可以自由選擇開源 nginx 軟體或 nginx plus。nginx plus 包含企業級支援及額外功能。有些額外功能可以在單一伺服器配置狀況下實作,例如實時活動監控,而有些功能隻有在把 nginx plus 作為多個伺服器配置下的反向代理伺服器時才會出現,例如負載均衡和會話持久性。

綜合以上所有考慮,除非你确信你的網站在接下來很長時間都不會擴大規模,停止運作也不會有大麻煩,可以抵抗一些其他的風險,那可以配置單一伺服器。但别忘了配置多個伺服器幾乎可以随意擴充---單次失敗完全可以處理,能迅速擴充容量,總之你應用的性能由你來定。

tip 3 – change your web server to nginx

在網絡發展早期,apache等同于web 伺服器。但是21世紀初 nginx 誕生之後使用越來越廣泛,它已經成為世界上流量前1000、10000和100000的公司的 web 伺服器首選。

以下為 nginx 架構的概述。

利用 NGINX 最大化 Python 性能,第一部分:Web 服務和緩存

在本圖中,是一個 python 應用程式伺服器的背景應用程式塊,需要通過 fastcgi 來通路。nginx 并不知道如何運作 python,是以它需要關口來進入一個能夠運作 python 的環境。fastcgi 是 php、python 等語言廣泛使用的使用者界面。

不過,python 和 nginx 之間的溝通更常用的備選是服務網關接口(wsgi)。wsgi 可以在多線程、多程序環境下運作,是以它可以在本文提到的所有配置選擇下運作。

如果你要把 nginx 作成你的 web 伺服器,網上有很多操作幫助資訊:

配置 gunicorn---綠色獨角獸,一個很有名的 wsgi 伺服器,以便使用 nginx。

配置 uwsgi---另外一個有名的 wsgi 伺服器,以便使用 nginx。uwsgi 能夠直接支援 nginx。

以下片段展示了如何配置 nginx 來與 uwsgi 一起運作(給出的執行個體是使用 python 架構 django 的一個項目):

靜态資料緩存包括把那些不經常變更的檔案(也許是幾個小時,也許是永遠不變)存在一個應用程式伺服器之外的地方。靜态檔案的典型例子就是作為網頁内容一部分展示的 jpeg 圖像。

靜态檔案緩存是增強應用程式性能的常見方法,而且實際上會在下面幾個層面發生:

在使用者的浏覽器

多個層級的網絡提供者---從一家公司的内網,到網際網路服務供應商(isp)

web 伺服器上,正如本文所述

在 web 伺服器上實施靜态資料緩存有兩個好處:

更快傳送到使用者---nginx 針對靜态資料緩存做了優化,執行靜态内容的請求的速度比應用程式伺服器快得多。

減輕應用伺服器的負擔---應用伺服器甚至不會收到緩存靜态資料的請求,因為網絡伺服器已經實作這些請求。

靜态檔案緩存在單個伺服器執行時運作良好,但其實硬體方面依然由 web 伺服器和應用程式伺服器共享。如果 web 伺服器使用硬體找回緩存的檔案(及時非常高效)應用程式将無法使用這些硬體,運作速度可能會受到影響。

下面的代碼配置 nginx,用于緩存包括 jpeg 檔案、gif、png檔案、mp4 視訊檔案、ppt等多種類型的靜态檔案(用你的網址來替代 www.example.com ):

微程式緩存給了那些運作 python、php 和其它語言的應用程式伺服器提升性能的大好機會。可緩存的網頁有以下3種類型:

靜态檔案---可緩存,見技巧4。

應用程式生成的、非個人化頁面---一般來說,緩存這些沒有意義,因為這些内容需要不斷更新。舉個例子,使用者登入電商網站時看到的頁面(見下段)---在售商品、同類商品推薦等等可能會不斷更新,是以提供最新的網頁非常重要。不過,如果另一個使用者在十分之一秒之後登入,向他們展示前一位使用者看到的同樣頁面也沒有什麼問題。

應用程式生成的、個人化頁面---這些通常不會被緩存,因為它們是單個使用者所屬,而且同一個使用者也不會再次看到相同的頁面。舉個例子,使用者登入電商網站後看到的頁面,同樣的頁面不能向其他使用者展示。

利用 NGINX 最大化 Python 性能,第一部分:Web 服務和緩存

微程式緩存對上述第二種網頁類型很有用---應用程式生成的、非個人化頁面。微是一個概括的時間範圍。如果你的網站一秒之内數次生成同樣的頁面,緩存一秒鐘就不會影響網頁的新鮮度。不過這個概括的緩存時間期限會極大地減輕應用程式伺服器的負擔,尤其是流程峰值期間。在緩存逾時期限内,不用生成10次、20次、100次(相同的内容),而是生成既定的網頁一次,然後這個網頁就會被緩存,并且通過緩存向多個使用者展示。

而這産生的效果卻不可思議,伺服器一秒鐘處理大量請求運作緩慢,但在隻處理一個請求時速度是極快的。(當然,還有任何個人化的頁面)。設定一秒逾時的代理伺服器這樣的核心變化隻需要幾行配置代碼。

在這部分,本文介紹了提升單一伺服器提升 python 應用性能的解決方案,可以在單一伺服器上配置,也可在反向代理伺服器或單獨的緩存伺服器上實作。(緩存在單獨的伺服器上運作更好。)接下來的第二部分介紹需要兩個或更多伺服器才能實作的性能提升方案。

原文位址:maximizing python performance with nginx, part i: web serving and caching