Select Page

WordPress 性能優化:使用 NGINX FastCGI Cache 提高頁面加載速度

在許多 WordPress 網站運營者的心中,提升網站載入速度始終是一項持續的任務。快速的載入速度不僅能改善用戶體驗,降低跳出率,還能在搜索引擎優化(SEO)上取得更好的成績。本文將引導您如何通過配置 NGINX 的 FastCGI Cache 來提升您的 WordPress 網站載入速度。

為什麼選擇 NGINX 的 FastCGI Cache?

NGINX 作為一款高效能的 Web 伺服器,其 FastCGI Cache 功能可以對動態內容(如 WordPress 生成的頁面)進行快取,從而減少對後端伺服器的請求,提高頁面載入速度。與其他快取方法相比,FastCGI Cache 直接在 Web 伺服器層面進行操作,能更精確地控制快取內容及其有效期。

步驟一:設定快取儲存路徑

建立快取存放的路徑,注意目錄擁有者是 www-data

sudo mkdir -p /etc/nginx/cache
sudo chown -R www-data:www-data /etc/nginx/cache

下面的設定是放在記憶體中的設定,如果你想要把快取放在記憶體內,要用下面這一個

sudo mkdir -p /var/run/cache/nginx
sudo chown -R www-data:www-data /var/run/cache/nginx

首先,您需要在 NGINX 配置文件中指定快取的儲存路徑及其他相關參數。打開您的 NGINX 配置文件(通常位於 /etc/nginx/nginx.conf),並添加以下配置:

http {
    ...
    fastcgi_cache_path /etc/nginx/cache levels=1:2 keys_zone=WORDPRESS_CACHE:100m inactive=60m max_size=256m;
    fastcgi_cache_key "$scheme$request_method$host$request_uri";
    fastcgi_cache_use_stale error timeout invalid_header http_500;
    fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
    ...
}

這段配置創建了一個名為 WORDPRESS_CACHE 的快取區域,並將其儲存路徑設定為 /etc/nginx/cachelevels=1:2 定義了目錄結構,keys_zone 指定了快取鍵的儲存空間大小,1 MB 的記憶體大約可以存放八千個左右的鍵值,也就是說若設定為 16 MB 的話(16m),大約可以快取 128,000 個左右的網址,max_size 是設定快取檔案的總容量上限(也就是放在 /etc/nginx/cache 中的檔案大小上限),inactive=60m 表示如果快取內容在60分鐘內未被訪問,則會被自動清除。

步驟二:啟用 FastCGI Cache

接下來,在處理 PHP 請求的 location 塊中啟用 FastCGI Cache。這通常在您站點的伺服器配置中(例如 /etc/nginx/sites-available/yourdomain.com):

server {
    ...
    set $skip_cache 0;

	# POST 請求不用快取
	if ($request_method = POST) {
    	set $skip_cache 1;
  	}

  	# 若有 query 參數的網址不用快取
  	if ($query_string != "") {
      	set $skip_cache 1;
  	}

  	# 特殊的網址不用快取
  	if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
      	set $skip_cache 1;
  	}

  	# 已登入使用者、留言者不用快取
  	if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
      	set $skip_cache 1;
  	}
    
    #正在維護模式中也略過
	if (-f "$document_root/.maintenance") {
    	set $skip_cache 1;
	}

  	# 加入快取資訊表頭(除錯用)
  	add_header X-Cache $upstream_cache_status;

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_index index.php;
    	include fastcgi.conf;
        
        # FastCGI 快取設定
        fastcgi_cache WORDPRESS_CACHE;
        fastcgi_cache_valid 200 301 302 1d;
        fastcgi_cache_bypass $skip_cache;
    	fastcgi_no_cache $skip_cache;
        
        # 可以加入除錯用的標頭
        add_header X-Cache "$upstream_cache_status From $host";
    	add_header Cache-Control  max-age=0;
    	add_header Nginx-Cache "$upstream_cache_status";
    	add_header Last-Modified $date_gmt;
    }
    ...
}

這裡,fastcgi_cache 指令啟用了快取,並指定使用前面創建的快取區域。fastcgi_cache_valid 200 60m 表示成功的響應(HTTP 200 狀態碼)將被快取60分鐘。

步驟三:細化快取規則

為了避免快取敏感內容或確保特定條件下的頁面不被快取,您可以進一步細化快取規則。例如,避免快取已登入用戶的內容:

fastcgi_cache_bypass $cookie_user_logged_in;
fastcgi_no_cache $cookie_user_logged_in;

這些指令確保當 user_logged_in cookie 存在時,快取將被繞過。

清除快取

利用指令清除所有的快取

rm -rf /path/to/your/nginx/cache/*

利用 API 清除快取

首先去取 nginx 的 config 檔案中加入以下設定

location /purge_cache/ {
    allow 127.0.0.1; # 允許本地
    allow '多個主機ip';
    deny all; # 拒绝其他所有请求
    fastcgi_cache_purge WORDPRESS_CACHE $scheme$request_method$host$request_uri;
}

接下來就可以安裝 Nginx Helper 或是透過呼叫API網址清除快取

curl -X GET http://your-domain.com/purge_cache/the_uri_to_purge

區分手機版本和電腦版本

map $http_user_agent $is_desktop {
    default 0;
    ~*linux.*android|windows\s+(?:ce|phone) 0; # exceptions to the rule
    ~*spider|crawl|slurp|bot 1; # bots
    ~*windows|linux|os\s+x\s*[\d\._]+|solaris|bsd 1; # OSes
}

## Revert the logic.
map $is_desktop $is_mobile {
    1 0;
    0 1;
}
add_header x-ua-device $is_mobile;

# cache key 要加入 is_moubile
fastcgi_cache_key "$scheme$request_method$host$request_uri$is_mobile";

將快取放在記憶體,開機要自動執行

若是你把快取得存放路徑設定在記憶體中 /var/run ,那要記得設定重開機自動要建立該目錄,並且讓nginx重生效才行

先建立一個執行檔,執行重開機的設定

nano start-fastcgi.sh
chmod +x start-fastcgi.sh

start-fastcgi.sh的內容如下

mkdir -p /var/run/cache/nginx
chown -R www-data:www-data /var/run/cache/nginx
systemctl restart nginx

建立開機自動執行檔

sudo nano /etc/rc.local

rc.local 內容如下

#!/bin/bash
bash /home/yourname/start-fastcgi.sh

exit 0

設定開機自動執行

如果之前完全沒有設定過開機自動執行,那你會需要先設定開機自動執行的環境

rc-local 創建一個 Systemd 單元文件

sudo nano /etc/systemd/system/rc-local.service

將以下內容添加到文件中:

[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99

[Install]
WantedBy=multi-user.target

啟用並啟動服務

現在您有了一個為 rc-local 正確配置的 systemd 服務文件,您可以啟用並啟動它:

sudo chmod +x /etc/rc.local
sudo systemctl enable rc-local.service
sudo systemctl start rc-local.service

常見問題

無法使用 purage_all 功能,可以重新編譯 Nginx ,加入參數 –add-module=/path/to/src/ngx_cache_purge-2.3.1

Nginx Helper 的替代 Nginx FastCGI Cache

開發人員必看的 Web Push 功能教學

開發人員必看的 Web Push 功能教學

Web Push 是一種標準的 Web 協議,允許網站向使用者發送推播通知。這項功能可用於各種目的,例如:

  • 提醒使用者有新的內容或更新
  • 提供即時通知,例如交易狀態或聊天訊息
  • 提高使用者參與度

準備工作

  • 前端訂閱推播服務的 js 檔案
  • 前端訂閱推播服務的網頁,需要包含訂閱服務的 js
  • 後端紀錄使用者訂閱資訊的服務
  • 後端推播訊息的服務
  • 後端註冊訊息伺服器的程式碼

建立前端網頁的訂閱表單

這個檔案將包含安裝、激活、攔截請求和推播事件的處理器。創建一個名為sw.js的檔案,並將其放在你網站的根目錄下

// 安裝Service Worker
self.addEventListener('install', function(event) {
    console.log('Service Worker 安裝成功');
});

// Service Worker 激活
self.addEventListener('activate', function(event) {
    console.log('Service Worker 激活成功');
});

// 監聽推播事件
self.addEventListener('push', function(event) {
    var title = '推播通知';
    var options = {
        body: '這是一條推播消息。',
        icon: 'icon.png',
        badge: 'badge.png'
    };

    event.waitUntil(self.registration.showNotification(title, options));
});

在你的網站上註冊一個Service Worker,這是實現Web推播的必要步驟。Service Worker將在背景執行,即使用戶沒有直接訪問你的網站也能接收通知。通常會把下面的 javascript 寫在首頁中,觸發訂閱的條件。

// 在主要的JavaScript檔案中
function urlBase64ToUint8Array(base64String) {
    const padding = '='.repeat((4 - base64String.length % 4) % 4);
    const base64 = (base64String + padding)
        .replace(/\-/g, '+')
        .replace(/_/g, '/');

    const rawData = window.atob(base64);
    const outputArray = new Uint8Array(rawData.length);

    for (let i = 0; i < rawData.length; ++i) {
        outputArray[i] = rawData.charCodeAt(i);
    }
    return outputArray;
}

if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/sw.js').then(function(registration) {
    console.log('Service Worker 注册成功:', registration);
  }).catch(function(error) {
    console.log('Service Worker 注册失败:', error);
  });
}
navigator.serviceWorker.ready.then(function(registration) {
  if (!registration.pushManager) {
    alert('此瀏覽器不支持推播通知');
    return false;
  }
const applicationServerKey = 'your publice key';
  
// 訂閱推播
  registration.pushManager.subscribe({
    userVisibleOnly: true,
    applicationServerKey: urlBase64ToUint8Array(applicationServerKey)
  }).then(function(subscription) {
    console.log('推播訂閱成功:', subscription);

    // 發送訂閱資訊到後端
    fetch('https://your_webpush_server/subscribe', {
      method: 'post',
      headers: {
        'Content-type': 'application/json'
      },
      body: JSON.stringify({
        subscription: subscription
      }),
    });
  }).catch(function(error) {
    console.log('推播訂閱失败:', error);
  });

提供紀錄訂閱訊息的服務

這一段的作法很多,通常用你原本伺服器中的解決方案,例如 php,asp.net,nodejs,python,GO等,我這邊為了方便,用nodejs示範下

const express = require('express');
const cors = require('cors');

const bodyParser = require('body-parser');
const app = express();
app.use(cors());
app.use(bodyParser.json());

const subscriptions = {}; // 在實際應用中,應使用資料庫儲存訂閱資訊

const webPush = require('web-push');
    // 設置你的VAPID鑰匙
    webPush.setVapidDetails(
        'mailto:[email protected]',
      	'your publiec key',
      	'your private key'
      };

app.post('/subscribe', (req, res) => {
    const subscription = req.body;
    const key = subscription.endpoint; // 使用endpoint作為唯一鑰匙
    subscriptions[key] = subscription;

    console.log('subscripted');
    console.log(subscription);
    
    // subscription是從前端發送到後端的訂閱對象
    webPush.sendNotification(subscription.subscription, '消息內容')
        .then(result => console.log('推播成功'))
        .catch(err => console.log('推播失敗', err));

    res.status(200).json({message: '訂閱成功'});
});

app.listen(8060, () => console.log('伺服器運行在8060端口'));

其中 sendNotification 平常應該是要放在 webpush service中的,這邊加入是用來測試使用

生成VAPID鑰匙 (自願應用伺服器身份驗證)

大部分現代瀏覽器(如Chrome、Firefox、Edge)都支持Web推播API,但是如果你不用市面上的解決方案如 OneSignal 而是要直接與這些瀏覽器的推播服務交互的話,需要使用VAPID(自願應用伺服器身份驗證)鑰匙進行身份驗證。

生成 VAPID Key 的方法如下

npx web-push generate-vapid-keys

記住保存生成的鑰匙。公鑰將在前端用於訂閱推播,私鑰將在後端用於發送推播。


如果你無法使用npx(它通常隨npm自動安裝,作為npm 5.2.0及更高版本的一部分),那麼你可以通過下載最新版本的 nodejs

https://nodejs.org/

或是升級Node.js,或使用版本管理器如nvm(Node Version Manager)來管理不同版本的Node.js。

參考資料

https://developer.mozilla.org/en-US/docs/Web/API/Push_API

Electric Rice Cooker Magic: Turning Simple Grains into Culinary Delights

Electric Rice Cooker Magic: Turning Simple Grains into Culinary Delights


Cooking rice in a rice cooker may seem straightforward, but achieving the perfect texture and flavor that makes each grain distinct and delicious is an art. Here, we share six key tips for using a standard electric rice cooker that will instantly upgrade your rice, making it more flavorful and enjoyable. These steps are tailored to guide pasta-loving foreigners on how to master the art of cooking incredibly tasty white rice with a rice cooker, transitioning from the initial rice washing to the moment the rice is perfectly cooked.

Step 1: Washing the Rice

When washing rice, speed and a gentle touch are crucial to remove dust and excess starch without breaking the grains.

Step 2: Adding Water

The golden ratio of rice to water is 1:1.2, as revealed by culinary experts. This ratio ensures the rice is neither too hard nor too soft.

Step 3: Soaking

It’s recommended to soak the rice for about half an hour in summer and extend the soaking time to 1.5 hours in winter. This step ensures the grains fully absorb water, leading to a better texture after cooking.

Step 4: Cooking the Rice

Before starting the rice cooker, add a little salad oil and white vinegar to the soaked rice. This trick not only gives the rice an extra shine and a beautiful white color but also enhances its flavor, making it more appealing.

Step 5: Letting the Rice Steam

After the cooking cycle completes, let the rice sit and steam for about 5 to 10 minutes before opening the lid. This allows the rice to finish cooking in its own steam, improving its texture.

Step 6: Fluffing the Rice

Fluffing the cooked rice with a fork or rice paddle before serving ensures that the grains are separate and not clumpy. This step is vital for achieving a uniform texture throughout the pot.

By following these simple yet effective tips, even those accustomed to pasta can easily cook delicious white rice using an electric rice cooker. Each step, from washing the rice to fluffing it before serving, is designed to enhance the rice’s natural flavor and texture, turning a simple grain into a delightful accompaniment to any meal.

Electric Rice Cooker Magic: Turning Simple Grains into Culinary Delights

從洗米到鬆飯:電鍋煮出美味白飯的六大技巧


煮出一鍋香Q、粒粒分明的白米飯,對許多人來說是每天的必需,但想要將這個日常行為升級成為一種藝術,則需要掌握一些關鍵的技巧。使用電鍋煮飯,雖然簡單方便,但要讓米飯達到完美的口感和香氣,就需要遵循以下六個步驟,從洗米開始,到最終的鬆飯階段,每一步都藏有提升飯質的小秘訣。

第1步:洗米

洗米是煮飯過程中的第一步,也是極為重要的一步。正確的洗米方法可以去除米粒表面的多餘澱粉和灰塵,防止煮出來的飯黏稠或是有異味。洗米時,手法需快速且輕巧,這樣才能有效清洗而不破壞米粒。

第2步:加水

加水量直接影響到米飯的口感。一般來說,米與水的黃金比例是1:1.2,這個比例適合大多數的電鍋,能煮出既不過硬也不過軟的白飯。

第3步:浸泡

根據季節的不同,浸泡米的時間也應有所調整。夏天的時候,因為氣溫較高,浸泡半小時左右即可;而在冬天,則建議將浸泡時間延長至1.5小時,這樣可以確保米粒吸足水分,煮出來的米飯更加鬆軟。

第4步:煮飯

在煮飯之前,在浸泡好的米中加入少量的沙拉油和白醋,是一個小技巧。沙拉油可以讓米飯更加閃亮,而白醋則有助於讓米飯顏色更加純白,增加飯菜的美觀和食慾。

第5步:悶飯

米飯煮好後,不要急著打開電鍋蓋。讓米飯在鍋中悶5到10分鐘,可以讓米飯吸收剩餘的水分,變得更加香Q。

第6步:鬆飯

煮好的米飯在悶好之後,打開鍋蓋,用飯匙輕輕拌勻。這個動作不僅可以幫助米飯散熱,還能確保每一粒米飯都能均勻吸收水分和香氣,達到整鍋米飯口感一致的效果。

洗快且輕、泡水、1:1.2、少量油、再悶一下

洗米水拿去澆花

掌握了這些小訣竅,就能在家用電鍋煮出一鍋又香又Q的白米飯。這些步驟雖然簡單,但每一步都蘊含著對食材的尊重和對烹飪的熱愛,讓日常的米飯變成一頓美味的盛宴。

如何使用DeepBrain AI立即生成數字主播視頻”

如何使用DeepBrain AI立即生成數字主播視頻”

DeepBrain AI 是一家專注於人工智能技術開發的公司,其創新的AI Video Generator Online平台能夠通過簡單的文字輸入、網址提供或上傳PPT文件,迅速生成一個數字化的主播來講解提供的內容。這項技術不僅改變了內容創建的方式,也為教育、新聞、營銷等多個領域帶來了革命性的影響。

文字轉換視頻

使用DeepBrain AI的AI Video Generator,用戶可以僅通過輸入文字來創建視頻內容。這項技術使用先進的自然語言處理(NLP)來理解文字內容,並將其轉換為數字主播的語音。這意味著用戶可以快速製作新聞報導、產品介紹或任何其他類型的視頻內容,而無需實際拍攝視頻。

網址內容轉換

除了文字輸入之外,DeepBrain AI的平台還允許用戶提供一個網址,系統將自動提取該網頁上的內容,並生成一段由數字主播講解的視頻。這對於想要快速轉換網絡文章或博客為視頻內容的用戶來說,是一個非常有用的功能。

上傳PPT轉換視頻

對於需要將演示文稿轉換為視頻教程或演講的用戶,DeepBrain AI提供了上傳PPT文件的功能。平台將自動分析PPT中的內容,包括文本和圖像,並創建一個數字主播來講解這些內容。這使得教育者和企業專業人士能夠以更互動和吸引人的方式分享他們的知識和信息。

輸出到YouTube

一旦視頻內容被創建,DeepBrain AI的平台還支持將視頻直接上傳到YouTube,這為用戶提供了一種便捷的方式來分享和分發他們的內容。通過這種方式,用戶可以輕鬆地將他們的數字主播創建的視頻推廣到更廣泛的觀眾。