Nginx 效能榨乾術:別讓預設值綁架你的 WordPress 速度!資深工程師的進階調校實戰

2025/09/15 | 架構與效能優化

Nginx 效能榨乾術:別讓預設值綁架你的 WordPress 速度!資深工程師的進階調校實戰

Hey 大家好,我是浪花科技的 Eric。身為一個天天跟伺服器、程式碼打交道的工程師,我最常被問到的問題之一就是:「我的網站為什麼這麼慢?」而在抽絲剝繭後,常常會發現元兇就藏在那個大家以為「裝好就好」的 Nginx 設定裡。很多人(甚至是不少主機商)提供的 Nginx 設定檔,都還停留在能動就好的「史前時代」,這對一個現代化的 WordPress 網站來說,根本就是自廢武功。

你可能會想,我之前不是寫過一篇 Nginx 效能調校聖經 了嗎?沒錯,那篇是你的入門磚,帶你脫離了預設值的苦海。但今天,我們要更深入,談談如何把 Nginx 的潛能徹底榨乾,進行一場真正的「Nginx 主機效能最佳化」手術。這不只是改改數字,而是要理解每個參數背後的意義,讓你的 WordPress 網站快到飛起來!

核心引擎調校:從 Worker Processes 到 Connections

我們從 Nginx 的心臟開始動刀。這部分的設定直接決定了你的伺服器能同時處理多少請求,是整個效能金字塔的地基,地基不穩,上面蓋再多高樓都是枉然。

worker_processes:你的 CPU 有多少核心,就該出多少力

這個參數決定 Nginx 要啟動多少個工作進程(worker process)來處理請求。一個常見的誤區是手動設定一個固定的數字,比如 4 或 8。但最科學的方式,是讓它跟你的 CPU 核心數掛鉤。

囉嗦一下,為什麼是一個核心配一個 worker?因為這樣可以最大化利用 CPU 的多核心處理能力,避免進程在不同核心之間切換造成的效能損耗(Context Switching)。現代 Nginx 建議直接設為 auto,它會自動偵測你的 CPU 核心數。但如果你想手動控制,可以這樣設定:


# /etc/nginx/nginx.conf

# 讓 Nginx 自動偵測 CPU 核心數,這是最佳實踐
worker_processes auto;

# 如果你想手動設定,可以先用 lscpu | grep "^CPU(s):" 指令查看核心數
# 假設你有 4 個核心
# worker_processes 4;

worker_connections:每個工人手上有多少工具

如果說 worker_processes 是工人的數量,那 worker_connections 就是每個工人能同時處理的連線數。這個數字不是越大越好,設太高會消耗過多記憶體,設太低則無法應付高併發流量。

一個合理的起始值是 10242048。理論上,你的伺服器最大連線數會是 worker_processes * worker_connections。同時,你還需要調整系統層級的檔案描述符限制 worker_rlimit_nofile,確保它大於最大連線數。


# /etc/nginx/nginx.conf

events {
    # 每個 worker process 能處理的最大連線數
    worker_connections 2048;

    # 啟用 multi_accept 讓 worker 一次接收所有新連線,在高併發下有幫助
    multi_accept on;
}

# 設定 worker process 可開啟的最大檔案描述符數量
# 這個值應該至少是 worker_connections 的兩倍
worker_rlimit_nofile 65535;

數據壓縮的藝術:Gzip vs. Brotli 終極對決

網站載入速度很大一部分取決於傳輸的資料量。壓縮 HTML、CSS、JS 這些文字檔,是前端效能優化的基本功。Nginx 在這方面提供了強大的武器。

Gzip:老牌戰將的設定心法

Gzip 是最普及的壓縮演算法,幾乎所有瀏覽器都支援。開啟它很簡單,但要「開得好」就需要一些細節調整。例如,壓縮等級(gzip_comp_level)不是越高越好,過高的等級會消耗更多 CPU 資源,反而得不償失。通常設在 5 或 6 是一個很好的平衡點。

  • gzip_vary on;:告訴中間的快取伺服器(如 CDN),同一個 URL 我有壓縮和未壓縮的版本,請分開快取。
  • gzip_min_length:太小的檔案壓縮後可能反而變大,設定一個閾值避免做白工。
  • gzip_types:明確指定要壓縮哪些檔案類型,圖片(如 jpg, png)通常不需要再壓縮了,因為它們本身就是壓縮格式。

# /etc/nginx/nginx.conf 或你的 server block 設定檔

gzip on;
gzip_disable "msie6"; # 放過古老的 IE6 吧
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types
    application/atom+xml
    application/javascript
    application/json
    application/rss+xml
    application/vnd.ms-fontobject
    application/x-font-ttf
    application/x-web-app-manifest+json
    application/xhtml+xml
    application/xml
    font/opentype
    image/svg+xml
    image/x-icon
    text/css
    text/plain
    text/x-component;

Brotli:新世代的壓縮利器

Brotli 是 Google 推出的新一代壓縮演算法,在同樣的壓縮等級下,它的壓縮率通常比 Gzip 更高,檔案可以更小。現在主流瀏覽器都已支援。啟用 Brotli 需要 Nginx 編譯時加入 ngx_brotli 模組,很多現代化的主機環境(如 Cloudways)或自己編譯的 Nginx 都能支援。

工程師的堅持:最佳策略是「兩者並存」。Nginx 可以根據瀏覽器發送的 Accept-Encoding 請求頭,自動選擇提供 Brotli(br)還是 Gzip。這樣既能服務最新版的瀏覽器,也不會拋棄舊的。


# /etc/nginx/nginx.conf

brotli on;
brotli_comp_level 6;
brotli_types
    application/atom+xml
    application/javascript
    application/json
    application/rss+xml
    application/vnd.ms-fontobject
    application/x-font-ttf
    application/x-web-app-manifest+json
    application/xhtml+xml
    application/xml
    font/opentype
    image/svg+xml
    image/x-icon
    text/css
    text/plain
    text/x-component;

快取才是王道:深入 FastCGI Cache 與靜態資源快取

如果說前面的設定是幫你的網站「健身」,那快取就是幫它裝上「噴射引擎」。一個好的 Nginx 主機效能最佳化 策略,絕對離不開快取。這比任何 WordPress 快取外掛都來得更底層、更高效。

榨乾 PHP-FPM 效能的 FastCGI Cache

WordPress 的每個頁面請求,背後都是 PHP-FPM 在辛勤工作、查詢資料庫、渲染頁面。FastCGI Cache 的作用,就是把 PHP 執行完的結果(也就是 HTML 頁面)直接存在伺服器的記憶體或硬碟裡。下一個同樣的請求進來時,Nginx 直接回傳快取結果,完全跳過 PHP 和資料庫,速度是天壤之別!這跟 WordPress 的 Page Cache 概念類似,但它在 Web Server 層級執行,效能更猛。

設定 FastCGI Cache 有兩個步驟:

  1. nginx.confhttp 區塊定義快取路徑和參數。
  2. 在你的網站 server 區塊中啟用快取。

# 步驟一: 在 /etc/nginx/nginx.conf 的 http {} 區塊內
fastcgi_cache_path /var/run/nginx-cache levels=1:2 keys_zone=WORDPRESS:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

# 步驟二: 在你的網站設定檔 /etc/nginx/sites-available/yourdomain.com 的 server {} 區塊內
location ~ \.php$ {
    # ... 原本的 fastcgi_pass 設定 ...
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;

    # --- FastCGI Cache 設定開始 ---
    fastcgi_cache WORDPRESS;
    fastcgi_cache_valid 200 60m;
    fastcgi_cache_use_stale error timeout updating http_500 http_503;
    fastcgi_cache_lock on;

    # 對於已登入使用者或在 WooCommerce 購物車頁面的請求,不要使用快取
    fastcgi_cache_bypass $skip_cache;
    fastcgi_no_cache $skip_cache;

    # 在 server block 的頂部,你可以設定 $skip_cache 變數
    # if ($request_method = POST) { set $skip_cache 1; }
    # if ($query_string != "") { set $skip_cache 1; }
    # if ($cookie_wordpress_logged_in) { set $skip_cache 1; }
    # if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") { set $skip_cache 1; }
    # if ($request_uri ~* "/store.*|/cart.*|/my-account.*|/checkout.*|/addons.*") { set $skip_cache 1; }
}

囉嗦一下:FastCGI Cache 最麻煩的是「快取清除」。當你在後台更新文章後,需要有機制通知 Nginx 清除對應的快取。這通常可以透過一些 WordPress 外掛(如 Nginx Helper)或自訂腳本來實現。

讓瀏覽器記住你:靜態資源的 `expires` 指令

對於不常變動的靜態檔案,如圖片、CSS、JS,我們可以告訴瀏覽器「把它們存起來,下次直接用,別再來問我了」。這就是瀏覽器快取,透過設定 expires HTTP 標頭來實現。


# /etc/nginx/sites-available/yourdomain.com

location ~* \.(css|js|ico|gif|jpe?g|png|svg|webp|woff2?)$ {
    expires 365d;
    add_header Cache-Control "public, no-transform";
    access_log off;
    log_not_found off;
}

導入 HTTP/2:現代化協定的加速魔法

如果你的網站還在使用古老的 HTTP/1.1,那真的是輸在起跑線上了。HTTP/2 帶來了多路複用(Multiplexing)等關鍵特性,允許瀏覽器在一個 TCP 連線中同時請求多個資源,大大減少了延遲。啟用它在 Nginx 中非常簡單,只需要在 listen 指令後面加上 http2 即可。

前提是,你的網站必須啟用 HTTPS/SSL,因為現代瀏覽器只在 HTTPS 連線上支援 HTTP/2。


# /etc/nginx/sites-available/yourdomain.com

server {
    # 監聽 443 port,同時啟用 SSL 和 HTTP/2
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name yourdomain.com;

    # ... 你的 SSL 憑證設定 ...
    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
}

結論:效能優化是一趟永無止境的旅程

我們今天從 Nginx 的核心參數、數據壓縮、伺服器快取,一路談到最新的 HTTP 協定。完成這些進階的 Nginx 主機效能最佳化 設定後,你的 WordPress 網站速度肯定會有質的飛躍。但記住,效能調校不是一次性的工作,而是一個持續監控、分析、調整的循環過程。伺服器負載、網站流量、程式碼的變更,都可能需要你重新審視這些設定。

這其中的水很深,也很迷人。當你看到網站的載入時間從 3 秒降到 1 秒內時,那種成就感,是身為工程師最大的樂趣之一。希望這篇文章能幫助你把 Nginx 這頭猛獸馴服得服服貼貼,讓它成為你網站最強大的加速引擎。

延伸閱讀

如果你覺得這些設定太過複雜,或者希望有專業的團隊為你的網站進行全面的架構健檢與效能優化,浪花科技的團隊隨時準備好為你服務。我們專注於打造高效能、高安全性的 WordPress 解決方案。歡迎與我們聯繫,讓我們一起釋放你網站的真正潛力!

常見問題 (FAQ)

Q1: worker_processes 到底該設多少?

A1: 最簡單且推薦的作法是直接設定為 auto。Nginx 會自動偵測你伺服器的 CPU 核心數並進行最佳化配置。如果你想手動設定,可以先透過 lscpu | grep "^CPU(s):"nproc 指令查詢核心數,然後將該數值填入即可。

Q2: 開了 FastCGI Cache 後,文章更新後沒看到變化怎麼辦?

A2: 這是 FastCGI Cache 最常見的問題。因為 Nginx 已經把舊的頁面快取起來了,它不知道你更新了內容。你需要一個「快取清除」機制。最推薦的方式是安裝 Nginx Helper 這類外掛,並將其設定為在你發佈或更新文章時,自動清除相關頁面的快取。這是打通 WordPress 與 Nginx 快取之間任督二脈的關鍵一步。

Q3: Gzip 和 Brotli 可以同時啟用嗎?

A3: 絕對可以,而且這是最佳實踐!你可以在 Nginx 設定檔中同時開啟 Gzip 和 Brotli。Nginx 會根據瀏覽器發送來的 Accept-Encoding 請求頭來決定要回傳哪種壓縮格式。如果瀏覽器支援 Brotli (br),Nginx 會優先使用壓縮率更高的 Brotli;如果不支持,則會自動降級使用 Gzip。這樣可以確保對新舊瀏覽器都提供最好的效能。

Q4: 這些設定會不會跟我的 Cloudflare 或 CDN 衝突?

A4: 不但不會衝突,反而會相得益彰!這些 Nginx 的優化是針對「源伺服器」的。一個反應快速的源伺服器,可以讓 CDN 更快地抓取到最新內容。例如,你在 Nginx 設定的 Gzip/Brotli 壓縮,可以減輕源伺服器到 CDN 之間的回源流量。你設定的瀏覽器快取標頭 (expires),CDN 也會遵循並傳遞給使用者。你只需要確保 CDN 的快取規則和你伺服器的快取策略是一致的,例如,CDN 的快取時間不應長於你在 Nginx 設定的 expires 時間,以避免內容更新不及時的問題。

 
立即諮詢,索取免費1年網站保固