通過優化Ngnix配置,減少網絡壓力

前言

在得克薩斯大學的演講中,海軍上將威廉·麥克雷文說,如果你想改變世界,從每天早起開始。有時候,小事情可能會產生很大的影響,無論是早上鋪牀還是對網站的HTTP服務器配置進行少量更改。

這聽起來像是誇大其詞?2020年的頭幾個月,我們對世界上正常和合理事物的所有定義都花光了。由於新型冠狀病毒大流行,地球上將近一半的人口被困在自己的家中,因此互聯網已成爲他們交流,娛樂,購買食物,工作和教育的唯一方式。互聯網每週都比以往任何時候都擁有更高的網絡流量和服務器負載。根據BroadbandNow在3月25日發佈的報告,“在我們分析的200個城市中,有88個(44%)在過去一週內經歷了一定程度的網絡降級”。

諸如Netflix和YouTube之類的主要媒體平臺都在限制其傳輸質量,以保護網絡鏈接,使人們有更多帶寬可用於工作,與家人交流或在學校上虛擬課。但這還不夠,因爲網絡質量逐漸惡化,許多服務器變得超負荷。

您可以通過優化網站來提供幫助

如果您擁有網站並可以管理其HTTP服務器配置,則可以提供幫助。進行一些小的更改可以減少用戶生成的網絡帶寬以及服務器的負載。這是雙贏的局面:如果您的站點當前負載沉重,則可以減少它,從而爲更多的用戶提供服務,並可能降低成本。如果負載不是很高,則更快的加載可以改善用戶的體驗(有時會積極影響您在Google搜索結果中的排名)。

如果您的應用程序每個月有數百萬用戶,或者是一個包含烘焙食譜的小博客,那都沒有關係,您消除的每千字節網絡流量都釋放了容量,供那些迫切需要在線檢查、醫學檢查結果的人使用。

在此博客中,我們介紹了您可以對NGINX配置進行的一些簡單但功能強大的更改。舉一個真實的例子,我們使用我的朋友Rogalove的電子商務網站——該公司是我居住的波蘭一家生態化妝品製造商。該網站是運行NGINX 1.15.9作爲其Web服務器的相當標準的WooCommerce安裝。爲了進行計算,我們假設該網站每天獲得100個唯一身份用戶,其中30%的用戶爲固定訪問者,並且每個用戶在會話期間平均訪問4個頁面。

這些技巧是您可以立即採取的簡單步驟,以提高性能並減少網絡帶寬。如果您要處理大量流量,則可能需要實施更復雜的更改以產生重大影響,例如,調整操作系統和NGINX,提供正確的硬件容量,以及(最重要的是)啓用和調整緩存。查看這些博客文章以獲取詳細信息:

爲HTML,CSS和JavaScript文件啓用Gzip壓縮

如您所知,用於在現代網站上構建頁面的HTML,CSS和JavaScript文件可能非常龐大。在大多數情況下,Web服務器可以即時壓縮這些和其他文本文件,以節省網絡帶寬。

查看Web服務器是否正在壓縮文件的一種方法是使用瀏覽器的開發人員工具。對於許多瀏覽器,您可以使用F12鍵訪問這些工具,並且相關信息位於“ 網絡”選項卡上。這是一個例子:
在這裏插入圖片描述
如您在上圖左下方所見,沒有壓縮:文本文件的大小爲1.15 MB,並且傳輸了很多數據。

默認情況下,NGINX中禁用壓縮,但是根據您的安裝或Linux發行版,某些設置可能會在默認的nginx.conf文件中啓用。在這裏,我們在NGINX配置文件中啓用gzip壓縮:

gzip on;
gzip_types application/xml application/json text/css text/javascript application/javascript;
gzip_vary on;
gzip_comp_level 6;
gzip_min_length 500;

如您在以下屏幕截圖中所見,壓縮後的數據傳輸量僅爲260 KB ,減少了約80%!對於頁面上的每個新用戶,您可以節省大約917 KB的數據傳輸。對於我們的WooCommerce程序來說,每天62 MB,則每月1860 MB。

在這裏插入圖片描述

設置緩存頭

當瀏覽器檢索網頁的文件時,它會將副本保留在本地磁盤緩存中,這樣,當您再次訪問該頁面時,它不必從服務器重新獲取文件。每個瀏覽器都使用自己的邏輯來決定何時使用文件的本地副本以及何時在服務器上更改了文件時再次獲取它。但是,作爲網站所有者,您可以在發送的HTTP響應中設置緩存控制和過期標頭,以提高瀏覽器的緩存行爲的效率。從長遠來看,您會減少很多不必要的HTTP請求。

首先,您可以爲字體和圖像設置較長的緩存過期時間,這些字體和圖像可能不會經常更改(即使更改,它們通常也會獲得新的文件名)。在以下示例中,我們指示客戶端瀏覽器將字體和圖像在本地緩存中保留一個月:

location ~* \.(?:jpg|jpeg|gif|png|ico|woff2)$ {
    expires 1M;
    add_header Cache-Control "public";
}

啓用HTTP / 2協議支持

HTTP / 2是用於服務網頁的下一代協議,旨在更好地利用網絡和主機服務器。根據Google文檔,它可以更快地加載頁面:

生成的協議對網絡更友好,因爲與HTTP / 1.x相比,使用的TCP連接更少。這意味着與其他流量的競爭減少,連接壽命更長,從而可以更好地利用可用網絡容量。

NGINX 1.9.5和更高版本(以及NGINX Plus R7和更高版本)支持HTTP / 2協議,您所需要做的就是啓用它。爲此,請在您的NGINX配置文件中http2的listen指令中包含參數:

listen 443 ssl http2;

請注意,在大多數情況下,您還需要啓用TLS才能使用HTTP / 2。

您可以通過HTTP2.Pro服務驗證您(或任何站點)是否支持HTTP / 2 :
在這裏插入圖片描述

優化記錄

讓自己喝一杯自己喜歡的飲料,舒適地坐着,然後思考:您上次查看訪問日誌文件是什麼時候?上週,上個月,從來沒有?即使將其用於站點的日常監視,您也可能只關注錯誤(400和500狀態代碼等),而不關注成功的請求。

通過減少或消除不必要的日誌記錄,可以節省服務器上的磁盤存儲,CPU和I / O操作。這不僅使您的服務器更快一點-如果將您部署在雲環境中,則釋放的I / O吞吐量和CPU週期可能爲同一虛擬機上的其他虛擬機或應用程序節省生命。

有幾種不同的方法可以減少和優化日誌記錄。在這裏,我們重點介紹三個。

方法1:禁用頁面資源請求的記錄

如果您不需要記錄檢索普通頁面資源(例如圖像,JavaScript文件和CSS文件)的請求,則這是一種快速簡便的解決方案。您需要做的就是創建一個location與這些文件類型匹配的新塊,並禁用其中的日誌記錄。(您也可以將此access_log指令添加到我們設置標頭的上方的location塊中。)Cache-Control

location ~* \.(?:jpg|jpeg|gif|png|ico|woff2|js|css)$ {
    access_log off;
}

方法2:禁用成功請求的日誌記錄

這是一種更強大的方法,因爲它會丟棄帶有或響應代碼的查詢,僅記錄錯誤。它比方法1稍微複雜一點,因爲它取決於如何配置NGINX日誌記錄。在我們的示例中,我們使用Ubuntu Server發行版中包含的標準nginx.conf,因此,無論虛擬主機如何,所有請求都記錄到/var/log/nginx/access.log中。2xx3xx

使用官方NGINX文檔中的示例,讓我們打開條件日誌記錄。創建一個變量$loggable,並將其設置爲,0以使用和代碼進行請求,否則設置爲 。然後在指令中將此變量作爲條件引用。2xx3xx1access_log

這是/etc/nginx/nginx.conf中http上下文中的原始指令:

access_log /var/log/nginx/access.log;

添加一個map塊並從access_log指令中引用它:

map $status $loggable {
    ~^[23] 0;
    default 1;
}

access_log /var/log/nginx/access.log combined if=$loggable;

請注意,儘管這 combined 是默認的日誌格式,但是在包含if參數時,您需要明確指定它。

方法3:使用緩衝最小化I / O操作

即使您要記錄所有請求,也可以通過打開訪問日誌緩衝來最大程度地減少I / O操作。使用此指令,NGINX會等待將日誌數據寫入磁盤,直到填滿512 KB緩衝區或自上次刷新以來經過1分鐘(以先發生者爲準)

access_log /var/log/nginx/access.log combined buffer=512k flush=1m;

限制特定URL的帶寬

如果服務器提供較大的文件(或較小但非常受歡迎的文件,例如表單或報表),則設置客戶端下載文件的最大速度可能很有用。如果您的站點已經承受了很高的網絡負載,則限制下載速度會留下更多帶寬,以使應用程序的關鍵部分保持響應速度。這是硬件製造商使用的非常流行的解決方案–您可能需要等待更長的時間才能爲打印機下載3 GB的驅動程序,但是同時有成千上萬的其他人下載您仍然可以下載。😉

使用limit_rate指令限制特定URL的帶寬。在這裏,我們將/ download 下每個文件的傳輸速率限制爲每秒50 KB

location /download/ {
    limit_rate 50k;
}

您可能還希望僅對較大的文件進行速率限制,這可以使用limit_rate_after指令進行。在此示例中,每個文件(來自任何目錄)的前500 KB都不受速度限制地進行傳輸,之後的所有內容均以50 KB / s爲上限。這樣可以加快網站關鍵部分的交付速度,同時降低其他部分的速度。

location / {
    limit_rate_after 500k;
    limit_rate 50k;
}

請注意,速率限制適用於瀏覽器和NGINX之間的單個HTTP連接,因此請不要阻止用戶使用下載管理器來解決速率限制。

最後,您還可以限制到服務器的併發連接數或請求速率。有關詳細信息,請參見 Ngix文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章