摘要:無論是將其用作的服務(wù)器反向代理服務(wù)器負(fù)載均衡器,還是同時(shí)使用以上三種功能,和都能帶來很大好處。再就是下篇文章會(huì)介紹如何把和當(dāng)作反向代理服務(wù)器和多個(gè)應(yīng)用程序服務(wù)器的負(fù)載均衡器。而使用將會(huì)有助于解決這一問題。
【編者按】本文主要介紹 nginx 的主要功能以及如何通過 NGINX 優(yōu)化 Python 應(yīng)用性能。本文系國內(nèi) ITOM 管理平臺(tái) OneAPM 編譯呈現(xiàn)。
Python 的著名之處在于使用簡單方便,軟件開發(fā)簡單,而且據(jù)說運(yùn)行性能優(yōu)于其它腳本語言。(雖然最新版本的 PHP、PHP 7 可能會(huì)與它展開激烈競爭。)
所有人都希望自己的網(wǎng)站和應(yīng)用程序運(yùn)行得更快一些。但是,每個(gè)網(wǎng)站在流量增長或驟然出現(xiàn)流量峰值時(shí)都很容易發(fā)生性能問題、甚至宕機(jī)(這一般會(huì)在服務(wù)器最繁忙的時(shí)候發(fā)生)。此外在運(yùn)行期間,無論是流量穩(wěn)步增長還是使用量急速飛漲,幾乎所有的網(wǎng)站都會(huì)經(jīng)歷性能問題。
而關(guān)于網(wǎng)站性能問題,那就到了 NGINX 和 NGINX Plus 發(fā)揮作用的時(shí)候。一般可以通過以下三種方式改善網(wǎng)站性能:
作 web 服務(wù)器,NGINX 最開始的設(shè)計(jì)初衷就是解決 C10K 問題,也就是能夠輕松支持1萬以上的同時(shí)訪問。NGINX 作為 Python web 服務(wù)器,可以保證網(wǎng)站在流量較低時(shí)依然能夠快速運(yùn)行。當(dāng)擁有上千名用戶同時(shí)訪問時(shí),你就必須提供更高性能、更少崩潰和更短停機(jī)時(shí)間的 web 服務(wù)器。你也可以在 NGINX 服務(wù)器上進(jìn)行靜態(tài)文件緩存或微程序緩存,不過這兩者在多帶帶的 NGINX 反向代理服務(wù)器(見下段)上運(yùn)行表現(xiàn)更佳。
做反向代理服務(wù)器---你可以在當(dāng)前應(yīng)用程序服務(wù)器上把 NGINX 設(shè)置為反向代理服務(wù)器。NGINX 會(huì)將網(wǎng)絡(luò)請(qǐng)求發(fā)送到應(yīng)用程序服務(wù)器。這種古怪招數(shù)可以提高網(wǎng)站運(yùn)行速度,減少停機(jī)時(shí)間,減少服務(wù)器資源占用,并且提高網(wǎng)站安全。你還可以在反向代理服務(wù)器上緩存靜態(tài)數(shù)據(jù)(非常高效),增加動(dòng)態(tài)數(shù)據(jù)的微程序緩存,從而減少應(yīng)用程序本身的負(fù)擔(dān)。
做多個(gè)應(yīng)用程序服務(wù)器的負(fù)載均衡器---首先要部署反向代理服務(wù)器,然后同時(shí)運(yùn)行多個(gè)應(yīng)用程序服務(wù)器,并使用 NGINX 或 NGINX Plus 來均衡經(jīng)過它們傳送的流量,進(jìn)行擴(kuò)展。通過這種部署,你可以輕松的根據(jù)流量需求來衡量網(wǎng)站性能,增加可靠度和正常運(yùn)行時(shí)間。如果你需要既定的用戶會(huì)話保存在同一個(gè)服務(wù)器上,配置負(fù)載均衡器還可以支持會(huì)話持久性。
無論是將其用作 Python 的 web 服務(wù)器、反向代理服務(wù)器、負(fù)載均衡器,還是同時(shí)使用以上三種功能,NGINX 和 NGINX Plus 都能帶來很大好處。
下面介紹改善 Python 應(yīng)用程序性能的5個(gè)技巧,本文會(huì)分多個(gè)章節(jié)進(jìn)行介紹,包括把 NGINX 和 NGINX Plus 作為 web 服務(wù)器,如何實(shí)施靜態(tài)文件緩存,以及微程序緩存應(yīng)用程序生成文件。
再就是下篇文章會(huì)介紹如何把 NGINX 和 NGINX Plus 當(dāng)作反向代理服務(wù)器和多個(gè)應(yīng)用程序服務(wù)器的負(fù)載均衡器。
技巧1---找出 Python 性能瓶頸檢驗(yàn) Python 應(yīng)用程序的性能分有兩種不同情況。
第一種是在日常合理用戶數(shù)量的情況下;第二種則是負(fù)載很大的情況下。
很多站長毫不關(guān)心輕負(fù)載時(shí)網(wǎng)站性能,然而殘酷的現(xiàn)實(shí)經(jīng)驗(yàn)告訴我們,響應(yīng)時(shí)間的每一秒鐘都應(yīng)該為之捏一把汗。雖然將響應(yīng)時(shí)間縮短幾毫秒是個(gè)苦差事,但卻會(huì)帶來更好的用戶體驗(yàn)和更好的運(yùn)營成果。
另一個(gè)就是所有人都擔(dān)心的情境:網(wǎng)站繁忙時(shí)出現(xiàn)的性能問題,例如運(yùn)行嚴(yán)重減緩和崩潰。此外,很多黑客攻擊也會(huì)表現(xiàn)為用戶數(shù)量急劇增長,所以改善網(wǎng)站性能也是解決攻擊問題的重要一步。
服務(wù)器會(huì)為每位用戶分配一定數(shù)量的內(nèi)存,例如 Apache HTTP 服務(wù)器,隨著用戶數(shù)量的增長,物理內(nèi)存就會(huì)出現(xiàn)超負(fù)載,服務(wù)器開始將數(shù)據(jù)交換到磁盤上,性能驟降,隨之產(chǎn)生性能不良和崩潰。而使用 NGINX 將會(huì)有助于解決這一問題。
Python 尤其容易發(fā)生內(nèi)存相關(guān)的性能問題,因?yàn)樗趫?zhí)行任務(wù)時(shí)一般比其它腳本語言占用更多的內(nèi)存(因此它的執(zhí)行速度更高)。因此,在同等條件下,基于 Python 的應(yīng)用程序可能比其他語言的應(yīng)用程序能承受的用戶負(fù)載量更小。
優(yōu)化應(yīng)用程序或多或少會(huì)有幫助,但是這通常不是流量相關(guān)網(wǎng)站性能問題的最佳或最快解決方案。本文后續(xù)會(huì)列出解決流量相關(guān)問題的最佳/最快解決方案。當(dāng)你看完本文后,無論如何都要回去優(yōu)化你的應(yīng)用程序,或者使用微服務(wù)架構(gòu)重寫。
技巧2---選擇單一服務(wù)器或多個(gè)服務(wù)器配置小網(wǎng)站只要配置單一服務(wù)器就可以運(yùn)行良好,大網(wǎng)站則需要有多個(gè)服務(wù)器。而如果你處于中間地帶,或者你的網(wǎng)站正在由小網(wǎng)站發(fā)展壯大起來,那你就要做些有意思的選擇了。
如果你只具配置有單一服務(wù)器的能力,那么在流量峰值或整體流量迅速增長時(shí),你會(huì)面臨極大風(fēng)險(xiǎn)。因?yàn)榇藭r(shí)你的擴(kuò)展性會(huì)受限,此時(shí)解決問題的方法可以包括優(yōu)化應(yīng)用程序、把網(wǎng)絡(luò)服務(wù)器改成 NGINX、換一個(gè)更大更快的服務(wù)器,或者把存儲(chǔ)任務(wù)轉(zhuǎn)移到內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN)等。這其中每一個(gè)選項(xiàng)都需要耗費(fèi)時(shí)間、成本,并且在實(shí)施過程中都可能會(huì)引入錯(cuò)誤和問題。
此外,配置單一服務(wù)器的情況下,你的網(wǎng)站就有一個(gè)單一的失敗節(jié)點(diǎn),會(huì)有很多問題造成你的網(wǎng)站下線而且沒有很快很簡捷的解決方法。
如果把配置單一服務(wù)器改成使用 NGINX,可以自由選擇開源 NGINX 軟件或 NGINX Plus。NGINX Plus 包含企業(yè)級(jí)支持及額外功能。有些額外功能可以在單一服務(wù)器配置狀況下實(shí)現(xiàn),例如實(shí)時(shí)活動(dòng)監(jiān)控,而有些功能只有在把 NGINX Plus 作為多個(gè)服務(wù)器配置下的反向代理服務(wù)器時(shí)才會(huì)出現(xiàn),例如負(fù)載均衡和會(huì)話持久性。
綜合以上所有考慮,除非你確信你的網(wǎng)站在接下來很長時(shí)間都不會(huì)擴(kuò)大規(guī)模,停止運(yùn)行也不會(huì)有大麻煩,可以抵抗一些其他的風(fēng)險(xiǎn),那可以配置單一服務(wù)器。但別忘了配置多個(gè)服務(wù)器幾乎可以隨意擴(kuò)展---單次失敗完全可以處理,能迅速擴(kuò)充容量,總之你應(yīng)用的性能由你來定。
Tip 3 – Change Your Web Server to NGINX
在網(wǎng)絡(luò)發(fā)展早期,Apache等同于web 服務(wù)器。但是21世紀(jì)初 NGINX 誕生之后使用越來越廣泛,它已經(jīng)成為世界上流量前1000、10000和100000的公司的 web 服務(wù)器首選。
NGINX 的設(shè)計(jì)初衷是解決 C10K 問題,也就是在給定內(nèi)存預(yù)算的范圍內(nèi)能支持10000以上的同時(shí)訪問。其它 web 服務(wù)器需要給每個(gè)訪問分配一部分內(nèi)存,但當(dāng)幾千名用戶同時(shí)訪問網(wǎng)站時(shí),它們會(huì)面臨物理內(nèi)存不足、運(yùn)行緩慢或崩潰的問題。NGINX 分別處理每個(gè)請(qǐng)求,并且能優(yōu)雅地應(yīng)對(duì)更多用戶。(如上文所述,它在其它功能方面也有優(yōu)異表現(xiàn)。)
以下為 NGINX 架構(gòu)的概述。
在本圖中,是一個(gè) Python 應(yīng)用程序服務(wù)器的后臺(tái)應(yīng)用程序塊,需要通過 FastCGI 來訪問。NGINX 并不知道如何運(yùn)行 Python,因此它需要關(guān)口來進(jìn)入一個(gè)能夠運(yùn)行 Python 的環(huán)境。FastCGI 是 PHP、Python 等語言廣泛使用的用戶界面。
不過,Python 和 NGINX 之間的溝通更常用的備選是服務(wù)網(wǎng)關(guān)接口(WSGI)。WSGI 可以在多線程、多進(jìn)程環(huán)境下運(yùn)行,因此它可以在本文提到的所有配置選擇下運(yùn)行。
如果你要把 NGINX 作成你的 web 服務(wù)器,網(wǎng)上有很多操作幫助信息:
配置 gunicorn---綠色獨(dú)角獸,一個(gè)很有名的 WSGI 服務(wù)器,以便使用 NGINX。
配置 uWSGI---另外一個(gè)有名的 WSGI 服務(wù)器,以便使用 NGINX。uWSGI 能夠直接支持 NGINX。
使用 uWSGI、NGINX 和 Django---一個(gè)很常用的 Python 網(wǎng)站框架。
以下片段展示了如何配置 NGINX 來與 uWSGI 一起運(yùn)行(給出的實(shí)例是使用 Python 框架 Django 的一個(gè)項(xiàng)目):
http { ... upstream django { server 127.0.0.1:29000; } server { listen 80; server_name myapp.example.com; root /var/www/myapp/html; location / { index index.html; } location /static/ { alias /var/django/projects/myapp/static/; } location /main { include /etc/nginx/uwsgi_params; uwsgi_pass django; uwsgi_param Host $host; uwsgi_param X-Real-IP $remote_addr; uwsgi_param X-Forwarded-For $proxy_add_x_forwarded_for; uwsgi_param X-Forwarded-Proto $http_x_forwarded_proto; } } }技巧4——實(shí)施靜態(tài)數(shù)據(jù)緩存
靜態(tài)數(shù)據(jù)緩存包括把那些不經(jīng)常變更的文件(也許是幾個(gè)小時(shí),也許是永遠(yuǎn)不變)存在一個(gè)應(yīng)用程序服務(wù)器之外的地方。靜態(tài)文件的典型例子就是作為網(wǎng)頁內(nèi)容一部分展示的 JPEG 圖像。
靜態(tài)文件緩存是增強(qiáng)應(yīng)用程序性能的常見方法,而且實(shí)際上會(huì)在下面幾個(gè)層面發(fā)生:
在用戶的瀏覽器
多個(gè)層級(jí)的網(wǎng)絡(luò)提供者---從一家公司的內(nèi)網(wǎng),到互聯(lián)網(wǎng)服務(wù)供應(yīng)商(ISP)
web 服務(wù)器上,正如本文所述
在 web 服務(wù)器上實(shí)施靜態(tài)數(shù)據(jù)緩存有兩個(gè)好處:
更快傳送到用戶---NGINX 針對(duì)靜態(tài)數(shù)據(jù)緩存做了優(yōu)化,執(zhí)行靜態(tài)內(nèi)容的請(qǐng)求的速度比應(yīng)用程序服務(wù)器快得多。
減輕應(yīng)用服務(wù)器的負(fù)擔(dān)---應(yīng)用服務(wù)器甚至不會(huì)收到緩存靜態(tài)數(shù)據(jù)的請(qǐng)求,因?yàn)榫W(wǎng)絡(luò)服務(wù)器已經(jīng)實(shí)現(xiàn)這些請(qǐng)求。
靜態(tài)文件緩存在單個(gè)服務(wù)器執(zhí)行時(shí)運(yùn)行良好,但其實(shí)硬件方面依然由 web 服務(wù)器和應(yīng)用程序服務(wù)器共享。如果 web 服務(wù)器使用硬件找回緩存的文件(及時(shí)非常高效)應(yīng)用程序?qū)o法使用這些硬件,運(yùn)行速度可能會(huì)受到影響。
要支持瀏覽器緩存,就要為靜態(tài)文件正確設(shè)置 HTTP 標(biāo)頭。需要考慮 HTTP 緩存控制標(biāo)頭(尤其是它的 max?age 設(shè)置)、Expires 標(biāo)頭和實(shí)體標(biāo)簽。如想了解更多這方面的介紹,可以參考 Using NGINX as an Application Gateway with uWSGI and Django。
下面的代碼配置 NGINX,用于緩存包括 JPEG 文件、GIF、PNG文件、MP4 視頻文件、ppt等多種類型的靜態(tài)文件(用你的網(wǎng)址來替代 www.example.com ):
server { # substitute your web server"s URL for "www.example.com" server_name www.example.com; root /var/www/example.com/htdocs; index index.php; access_log /var/log/nginx/example.com.access.log; error_log /var/log/nginx/example.com.error.log; location / { try_files $uri $uri/ /index.php?$args; } location ~ .php$ { try_files $uri =404; include fastcgi_params; # substitute the socket, or address and port, of your Python server fastcgi_pass unix:/var/run/php5-fpm.sock; #fastcgi_pass 127.0.0.1:9000; } location ~* .(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg |jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid |midi|wav|bmp|rtf)$ { expires max; log_not_found off; access_log off; } }技巧5---實(shí)施微程序緩存
微程序緩存給了那些運(yùn)行 Python、PHP 和其它語言的應(yīng)用程序服務(wù)器提升性能的大好機(jī)會(huì)。可緩存的網(wǎng)頁有以下3種類型:
靜態(tài)文件---可緩存,見技巧4。
應(yīng)用程序生成的、非個(gè)人化頁面---一般來說,緩存這些沒有意義,因?yàn)檫@些內(nèi)容需要不斷更新。舉個(gè)例子,用戶登錄電商網(wǎng)站時(shí)看到的頁面(見下段)---在售商品、同類商品推薦等等可能會(huì)不斷更新,因此提供最新的網(wǎng)頁非常重要。不過,如果另一個(gè)用戶在十分之一秒之后登錄,向他們展示前一位用戶看到的同樣頁面也沒有什么問題。
應(yīng)用程序生成的、個(gè)人化頁面---這些通常不會(huì)被緩存,因?yàn)樗鼈兪菃蝹€(gè)用戶所屬,而且同一個(gè)用戶也不會(huì)再次看到相同的頁面。舉個(gè)例子,用戶登錄電商網(wǎng)站后看到的頁面,同樣的頁面不能向其他用戶展示。
微程序緩存對(duì)上述第二種網(wǎng)頁類型很有用---應(yīng)用程序生成的、非個(gè)人化頁面。微是一個(gè)概括的時(shí)間范圍。如果你的網(wǎng)站一秒之內(nèi)數(shù)次生成同樣的頁面,緩存一秒鐘就不會(huì)影響網(wǎng)頁的新鮮度。不過這個(gè)概括的緩存時(shí)間期限會(huì)極大地減輕應(yīng)用程序服務(wù)器的負(fù)擔(dān),尤其是流程峰值期間。在緩存逾時(shí)期限內(nèi),不用生成10次、20次、100次(相同的內(nèi)容),而是生成既定的網(wǎng)頁一次,然后這個(gè)網(wǎng)頁就會(huì)被緩存,并且通過緩存向多個(gè)用戶展示。
而這產(chǎn)生的效果卻不可思議,服務(wù)器一秒鐘處理大量請(qǐng)求運(yùn)行緩慢,但在只處理一個(gè)請(qǐng)求時(shí)速度是極快的。(當(dāng)然,還有任何個(gè)人化的頁面)。設(shè)置一秒超時(shí)的代理服務(wù)器這樣的核心變化只需要幾行配置代碼。
proxy_cache_path /tmp/cache keys_zon=cache:10m levels=1:2 inactive=600s max_size=100m; server { proxy_cache cache; proxy_cache_valid 200 1s; ... }
更多配置范例,請(qǐng)參考 Tyler Hicks?Wright 的博客 Python and uWSGI with NGINX.。
結(jié)論在這部分,本文介紹了提升單一服務(wù)器提升 Python 應(yīng)用性能的解決方案,可以在單一服務(wù)器上配置,也可在反向代理服務(wù)器或多帶帶的緩存服務(wù)器上實(shí)現(xiàn)。(緩存在多帶帶的服務(wù)器上運(yùn)行更好。)接下來的第二部分介紹需要兩個(gè)或更多服務(wù)器才能實(shí)現(xiàn)的性能提升方案。
當(dāng)然如果你想了解 NGINX Plus 適用于你的應(yīng)用程序的高級(jí)功能,例如支持、實(shí)時(shí)活動(dòng)監(jiān)控、運(yùn)行時(shí)同時(shí)配置,可以去 NGINX 官網(wǎng)查看。
OneAPM 能夠幫你查看 Python 應(yīng)用程序的方方面面,不僅能夠監(jiān)控終端的用戶體驗(yàn),還能監(jiān)控服務(wù)器性能,同時(shí)還支持追蹤數(shù)據(jù)庫、第三方 API 和 Web 服務(wù)器的各種問題。想閱讀更多技術(shù)文章,請(qǐng)?jiān)L問 OneAPM 官方技術(shù)博客。
本文轉(zhuǎn)自 OneAPM 官方博客
原文地址:Maximizing Python Performance with NGINX, Part I: Web Serving and Caching
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/39292.html
摘要:無論是將其用作的服務(wù)器反向代理服務(wù)器負(fù)載均衡器,還是同時(shí)使用以上三種功能,和都能帶來很大好處。再就是下篇文章會(huì)介紹如何把和當(dāng)作反向代理服務(wù)器和多個(gè)應(yīng)用程序服務(wù)器的負(fù)載均衡器。而使用將會(huì)有助于解決這一問題。 【編者按】本文主要介紹 nginx 的主要功能以及如何通過 NGINX 優(yōu)化 Python 應(yīng)用性能。本文系國內(nèi) ITOM 管理平臺(tái) OneAPM 編譯呈現(xiàn)。 Python 的著名之...
摘要:現(xiàn)有的服務(wù)器和應(yīng)用程序服務(wù)器相結(jié)合并在一個(gè)冒泡中運(yùn)行,無法直接接觸網(wǎng)絡(luò)流量,由反向代理服務(wù)器提出填鴨式請(qǐng)求。賦予高可用性讓你的反向代理服務(wù)器鏡像到在線備份,同時(shí)擁有備用的應(yīng)用程序服務(wù)器,讓你的站點(diǎn)高度可用。 【編者按】本文主要介紹 NGINX 的主要功能以及如何通過 Nginx 優(yōu)化 Python 應(yīng)用性能。本文系國內(nèi) ITOM 管理平臺(tái) OneAPM 編譯呈現(xiàn)。 本文上一篇系: 利用...
摘要:現(xiàn)有的服務(wù)器和應(yīng)用程序服務(wù)器相結(jié)合并在一個(gè)冒泡中運(yùn)行,無法直接接觸網(wǎng)絡(luò)流量,由反向代理服務(wù)器提出填鴨式請(qǐng)求。賦予高可用性讓你的反向代理服務(wù)器鏡像到在線備份,同時(shí)擁有備用的應(yīng)用程序服務(wù)器,讓你的站點(diǎn)高度可用。 【編者按】本文主要介紹 NGINX 的主要功能以及如何通過 Nginx 優(yōu)化 Python 應(yīng)用性能。本文系國內(nèi) ITOM 管理平臺(tái) OneAPM 編譯呈現(xiàn)。 本文上一篇系: 利用...
摘要:服務(wù)器市場份額。子進(jìn)程負(fù)責(zé)創(chuàng)建由指令設(shè)置的服務(wù)器線程,同時(shí)還負(fù)責(zé)監(jiān)聽接收到的請(qǐng)求,并將請(qǐng)求分發(fā)給處理線程。在版本引入了模塊,這個(gè)模塊基于模塊創(chuàng)建的,并加入了獨(dú)立的監(jiān)聽線程來管理請(qǐng)求處理完成后的休眠的連接。基于事件的服務(wù)器完勝。 譯文首發(fā)于 Apache 與 Nginx 性能對(duì)比:Web 服務(wù)器優(yōu)化技術(shù),轉(zhuǎn)載請(qǐng)注明出處。 多年前 Apache 基金會(huì) Web 服務(wù)器 簡稱「Apache」...
摘要:服務(wù)器市場份額。子進(jìn)程負(fù)責(zé)創(chuàng)建由指令設(shè)置的服務(wù)器線程,同時(shí)還負(fù)責(zé)監(jiān)聽接收到的請(qǐng)求,并將請(qǐng)求分發(fā)給處理線程。在版本引入了模塊,這個(gè)模塊基于模塊創(chuàng)建的,并加入了獨(dú)立的監(jiān)聽線程來管理請(qǐng)求處理完成后的休眠的連接。基于事件的服務(wù)器完勝。 譯文首發(fā)于 Apache 與 Nginx 性能對(duì)比:Web 服務(wù)器優(yōu)化技術(shù),轉(zhuǎn)載請(qǐng)注明出處。 多年前 Apache 基金會(huì) Web 服務(wù)器 簡稱「Apache」...
閱讀 3668·2021-11-24 09:39
閱讀 1274·2021-09-30 09:48
閱讀 3257·2021-09-09 11:51
閱讀 2883·2021-09-08 10:41
閱讀 1328·2019-08-30 14:06
閱讀 2797·2019-08-30 14:01
閱讀 873·2019-08-29 17:11
閱讀 3168·2019-08-29 15:37