web server調優的幾種方式
阿新 • • 發佈:2019-01-11
- 通過反向代理來提高效能和增加安全性
使用反向代理伺服器可以將應用伺服器從等待使用者與 web 程式互動解放出來,這樣應用伺服器就可以專注於為反向代理伺服器構建網頁,讓其能夠傳輸到網際網路上。而應用伺服器就不需要等待客戶端的響應,其執行速度可以接近於優化後的效能水平。 - 新增負載平衡
負載均衡伺服器首先是一個反向代理伺服器,它接受來自網際網路的流量,然後轉發請求給另一個伺服器。特別是負載均衡伺服器支援兩個或多個應用伺服器,使用分配演算法將請求轉發給不同伺服器。最簡單的負載均衡方法是輪轉法round robin,每個新的請求都會發給列表裡的下一個伺服器。其它的負載均衡方法包括將請求發給活動連線最少的伺服器。
負載均衡可以很好的提高效能是因為它可以避免某個伺服器過載而另一些伺服器卻沒有需要處理的流量。它也可以簡單的擴充套件伺服器規模,因為你可以新增多個價格相對便宜的伺服器並且保證它們被充分利用了。 - 快取靜態和動態的內容
- 靜態內容快取:
不經常變化的檔案,比如影象(JPEG、PNG) 和程式碼(CSS,JavaScript),可以儲存在外圍伺服器上,比如阿里雲的oss,這樣就可以快速的從記憶體和磁碟上提取。 - 動態內容快取:
很多 web 應用會針對每次網頁請求生成一個新的 HTML 頁面。在短時間內簡單的快取生成的 HTML 內容,就可以很好的減少要生成的內容的數量,而且這些頁面足夠新,可以滿足你的需要。
舉一個在實際中快取是如何使用的例子, NGINX 和 NGINX Plus 使用了兩條指令來設定快取機制:proxy_cache_path 和 proxy_cache。你可以指定快取的位置和大小、檔案在快取中儲存的最長時間和其它一些引數。使用第三條(而且是相當受歡迎的一條)指令 proxy_cache_use_stale,如果提供新鮮內容的伺服器忙碌或者掛掉了,你甚至可以讓快取提供較舊的內容,這樣客戶端就不會一無所得。從使用者的角度來看這可以很好的提高你的網站或者應用的可用時間。
- 靜態內容快取:
- 壓縮資料
文字資料 —— 包括HTML(包含了純文字和 HTML 標籤),CSS 和程式碼,比如 Javascript —— 經常是未經壓縮就傳輸的。壓縮這類資料會在對應用程式效能的感覺上,特別是處於慢速或受限的行動網路的客戶端,產生更大的影響。
這是因為文字資料經常是使用者與網頁互動的有效資料,而多媒體資料可能更多的是起提供支援或者裝飾的作用。智慧的內容壓縮可以減少 HTML,Javascript,CSS和其它文字內容對頻寬的要求,通常可以減少 30% 甚至更多的頻寬和相應的頁面載入時間。
如果你使用 SSL,壓縮可以減少需要進行 SSL 編碼的的資料量,而這些編碼操作會佔用一些 CPU 時間而抵消了壓縮資料減少的時間。 - 不要把每個請求的日誌都直接寫入磁碟
對於NGINX 來說,給指令 access_log 新增引數 buffer=size 可以讓系統在快取滿了的情況下才把日誌寫到磁碟。如果你添加了引數 flush=time ,那麼快取內容會每隔一段時間再寫回磁碟。 - 客戶端保活
對於 NGINX 來說,你可以從 keepalive_requests 的預設值 100 開始增加最大連線數,這樣一個客戶端就可以在一個指定的連線上請求多次,而且你也可以通過增加 keepalive_timeout 的值來允許保活連線存活更長時間,這樣就可以讓後來的請求處理的更快速。
-上游保活
上游的連線即連線到應用伺服器、資料庫伺服器等機器的連線同樣也會受益於連線保活。對於上游連線來說,你可以增加 keepalive,即每個工人程序的空閒保活連線個數。這就可以提高連線的複用次數,減少需要重新開啟全新連線的次數。 - 限制
限制客戶端使用的資源可以提高效能和安全性。對於 NGINX 來說,指令 limit_conn 和 limit_conn_zone 限制了給定來源的連線數量,而 limit_rate 限制了頻寬。這些限制都可以阻止合法使用者扒取資源,同時也避免了攻擊。指令 limit_req 和 limit_req_zone 限制了客戶端請求。對於上游伺服器來說,可以在 upstream 的配置塊裡的 server 指令使用 max_conns 引數來限制連線到上游伺服器的連線數。 這樣可以避免伺服器過載。關聯的 queue 指令會建立一個佇列來在連線數抵達 max_connS 限制時在指定長度的時間內儲存特定數量的請求。 - 監視系統活動
為了幫助開發者快速的發現、解決問題,NGINX Plus 增加了應用感知健康度檢查 ——對重複出現的常規事件進行綜合分析並在問題出現時向你發出警告。NGINX Plus 同時提供會話過濾功能,這可以阻止當前任務完成之前接受新的連線,另一個功能是慢啟動,允許一個從錯誤恢復過來的伺服器追趕上負載均衡伺服器群的進度。當使用得當時,健康度檢查可以讓你在問題變得嚴重到影響使用者體驗前就發現它,而會話過濾和慢啟動可以讓你替換伺服器,並且這個過程不會對效能和正常執行時間產生負面影響。 - 硬體使用SSD
除了對記憶體方面的優化,還可以對磁碟這邊進行優化。跟傳統機械硬碟相比,固態硬碟具有快速讀寫、質量輕、能耗低以及體積小等特點。但是ssd的價格相比傳統機械硬碟要貴,有條件的可以使用ssd來代替機械硬碟。 - 優化資料庫
大部分的伺服器請求最終都是要落到資料庫中,隨著資料量的增加,資料庫的訪問速度也會越來越慢。想要提升請求處理速度,必須要對原來的單表進行動刀了。目前主流的Linux伺服器使用的資料庫要屬mysql了,如果我們使用mysql儲存的資料單個表的記錄達到千萬級別的話,查詢速度會很慢的。根據業務上合適的規則對資料庫進行分割槽分表,可以有效提高資料庫的訪問速度,提升伺服器的整體效能。另外對於業務上查詢請求,在建表的時候可以根據相關需求設定索引等,以提高查詢速度。 - 選擇合適的IO模型
幾種IO模型的工作原理及特點 - 使用多核處理策略
現在執行伺服器的主流機器配置都是多核CPU的,我們在設計伺服器的時候可以利用多核心的特點,採用多程序或者多執行緒的框架。關於選擇多執行緒還是多程序可以根據實際的需求,結合各自的優缺點進行選擇。對於多執行緒的使用,特別是使用執行緒池的時候可以通過測試不同執行緒池伺服器的效能來設定合適的執行緒池。 - 使用記憶體資料庫
但是安全性的問題可以說是記憶體資料庫最大的硬傷。因為記憶體本身有掉電丟失的天然缺陷,因此我們在使用記憶體資料庫的時候,通常需要,提前對記憶體上的資料採取一些保護機制,比如備份,記錄日誌,熱備或叢集,與磁碟資料庫同步等方式。對於一些重要性不高但是又想要快速響應使用者請求的部分資料可以考慮記憶體資料庫來儲存,同時可以定期把資料固化到磁碟。
參考文獻:
https://www.cnblogs.com/raincute/p/8573258.html
https://blog.csdn.net/fanyun_01/article/details/79942408