您好,登錄后才能下訂單哦!
如何提升Nginx性能?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
如果你的Web應用只跑在一臺機器上,那要提升其性能非常簡單:換一臺更快的,多配幾個處理器,多加幾條內存,磁盤陣列也要高速的。換了以后,這臺機器上跑的WordPress服務器、Node.js或Java應用速度都會加快。(要是應用還會訪問另一臺數據庫服務器,那也簡單:找兩臺更快的機器,用更快的網絡連起來就行了)
麻煩在于,機器速度并不是問題。很多時候Web應用慢,是因為要在各種任務之間切換,一會兒要處理數千個連接上的用戶請求,一會兒要向磁盤讀寫文件,一會兒又要運行應用的代碼,一會兒又要去干別的。應用服務器因此可能出現各種狀況,耗盡內存、交換文件,或者讓很多請求等待一個硬盤I/O之類的任務。除了升級硬件,其實你還可以選擇另外一種完全不同的方法:加一臺反向代理服務器,分擔上述一些任務。反向代理服務器位于運行應用的機器之前,負責處理來自外網的請求。反向代理服務器直接連到互聯網,它與應用服務器通信使用的是快速的內部網絡。反向代理服務器可以讓應用服務器專注于構建頁面,然后交給反向代理向外網發送,而不必理會用戶與應用的交互。由于不必等待客戶端的響應,應用服務器的運行速度能達到接近最優的水平。
增加反向代理服務器同時也可以為Web服務器增添靈活性。比如,假設執行某種任務的服務器過載了,那隨時可以再增加一臺同類服務器;而如果這臺服務器掛了,替換它也很容易。鑒于這種靈活性,反向代理服務器往往也是其他性能優化手段的先決條件,比如:
NGINX專門為使用反向代理服務器做了設計,使其天然支持上述優化。由于使用事件驅動的處理機制,NGINX比傳統服務器效率更高。NGINX Plus則增加了更高端的反向代理功能,如應用體檢、特有的請求路由、高級緩存和售后支持。
建議二:增加負載均衡服務器
增加負載均衡服務器相對簡單,但卻能顯著提升站點性能和安全性。通過它把流量分配給多個服務器,就可以不必升級Web服務器了。就算應用本身寫得不太好,或者難以擴展,負載均衡都可以在不做其他改變的情況下提升用戶體驗。
負載均衡服務器首先是一個反向代理服務器(參見“建議一”),負責把來自互聯網的請求轉發給其他服務器。這里關鍵在于負載均衡服務器可以支持兩臺以上的應用服務器,使用一種選擇算法在不同的服務器間分配請求。最簡單的負載均衡算法是循環調度,即把新請求依次轉發給可用服務器中的下一臺服務器。其他算法還有把請求發給活動連接最少的服務器。NGINX Plus支持一種功能,就是把用戶會話保持在同一臺服務器上,叫做會話保持。負載均衡服務器可以避免一臺服務器過載而其他服務器過閑,從而極大提升性能。同時,有了它還可以讓Web服務器擴容更簡單,因為可以選用比較便宜的服務器,同時保證物盡其用。可以通過負載均衡調度的協議包括HTTP、HTTPS、SPDY、HTTP/2、WebSocket、FastCGI、SCGI、uwsgi、memcached,以及其他一些應用形式,包括基于TCP的應用和其他第四層的協議。為此,首先要分析Web應用,看性能短板在哪里,然后再確定使用哪一個。同一臺服務器或用于負載均衡的服務器也可以承擔其他任務,比如SSL終止、視客戶端不同支持HTTP/1/x或HTTP/2、緩存靜態文件。NGINX經常被用來做負載均衡,更多信息請參考我們以前發的介紹性文章、有關配置的文章、電子書和相關的在線視頻,當然還有文檔。我們的商業版本NGINX Plus支持更多的負載均衡功能,如基于服務器響應時間路由負載和支持微軟NTLM協議的負載均衡。
建議三:緩存靜態及動態內容
緩存能提升Web應用性能,因為可以更快地把內容交付給客戶端。緩存的策略包括預處理內容、在較快的設備上存儲內容、把內容保存在靠近客戶端的地方,以及同時運用這些策略。緩存有兩種。
假設一個頁面每秒被查看10次,而你緩存它1秒,那么90%針對這個頁面的請求都將來自在緩存。如果你單獨緩存靜態內容,那么即使全新生成的頁面,很可能大部分都來自緩存的內容。緩存Web應用生成內容的技術主要分三種。
Web應用的緩存可以在Web應用服務器內部或外部實現。首先,考慮緩存動態內容,以減輕應用服務器的負載。其次,緩存用于靜態內容(包括那些動態生成內容的臨時副本),進一步減輕應用服務器的負擔。然后,考慮把緩存轉移到其他更快或更靠近用戶的機器,給應用服務器減負,縮短傳輸時間。用好緩存能顯著加快應用的響應速度。對很多網頁來說,大圖片之類的靜態數據,往往占據一半以上的內容。不用緩存,查詢和傳輸這類數據可能會花好幾秒鐘,而用緩存,則可能只要花幾分之一秒。可以舉一個例子來說明怎么使用緩存,NGINX和NGINX Plus通過兩個指令來設置緩存:proxy_cache_path和proxy_cache指定緩存的位置和大小、最長緩存時間以及其他參數。使用第三個(也是很受歡迎的)指令proxy_cache_use_stale,甚至可以告訴緩存在本來應該提供新鮮內容的服務器太忙或宕機時,提供原來的舊文件,對客戶端來說,拿到內容總比拿不到強。從用戶角度看,這樣也可以樹立你的站點或應用非常穩定的形象。NGINX Plus支持高級緩存功能,包括緩存凈化(caching purging)和通過控制板以可視化的形式展示緩存狀態,實現實時監控。要了解NGINX中關于緩存的更多信息,可以看看參考文檔和NGINX Plus Admin Guide中的NGINX Content Caching。注意: 緩存涉及開發、決策和運維,完善的緩存策略,比如本文提到的這些,能夠體現從DevOps角度考慮的價值。也說是說,開發人員、架構師、運維人員此時攜手,共同保障一個網站的功能、響應時間、安全和業務目標。
建議四:壓縮數據
壓縮同樣能極大提升性能。圖片、視頻、音樂等文件都有非常成熟和高效的壓縮標準(JPEG和PNG、MPEG-4、MP3),任何一個標準都可以把文件大小縮小一個數量級甚至更多。
文本文件,包括HTML(純文本和HTML標簽)、CSS和JavaScript代碼,經常在不壓縮的情況下傳輸。壓縮這些數據對提升Web應用的感知性能有時候特別明顯,尤其是移動用戶的網絡很慢又不穩定的情況下。因為文本數據通過對于頁面交互能夠起到必要的支援作用,而多媒體數據則更多是錦上添花的作用。聰明的內容壓縮可以把HTML、JavaScript、CSS等文本內容的縮小30%以上,因此能夠相應地減少加載時間。
如果你使用SSL,壓縮又可以減少必須經過SSL編碼的數據量,從而補償了壓縮這些數據的CPU時間。
壓縮數據的方法非常多。比如,建議六中關于HTTP/2的部分就描述了一個新穎的壓縮思路,特別適合首部數據壓縮。還有一個關于文本壓縮的例子,就是可以在NGINX中開啟GZIP壓縮。預壓縮文本數據之后,可以使用gzip_static指令直接發送.gz文件。
建議五:優化SSL/TLS
越來越多的網站在使用Secure Sockets Layer(SSL)及后來的Transport Layer Security(TLS)協議。SSL/TLS通過加密從源服務器發送給用戶的數據來提升網站安全性。Google會提升使用SSL/TLS的網站的搜索引擎排名,將有力地推動這一進程。
盡管采用率越來越高,但SSL/TLS造成的性能損失也困擾著很多網站。SSL/TLS拖慢網站的原因有兩個。1、每次打開新連接的初次握手都必須創建加密密鑰,而瀏覽器使用HTTP/1.x對每個2、服務器建立多個連接的方式進一步加劇了這個問題。服務器端加密數據和客戶端解密數據的操作同樣也是開銷。為了鼓勵人們使用SSL/TLS,HTTP/2和SPDY(參見建議六)的作者將這兩個協議設計為只讓瀏覽器針對一次會話建立一個連接。這樣就把SSL導致性能降低的兩個主要原因之一消滅掉了。然而,說到優化SSL/TLS性能,還是有很多事情可做。優化SSL/TLS的方法因Web服務器而異。以NGINX為例,NGINX使用OpenSSL,運行于普通機器上,能夠提供接近定制機器的性能。NGINX SSL performance詳細介紹了如何將SSL/TLS加密和解密的開銷降至最低。此外,這里還有一篇文章,介紹了很多種提升SSL/TLS性能的方法。簡單總結一下,涉及的技術主要有如下幾種。
NGINX和NGINX Plus都可以來終止SSL/TLS,即處理客戶端信息的加密和解密,同時與其他服務器保持明文通信。在NGINX或NGINX Plus中設置處理SSL/TLS終止可以采取這幾個步驟。而對于在接受TCP連接的服務器上使用NGINX Plus而言,可以參考這里的設置步驟。
建議六:實現HTTP/2或SPDY
已經使用SSL/TLS的站點,如果再使用HTTP/2或SPDY則很可能提升性能,因為一個連接只要一次握手。尚未使用SSL/TLS、HTTP/2和SPDY的站點切換到SSL/TLS(通常會降低性能),從響應速度方面看,可能是一次倒退。
谷歌2012年開始SPDY項目,致力于在HTTP/1.x之上實現更快的速度。HTTP/2則是IETF最近批準的基于SPDY的標準。SPDY得到了廣泛支持,但很快就將被HTTP/2取代。
SPDY和HTTP/2的關鍵在于只用一個連接,而非多個連接。這一個連接是多路復用的,因此可以同時承載多個請求和響應。
只維持一個連接,可以省掉多個連接所需的設置和管理消耗。而且一個連接對SSL特別重要,因為可以將SSL/TLS建立安全連接所需的握手時間降至最少。
SPDY協議要求使用SSL/TLS,HTTP/2并沒有正式要求,但目前所有支持HTTP/2的瀏覽器都只會在啟用SSL/TLS的情況下才會使用它。換句話說,支持HTTP/2的瀏覽器只有在網站使用SSL且服務器接受HTTP/2流量的情況下才會使用HTTP/2。否則,瀏覽器會基于HTTP/1.x通信。
實現了SPDY或HTTP/2之后,域名分片、資源合并、圖片精靈等之前針對HTTP的性能優化措施就用不著了。因此也可以簡化代碼和部署。關于HTTP/2會帶來哪些變化,可以參考我們的這個白皮書。
NGINX很早就開始支持SPDY,而且今天使用SPDY的大多數站點都在運行NGIN
X。NGINX同樣率先支持了HTTP/2,2015年9月,NGINX開源和NGINX Plus開始支持 HTTP/2。
隨著時間推移,NGINX希望大多數站點啟用SSL并遷移到HTTP/2。這樣不僅可以讓網站更安全,而且隨著新的優化技術不斷涌現,也可以通過簡單的代碼實現更高的性能。
建議七:升級軟件
提升應用性能的一個簡單的方法,就是根據可靠性及性能選擇軟件。此外,高質量組件的開發者更可能不斷提升性能和修復問題,因此使用最新的穩定版本是劃算。新發布的版本會得到開發者和用戶更多的關注,同時也會利用新的編譯器優化技術,包括針對新硬件的調優。相對舊版本,新發布的穩定版本明顯性能更高。堅持升級,也可以保證在調優、問題修復和安全警報方面與時俱進。不升級軟件也會妨礙利用新能力。比如,HTTP/2目前要求OpenSSL 1.0.1。從2016年下半年開始,HTTP/2會要求OpenSSL 1.0.2,該版本發布于2015年1月。NGINX用戶可以從NGINX開源軟件的最新版本或NGINX Plus開始,它們支持套接字共享、線程池(參見下文),而且都會持續優化性能。因此,檢查一下自己的軟件,盡量把它們升級到最新的版本。
建議八:調優Linux
Linux是今天大多數Web服務器的底層操作系統,作為一切基礎設施的基礎,Linux對提升性能至關重要。默認情況下,很多Linux系統都比較保守,僅以桌面辦公為需求,以占用少量資源為調優目標。對于Web應用而言,為達到性能最佳,肯定需要重新調優。Linux優化因Web服務器而異。以NGINX為例,可以從以下幾方面考慮。
存量隊列。如果發現有一些連接得不到處理,可以增大net.core.somaxconn,即等待NGINX處理的最大連接數。如果這個連接數限制過小,應該可以看到錯誤消息,可以逐步提高這個值,直到錯誤消息不再出現。
建議九:調優Web服務器
無論使用什么Web服務器,都需要針對應用對其調優。以下建議適用于任何Web服務器,但會給出只有NGINX的設置說明。
提示 修改任何操作系統及周邊設備的設置時,每次只修改一項,然后測試性能。如果該項修改導致了問題,或者并未提升性能,再改回去。
建議十:監控實時動態以發現問題和瓶頸
保存應用高性能的關鍵是實時監控應用性能。必須實時監控特定設備及相應Web基礎設施中應用的動態。
監控站點活動多數情況下是被動的,它只告訴你發生了什么,至于如何發現和解決問題,則是你自己的事情。
監控可以捕獲以下幾種問題:1、服務器停機2、服務器不穩,漏處理連接3、服務器出現大面積緩存失效4、服務器發送的內容不對
New Relic或Dynatrace等全局性的性能監控工具,可以幫我們監控遠程加載頁面的時間,而NGINX則可以幫你監控應用交付這一端。應用的性能數據可以告訴你優化手段什么時候真正給用戶帶去了不同的體驗,以及什么時候需要擴容以滿足越來越多的流量。
為了幫助用戶盡快發現問題,NGINX Plus增加了應用程序體檢功能,會報告經常重復出現的問題。NGINX Plus還具備session draining特性,會在已有任務完成前阻止新連接,以及慢啟動容量,從而讓恢復的服務器在負載均衡集群中達到應有的速度。使用得當的情況下,健康體檢會在問題顯著影響用戶體驗之前幫你定位問題,而session draining和慢啟動則讓你替換服務器時不影響感知的性能和在線時間。這張圖展示了NGINX Plus內置的實時活動監控的控制板,涵蓋了服務器、TCP連接和緩存。
結論:10倍性能提升
性能提升因Web應用不同會有巨大差異。實際的提升取決于預算、時間,以及現有實現的與理想性能的差距。那么怎么讓你的應用獲得10倍的性能提升呢?為了幫大家理解每項優化建議的潛能,下面再針對之前的建議給出一些實施方針,希望大家各取所需。
關于如何提升Nginx性能問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。