nginx改採redis減少TTFB

在文章 如何減少nginx+wordpress+mysql架設在windows裡伺服器回應的等待時間(TTFB) 裡是使用 fastcgi_cache 寫入磁碟的方式,來讓網站的暫存得以快取資料進行降低 TTFB。

把快取從傳統的本機硬碟(W 碟)升級到 Redis(記憶體資料庫),是讓 WordPress 在 Windows 下達到極速、徹底解決硬碟 I/O 延遲以及 權限問題 的終極解決方案。

在 Windows 環境中,最穩定且高效的配置方式是:讓 Nginx 保持輕量、由 WordPress 透過 Object Cache 直接對接 Redis。這樣可以繞過 Windows Nginx 缺乏原生 Redis 模組的缺點,同時享受高併發與極速回應(TTFB 大幅下降)。

以下是完整的 Nginx、WordPress 與 Redis 設定指南:

第一步:下載並在 Windows 啟動 Redis

  • 下載 Redis:前往 GitHub 下載 tporadowski/redis 的 Windows 綠色免安裝版(.zip)。或是使用 zkteco-home/redis-windows 的 Windows 綠色免安裝版(本站使用)。
  • 解壓縮並啟動:解壓到您的 W 碟(例如 W:\redis)。
  • 測試啟動:雙擊 redis-server.exe。如果看到一個由 ASCII 字元組成的立方體圖案,代表 Redis 已經在背景成功監聽 127.0.0.1:6379
image 2

第二步:安裝 WordPress Redis 物件快取外掛

有了 Redis 服務後,我們需要讓 WordPress 把資料庫查詢結果(Object Cache)與頁面直接丟給 Redis 處理。

  • 在 WordPress 後台搜尋並安裝 Redis Object Cache 外掛(由 Till Krüss 開發)。
  • 打開您的 wp-config.php,在最後一行之前,加入 Redis 的連線宣告:
PHP
// 設定 WordPress 對接本地 Redis
define( 'WP_REDIS_HOST', '127.0.0.1' );
define( 'WP_REDIS_PORT', 6379 );
define( 'WP_REDIS_TIMEOUT', 1 );
define( 'WP_REDIS_READ_TIMEOUT', 1 );

// 【重要】如果您一台伺服器有多個網站,必須加這行前綴區隔記憶體快取
define( 'WP_CACHE_KEY_SALT', 'your_web_site_prod_' );
  • 回到 WordPress 後台的 設定 > Redis,點擊 「Enable Object Cache (啟用物件快取)」。狀態顯示為 Connected 即代表成功!

第三步:調整 Nginx 設定(全面改為靜態與代理分離)

既然高頻率的資料庫查詢與頁面都已經由 Redis 記憶體接管,您的 Nginx 就不再需要原本容易出錯的硬碟 fastcgi_cache_path 了。這可以完全避免之前的 W 碟檔案權限衝突與文章存檔時的 JSON 錯誤!

請將 nginx.conf 內,HTTPS 443 的 location ~ \.php$ 區塊還原並優化為以下純淨高效的設定

PHP
# HTTP server: http://your_web_name (純轉址)
server {
	# listen 設定這個 server 監聽的 port
	listen       80;
	listen [::]:80 ;
	server_name  your_web_name;
	root   html/your_web_name;
	
	# 將 HTTP 資源永久導向至 HTTPS, 純轉址即可,不需要在這裡放 fastcgi_cache 參數,否則會報錯
	return 301 https://$server_name$request_uri;
}


# HTTPS server: https://your_web_name (WordPress 主體)
# For WordPress
server {
	# 使用 https 協定
	listen       443 ssl;
	charset utf-8;
	root         html/your_web_name;
	access_log   logs/your_web_name.access.log;
	error_log    logs/your_web_name.error.log;
	index        index.php index.html index.htm;
	server_name  your_web_name.com;

	# Windows 環境下,建議憑證路徑使用正斜線 /,避免 \ 被誤判為跳脫字元
	# ... 您的 SSL 憑證路徑保持不變 ...

	ssl_session_cache    shared:SSL:1m;
	ssl_session_timeout  5m;

	ssl_ciphers  HIGH:!aNULL:!MD5;
	ssl_prefer_server_ciphers  on;

	location / {
		# include the "?$args" part so non-default permalinks doesn't break when using query string
		#轉址符合SEO 隱藏副檔名
		try_files $uri $uri/ /index.php?$args;
	}
	
	location = /favicon.ico {
		log_not_found off;
		access_log off;
	}
	
	# 靜態檔案快取(直接由 Nginx 處理,極速)直接由 Nginx 快取,不驚動 PHP 與 Redis
	location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
		expires max;
		log_not_found off;
		access_log off;
		# 開啟高效傳輸
		tcp_nodelay on;
	}
	
	location = /robots.txt {
		allow all;
		log_not_found off;
		access_log off;
	}
	
	# 處理 WordPress PHP:純代理模式,快取交給 Redis 與 WP-Optimize 處理		        
	location ~ \.php$ {            
		include        fastcgi.conf;
		include        fastcgi_params;
		
		# 【優化】如果有設定 upstream,請把 127.0.0.1:9000 改為 php_cluster
		# 如果沒有設定 upstream,則維持原樣 127.0.0.1:9000
		fastcgi_pass   127.0.0.1:9000;
		fastcgi_index  index.php;
		fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

		# 允許自訂的 X-Redis-Cache 標頭傳遞給瀏覽器
		fastcgi_pass_header X-Redis-Cache;

		# 在瀏覽器標頭加入連線提示(因為不由 Nginx 快取,顯示後端連線狀態)
		add_header X-Backend-Server "PHP-CGI-Windows";
		
		# 逾時時間維持 60 秒
		fastcgi_read_timeout 60s;
		fastcgi_connect_timeout 60s;

		# 增加緩衝區大小,避免 Windows 下的大頁面傳輸被截斷
		fastcgi_buffers 16 16k;
		fastcgi_buffer_size 32k;
	}

	location ~ /\.(?!well-known).* {
			deny all;
	}
}

修改完成後,請記得手動移除 http 區塊最上方的 fastcgi_cache_path,並重啟 Nginx (nginx -s reload)。

第四步:搭配 WP-Optimize 清理與快取

現有的 WP-Optimize 外掛依然可以完美保留:

  • WP-Optimize:負責處理未登入訪客的「前端頁面快取 (Page Cache)」,將網頁以最小的效能開銷生成。
  • Redis Object Cache:負責處理後台運算、資料庫查詢、REST API 的「後端記憶體快取 (Object Cache)」。
  • Nginx + Upstream:負責以超高併發、平行處理的方式,將請求在零延遲的情況下分流給 PHP。

這樣一來,文章存檔會變得非常順暢,且未登入與已登入用戶的體驗都能同時達到最速。

如何確認有由 redis 取出

要確認 WordPress 是否成功從 Redis 記憶體中讀取資料,與之前由 Nginx 處理的 X-FastCGI-Cache 不同。因為我們現在不透過 Nginx 快取,而是由 WordPress 內部的 PHP 程式碼直接與 Redis 對接

最簡單、最直覺的檢驗方式有以下兩種:

方法一:直接在網頁原始碼查看(最推薦、免裝外掛)

使用的 Redis Object Cache 外掛,預設會在每個網頁的 HTML 原始碼最末端,自動隱藏塞入一行診斷資訊。

  • 打開網站首頁(可使用無痕視窗)。
  • 在網頁任意空白處點擊右鍵,選擇 「檢視網頁原始碼」 (或按快捷鍵 Ctrl + U)。
  • 捲動到網頁的最底端(最後幾行),您會看到類似以下的 HTML 註解文字:
PHP
<!--
Performance optimized by Redis Object Cache. Learn more: https://wprediscache.com

從使用 PhpRedis (v6.2.0) 的 Redis 擷取到 6717 個物件 (總計 2 MB)
-->
<!-- Cached by WP-Optimize (gzip) - https://teamupdraft.com/wp-optimize/ - Last modified: 2026-07-02 10:33 (Asia/Taipei UTC:8) -->

只要在最底下有看到 RedisObject Cache 的相關英文字樣,就代表這一頁在 PHP 執行時,已經成功跟 Redis 拿取資料了!

方法二:利用 Nginx 轉發 WordPress 的 Redis 狀態(達成 F12 標頭檢驗)

如果您依然希望在 F12 的 Response Headers(回應標頭) 中看到明確的狀態,我們可以透過在 WordPress 的 functions.php 塞入一行小程式,讓 WordPress 主動告訴 Nginx,再由 Nginx 吐給瀏覽器。

1. 修改 WordPress 佈景主題的 functions.php

請進入您的 WordPress 後台,到 外觀 > 佈景主題檔案編輯器,找到您目前主題的 functions.php,在最底部加上這段程式碼:

PHP
add_action('wp_headers', 'add_redis_cache_header');
function add_redis_cache_header($headers) {
    // 檢查 Redis 全域變數是否存在且已連線
    global $wp_object_cache;
    if (isset($wp_object_cache) && method_exists($wp_object_cache, 'get_redis_version')) {
        $headers['X-Redis-Cache'] = 'HIT (Redis Memory)';
    } else {
        $headers['X-Redis-Cache'] = 'MISS (Database Fallback)';
    }
    return $headers;
}

2.修改 Nginx 設定檔

接著打開您的 nginx.conf,在 location ~ \.php$ 區塊中,加入以下這行,允許後端 PHP 自訂的標頭能夠傳遞給瀏覽器:

INI
location ~ \.php$ {
    # ... 您原本的其他設定 ...
    
    # 允許轉發 WordPress 送過來的 X-Redis-Cache 標頭
    fastcgi_pass_header X-Redis-Cache;
    
    # ... 您原本的其他設定 ...
}

修改後請重啟 Nginx (nginx -s reload)。

3. 測試 F12 效果

現在可以打開瀏覽器按下 F12,切換到 Network (網路),重新整理網頁並點擊第一個請求。就會在 Response Headers 中,看到夢寐以求的:
X-Redis-Cache: HIT (Redis Memory) 囉!

可以先試試 方法一,看看網頁最底下有沒有出現 Redis 的隱藏註解。

NGINX helper 外掛設定前置詞 (Redis Key Prefix)

在改用 Redis 物件快取 搭配 WP-Optimize 前端快取 之後,「前置詞 (Redis Key Prefix)」 扮演了極為關鍵的角色。它的主要作用是確保 Redis 記憶體中,這台主機的快取資料不會與其他網站(或測試站)混在一起。

同時,由於您現在已經不使用 Nginx 端的 FastCGI 硬碟快取(改由 Redis 處理後端、WP-Optimize 處理前端 HTML),Nginx Helper 外掛中的「Nginx 設定(Nginx Settings)」區塊,在功能上其實已經功成身退

為了保持系統的純淨與運作邏輯正確,以下是前置詞的設定方式以及目前的完整配置說明:

1. 「前置詞」應該設定為什麼?

前置詞的設定必須在 WordPress 的 wp-config.php 檔案中定義。
因為您的網站網址是 your_website_name,建議使用具有辨識度的獨一無二小寫代號加底線。

請將以下程式碼加入到您的 wp-config.php 中:

INI
// Redis 專用的唯一前置詞,避免多個網站時記憶體資料發生衝突
define( 'WP_CACHE_KEY_SALT', 'your_website_name_' );

設定好此常數後,WordPress Redis Object Cache 外掛就會自動在寫入 Redis 的每一筆資料前加上 your_website_name_

2. Nginx Helper 外掛中的「Nginx 設定」該如何處理?

因為已經在 nginx.conf 中刪除了 fastcgi_cache WORDPRESS; 這些硬碟快取指令,Nginx Helper 的自動清理功能在當前架構下「不需要啟用」

  • 為什麼?
    因為現在前端快取已經交給 WP-Optimize(它內建就會在發布文章時自動清理快取),後端快取交給 Redis(它會常駐記憶體並自動同步)。
  • 正確的 Nginx Helper 設定:
    在 WordPress 後台的 工具 > Nginx Helper 中,建議直接將 「Enable Purge」取消勾選(關閉)

最終的 WordPress 外掛分工

  1. Redis Object Cache 外掛:保持啟用(Status: Connected)。負責接管所有的資料庫與後端查詢。
  2. WP-Optimize 外掛:在 Cache 頁面中開啟 Enable page caching。它會負責把首頁與各文章自動存成快取,且在您發布新文章時,它會自動完成全站清理,完全不會跳出 JSON 錯誤。
  3. Nginx Helper 外掛:在此 Redis 架構下,可以直接停用(Disable Purge)或將其解安裝。

請試著將 前置詞 (WP_CACHE_KEY_SALT) 加入 wp-config.php,並在 WP-Optimize 中啟用頁面快取。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


內容索引