Nginx 是一款強大的 Web 應用軟件,常用做托管網站、反向代理或負載均衡。隨著時間的推移,Nginx在常用的 Web 服務器軟件中已然超越 Apache,這主要是得益於其優越的性能以及配置便捷性。
但是,當部署為後端服務器的前端時,大多數時候都會錯過一個關鍵功能, 那就是 Nginx超越HAProxy 的靜態資源【緩存能力】,這可以通過將數據寫入磁盤來實現,也可以直接用內存來緩存數據以獲取更加卓越的性能。
在下麵的教程中,您將看到一些Nginx緩存的配置和調優代碼示例。
係統環境要求
操作係統:任何安裝了 Nginx 的 Linux 操作係統。
用戶帳戶:具有 sudo 或 root 訪問權限的用戶帳戶。
創建 Nginx 磁盤緩存
在第一個示例中,您將創建一個目錄,並將一個區域添加到您的 Nginx server
塊,並將傳統的靜態文件緩存到磁盤。 注意,從長遠來看,如果您不使用高性能的固態硬盤(SSD),緩存到磁盤有時可能不是一個好主意。 此外,即使使用 SSD,持續寫入也會縮短預期壽命,具體取決於硬盤驅動器的使用年限和質量。
首先,創建存放緩存數據的目錄:
sudo mkdir -p /cache/tmpfs/
接下來,將以下內容添加到您的nginx配置文件server
塊中。可以修改配置模板文件中的現有的代理服務器塊,並添加額外內容。
proxy_cache_path /cache/nginx/tmpfs levels=1:2 keys_zone=my_zone:100m max_size=10g inactive=60m use_temp_path=off;
server {
...
location / {
proxy_cache my_zone;
proxy_cache_key $scheme$request_method$proxy_host$request_uri;
proxy_cache_valid 404 302 1m;
proxy_cache_valid 200 1d;
proxy_http_version 1.1;
add_header X-Cache-Status $upstream_cache_status;
}
...
}
注意,確保 proxy_cache_path
位於配置文件中的http
部分而不是server
塊。 此外,文件路徑必須是絕對路徑,否則將不起作用。
以下Nginx部分術語說明。
- keys_zone:設置一個共享內存區域,用於存儲緩存鍵和元數據。在內存中擁有鍵副本使 NGINX 能夠快速確定請求是命中緩存 (HIT) 還是未命中緩存 (MISS),而無需轉到磁盤,從而大大加快了檢索速度。一個 1MB 區域可以存儲大約 8,000 個鍵的數據,因此示例中配置的 10MB 區域可以存儲大約 80,000 個鍵的數據。
- inactive:指定數據可以在緩存中保留多長時間未訪問而不刪除。在此示例中,緩存管理器進程會自動從緩存中刪除 60 分鍾未請求的文件,無論它是否已過期。默認值為 10 分鍾 (10m)。非活動內容與過期內容不同。 NGINX 不會自動刪除緩存控製標頭定義的過期內容(例如 Cache-Control:max-age=120)。過期(陳舊)內容僅在非活動指定的時間內未被訪問時才會被刪除。當訪問過期內容時,NGINX 從源服務器刷新它並重置非活動計時器。
- max_size:設置緩存大小的上限(在本例中為 10 GB)。它是可選的;不指定值允許緩存增長以使用所有可用磁盤空間。當緩存大小達到限製時,緩存管理器進程會刪除最近最少使用的文件,以使緩存大小恢複到限製之下。
- proxy_cache_path:您創建的緩存文件夾的文件路徑。
- add_header X-Cache-Status $upstream_cache_status:在響應客戶端時添加一個 X-Cache-Status HTTP 標頭
- proxy_cache_revalidate <on|off>:指示 NGINX 在從源服務器刷新內容時使用條件 (GET) 請求。如果客戶端請求緩存控製標頭定義的已緩存但已過期的項目,NGINX 會在它發送到源服務器的 (GET) 請求的標頭中包含 (If-Modified-Since) 字段。這節省了帶寬,因為隻有在 NGINX 最初緩存它時附加到文件的 (Last-Modified) 標頭中記錄的時間以來文件有修改,服務器才發送完整的項目。
- proxy_cache_min_uses <number>:設置一個項目在 NGINX 緩存之前必須被客戶端請求的次數。如果緩存不斷被填滿,這很有用,因為它確保隻有最常訪問的項目被添加到緩存中。默認情況下 (proxy_cache_min_uses) 設置為 1。
- proxy_cache_background_update <on|off>:(proxy_cache_use_stale)指令的(更新)參數,結合啟用(proxy_cache_background_update)指令,指示NGINX在客戶端請求過期或正在更新的項目時,在完全下載更新的文件之前,所有請求都會返回陳舊文件。所有更新都將在後台完成。
- proxy_cache_lock <on|off>:啟用 (proxy_cache_lock) 後,如果多個客戶端請求緩存未命中 (MISS),則僅允許這些請求中的第一個去原始服務器取數據。其餘請求等待該請求得到滿足後,再從緩存中提取文件。如果不啟用 (proxy_cache_lock),所有導致緩存未命中的請求都會直接發送到源服務器。
內存中的 Nginx 緩存
如果您的服務器有充足的資源,緩存到內存(RAM)總是比將文件緩存到磁盤更好,這甚至適用於最先進的 SSD 驅動器。
首先,創建一個用於RAM緩存的新目錄:
sudo mkdir -p /cache/nginx/tmpfs
然後,使用以下命令將創建的目錄(tmpfs)掛載到 RAM 中:
sudo mount -t tmpfs -o size=2g tmpfs /cache/nginx/tmpfs
這會在 RAM 中掛載 (/data/nginx/tmpfs),並分配 2 GB空間。緩存空間大小可以根據服務內存大小做調整。
如果需要卸載(unmount),執行以下代碼:
sudo umount /cache/nginx/ramcache
要使用 Nginx 完成 RAM 緩存設置,您需要將以下內容添加到 (/etc/fstab),以便當服務器自動重新啟動時,RAM 緩存目錄會重新創建。
使用 nano 打開 (/etc/fstab) 文件:
sudo nano /etc/fstab
輸入以下內容並調整到您的緩存位置和大小:
tmpfs /cache/nginx/tmpfs tmpfs defaults,size=1g 0 0
Nginx 代理緩衝
如果您使用 Nginx 反向代理,提高性能的一個好方法是使用代理緩衝。 這與 Nginx 如何處理從代理服務器接收到的響應的方式有關。 它意味著不會為每個客戶端請求查詢代理服務器,但如果緩存的數據仍然被認為是有效的(生命周期尚未過去),則從緩存中提供數據。
下麵是可用示例:
#Enables or disables buffering of responses from the proxied server.
proxy_buffering on;
#proxy buffer cache sizes
proxy_buffers 4 256k;
proxy_buffer_size 128k;
proxy_busy_buffers_size 256k;
WordPress緩存
上麵的例子在 WordPress 網站上效果很好。 但是,需要一些額外的規則來確保正常有效。
首先,將下列代碼粘貼在緩存在配置文件server
塊(location)區域上方:
set $skip_cache 0;
# POST requests and urls with a query string should always go to PHP
if ($request_method = POST) {
set $skip_cache 1;
}
if ($query_string != "") {
set $skip_cache 1;
}
# Don't cache uris containing the following segments
if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|^/feed/*|/tag/.*/feed/*|index.php|/.*sitemap.*\.(xml|xsl)") {
set $skip_cache 1;
}
# Don't use the cache for logged in users or recent commenters
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $skip_cache 1;
}
如您所見,我們正在跳過(POST)請求的緩存,查詢字符串應始終轉到 PHP,不緩存包含一些日常內容(如提要、站點地圖等)的所有 URL。
接下來,在緩存配置的location中添加以下兩行:
proxy_cache_bypass $skip_cache;
proxy_no_cache $skip_cache;
對於想要查看完整示例的新用戶,請在工作環境中查看以下內容:
location / {
proxy_pass http://webserver;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache my_zone;
proxy_cache_key $scheme$request_method$proxy_host$request_uri;
proxy_cache_valid 404 302 1m;
proxy_cache_valid 200 31d;
add_header X-Cache-Status $upstream_cache_status;
proxy_buffering on;
proxy_buffers 256 16k;
proxy_buffer_size 32k;
proxy_http_version 1.1;
proxy_cache_bypass $skip_cache;
proxy_no_cache $skip_cache;
}
}
Nginx瀏覽器緩存
瀏覽器緩存是減少服務器負載的好方法,尤其是在您運行博客或其他類似內容時。 您可以為動態內容經常變化的購物和論壇設置延長時間。
最常見的瀏覽器緩存示例如下。 在您的緩存配置server
塊中輸入此內容。
# assets, media
location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {
expires 365d;
access_log off;
}
# svg, fonts
location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff2?)$ {
add_header Access-Control-Allow-Origin "*";
expires 365d;
access_log off;
}
為了節省磁盤 IO 和日誌記錄,您可以在訪問日誌中聲明關閉這些資源,以在您遇到過長的加載時間問題時提高服務器的性能。
總結
在本教程中,您學習了如何基於文件和 RAM 使用 Nginx 代理緩存。 有關 Nginx 緩存的更多信息,請訪問 Nginx 緩存文檔以了解更多信息,因為它還有非常豐富的附加選項。也就是說還可以做更多精細化的調優,因為這個簡單教程指南僅僅做了個入門級介紹。