如何使用 Nginx 快取靜態資源以加速網站

Web2026-09-21TryQuickToolBox

為何靜態資源快取如此重要

每當使用者造訪你的網站,瀏覽器就會請求數十個靜態資源:CSS 檔案、JavaScript、圖片、字型等等。若沒有適當的快取,每個請求都會打到你的伺服器,增加載入時間與頻寬用量。Nginx 是一款高效能網頁伺服器,可以透過告訴瀏覽器將這些資源快取在本機,以及在伺服器端進行快取,大幅改善這個問題。

在本指南中,你將學會如何設定 Nginx 有效快取靜態資源,降低延遲與伺服器負載。

了解瀏覽器快取與伺服器端快取的差異

這裡涉及兩種主要的快取類型:

兩者對效能都至關重要。我們將涵蓋這兩者。

步驟 1:使用 Expires 標頭設定瀏覽器快取

啟用瀏覽器快取最簡單的方式,就是在 Nginx 設定中加入 expires 指令。這會設定 Expires 和 Cache-Control 標頭。

開啟你網站的設定檔(例如 /etc/nginx/sites-available/example.com),並為靜態資源加入一個 location 區塊:

location ~* \.(css|js|jpg|jpeg|png|gif|ico|svg|woff|woff2|ttf|eot)$ {
    expires 1y;
    add_header Cache-Control "public, immutable";
}

這會告訴瀏覽器將這些檔案快取一年。immutable 指令表示該檔案永遠不會變更,因此瀏覽器在重新載入時甚至不會重新驗證。

最佳實務:使用帶版本編號的檔名(例如 style.abc123.css),這樣你就能更新資源而不會破壞快取。當檔案變更時,檔名也會改變,瀏覽器就會抓取新版本。

步驟 2:使用 Proxy Cache 啟用伺服器端快取

如果你在 Nginx 後方執行應用程式伺服器(例如 Node.js、Python 或 PHP),你可以在 Nginx 中快取靜態回應以減少後端請求。

首先,在 nginx.conf 的 http 區塊中定義快取路徑:

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=static_cache:10m max_size=1g inactive=60m use_temp_path=off;

接著,在你的 server 區塊中使用它:

location ~* \.(css|js|jpg|jpeg|png|gif|ico|svg)$ {
    proxy_cache static_cache;
    proxy_cache_valid 200 302 1y;
    proxy_cache_valid 404 1m;
    proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
    proxy_cache_lock on;
    add_header X-Cache-Status $upstream_cache_status;
    proxy_pass http://backend;
}

這會將成功的回應快取一年,並在後端故障時提供過期的內容。X-Cache-Status 標頭有助於你除錯(HIT、MISS 等)。

步驟 3:使用壓縮與 HTTP/2 進行最佳化

快取能減少請求,但你可以透過啟用 gzip 壓縮與 HTTP/2 進一步加速傳輸。

在 nginx.conf 中啟用 gzip:

gzip on;
gzip_types text/css application/javascript image/svg+xml;
gzip_min_length 1000;

HTTP/2 會多工處理請求,只要在 listen 指令中加入 http2 即可啟用:

listen 443 ssl http2;

注意:HTTP/2 需要 HTTPS。如果你還沒設定 TLS,請參閱我們的指南 HTTPS 與 TLS 如何運作。

比較:Cache-Control 指令

指令 含義 建議用於
public 回應可被任何快取儲存 靜態資源
private 回應僅供單一使用者 使用者專屬資料
no-cache 必須向伺服器重新驗證 HTML 頁面
no-store 永不快取 敏感資料
immutable 內容不會變更 帶版本編號的資源

步驟 4:測試與驗證

套用變更後,重新載入 Nginx:sudo nginx -s reload。接著用 curl 測試:

curl -I https://example.com/style.css

查看 Cache-Control 和 Expires 標頭。你也可以使用瀏覽器 DevTools(Network 分頁)來查看資源是否從快取提供(狀態 200 或 304)。

至於伺服器端快取,請監控 X-Cache-Status 標頭。

常見陷阱與最佳實務

常見問題

我要如何知道我的資源是否被快取了?

使用 curl -I 或瀏覽器 DevTools 檢查回應標頭。查看 Cache-Control: public, max-age=31536000 和 Expires 標頭。在 DevTools 中,Size 欄位會對已快取的資源顯示「(from disk cache)」。

expires 和 Cache-Control 有什麼不同?

expires 設定的是絕對日期,而 Cache-Control 使用的是相對秒數。在現代瀏覽器中,Cache-Control 的優先順序較高。Nginx 的 expires 指令會同時設定兩者以確保相容性。

我可以快取動態內容嗎?

可以,但要謹慎。使用 proxy_cache 並搭配較短的 TTL,並考慮以 cookie 或標頭為基礎的快取鍵。對於使用者專屬的內容,請使用 private 或避免快取。

使用 TryQuickToolBox 加速你的工作流程

在最佳化網站效能的同時,你可能需要壓縮圖片或 PDF。試試我們的 圖片壓縮工具,在不損失品質的情況下縮小圖片大小,為你的 Nginx 快取策略加分。