Select Page

如何檢查 wordpress 網站被誰存取和攻擊

目前正在處理的 request

編輯 php-fpm pool(www)

啟用下面的這幾行

重啟服務

檢查服務

curl 127.0.0.1/fpm-status?full

會看到的資訊

慢查詢-外掛定位

查詢

tail -f /var/log/php-fpm/slow.log

# 或是
tail -n 50 /var/log/php-fpm/slow.log

針對慢查詢,精準的找出問題

慢站點 Top:

sudo awk -F'= ' '/^script_filename/ {print $2}' /var/log/www-slow.log \
| awk -F'/' '{print $4}' | sort | uniq -c | sort -nr | head -20

入口 Top:

sudo awk -F'= ' '/^script_filename/ {print $2}' /var/log/www-slow.log \
| awk -F'/' '{print $NF}' | sort | uniq -c | sort -nr | head -20

外掛 Top:

多站的正確架構

每站一個 pool:

Nginx 的對應:

在Nginx中支援 WordPress 的 Webp,Avif 圖檔

大前提你要先安裝有支援 webp, avif 的外掛,例如EWWW, Convert Media等等

在 Nginx 配置中加 map 指令

  • 在 Nginx 的主配置文件,通常在 /etc/nginx/nginx.conf
  • http {} 内、server {} 之前,加入以下内容:
map $http_accept $avif_suffix {
    default "";
    "~*avif" ".avif";
}
map $http_accept $webp_suffix {
    default "";
    "~*webp" ".webp";
}
  • 配置客户端的 Accept ,來定義 $avif_suffix$webp_suffix 變量,確認是否支持 AVIF 或 WebP 格式。

Nginx 讀取 AVIF 和 WebP 的 MIME Type

找到 /etc/nginx/mime.types

image/avif  avif;
image/webp  webp;

在站點配置中設定重導向

  • 找到 /etc/nginx/sites-available/yourdomain
  • server {} ,加入以下内容:
location ~* ^/wp-content/.+\.(jpe?g|png|gif)$ {
    add_header Vary Accept;
    add_header Cache-Control "private";
    expires 365d;
    try_files $uri$avif_suffix $uri$webp_suffix $uri =404;
}

作用是:

  • 匹配所有請求的 .jpg.jpeg.png.gif 文件。
  • Vary: Accept ,告訴缓存系統按照 Accept 來區分不同的響應。
  • 缓存控制和過期時間。
  • 使用 try_files 指令,會先試提供的 .avif 文件,如果不存在,則提供 .webp 文件,若仍不存在,則提供原始文件。

測試並且重新加載 Nginx 配置

sudo nginx -t
sudo systemctl reload nginx

這些配置假設您的 .avif.webp 文件與原始圖片文件位於相同的目錄,並具有相同的文件名,只是副檔名不同(例如,image.jpg 對應 image.jpg.avifimage.jpg.webp)。

此外,請確保您的伺服器上已經存在對應的 .avif.webp 文件,否則 Nginx 將返回 404 錯誤。

有關更多詳細資訊,您可以參考以下資源:

網站圖片無縫兼容 WebP/AVIF

在 Nginx 上提供 WebP 和 AVIF 圖片

圖片優化新選擇!WebP、AVIF 如何提升網站速度

解除 wordpress 的大圖檔尺寸限制

wordpress 在5.3版本以後,系統預設會把圖檔的尺寸限制在2560px以內,但台灣的電商喜歡用超長尺寸的圖檔或是海報,很多人的解法是分割成多張圖排列,但也可以直接在程式碼中解除預設的限制

解除 wordpres 大圖的尺寸限制

直接在 functions.php 新增下面的程式碼

add_filter( 'big_image_size_threshold', '__return_false' );

參考資料

讓 www-data 執行 SERVER 上的特定權限指令

sudoers 檔案控制了使用者及群組在使用 sudo 指令時的權限。為了安全編輯這個檔案,應該使用 visudo 指令,因為它會檢查語法錯誤,避免創建一個無法使用的 sudoers 檔案。

更新 sudoers 檔案的步驟:

開啟終端機

開啟你的伺服器的命令行介面。

使用 visudo 編輯 sudoers 檔案: 輸入以下指令以安全方式編輯 sudoers 檔案:

sudo visudo

新增規則

在編輯器中,新增一條規則,允許 www-data 使用者無需密碼執行特定指令。

www-data ALL=(ALL) NOPASSWD: /usr/bin/rm -rf /path/to/nginx/cache/*

指令的意義是:

www-data:指定的使用者。

ALL=(ALL):這表示 www-data 使用者可以從任何主機以任何使用者身份執行指令。

NOPASSWD:允許 www-data 使用者在執行指定的指令時不需要輸入密碼。

/usr/bin/rm -rf /path/to/nginx/cache/*:指定 www-data 使用者無密碼可以執行的指令。

儲存並退出編輯器

如果你使用的是 nano,按 Ctrl+X 來退出,然後按 Y 鍵儲存更改,最後按 Enter 鍵確認檔案名稱。

測試配置

為了確保設定正確無誤,可以用 www-data 份執行指令:

sudo -u www-data sudo /usr/bin/rm -rf /path/to/nginx/cache/*

如果不需要密碼且指令執行成功,代表 sudoers 檔案配置正確。

安全注意事項:

  • 最小權限原則:只授權必要的最小權限,避免給予 www-data 使用者太廣泛的權限。
  • 明確指令路徑:使用完整的指令路徑(如 /usr/bin/rm),避免安全風險。
  • 定期審計:定期檢查 sudoers 檔案,確保所有條目仍然符合組織的安全政策和操作需要。

Nginx proxy_cache 進階設定,放飛你的 wordpress 主機

定義 proxy cache path

先找到設定檔,通常在

sudo nano /etc/nginx/nginx.conf

找到 http ,在他的配置中設定

http {
    proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

    ...
}


緩存配置

  • 緩存文件儲存的路徑: /path/to/cache
  • 緩存目錄的層級: 1:2
  • 緩存區域的名稱和大小: my_cache:10m
    • 緩存區域名稱: my_cache
    • 緩存區域大小: 10MB
  • 緩存的最大大小: 10GB
  • 在指定的時間內沒有被訪問的緩存文件將被刪除: 60m
  • 直接在緩存路徑上操作,而不是使用臨時路徑: off

詳細說明

  • 緩存文件儲存的路徑

緩存文件將儲存在指定的目錄中。您可以根據您的需求設置此路徑。

  • 緩存目錄的層級

此設置控制緩存目錄的層級結構。例如,設置為 1:2 表示將使用兩個層級的目錄來儲存緩存文件。第一層級將包含 10 個子目錄,第二層級將包含 100 個子目錄。

  • 緩存區域的名稱和大小

此設置控制緩存區域的名稱和大小。緩存區域是緩存文件的分組。您可以根據您的需求設置多個緩存區域。

  • 緩存的最大大小

此設置控制緩存的最大大小。超過此大小時,最舊的緩存文件將被刪除。

  • 在指定的時間內沒有被訪問的緩存文件將被刪除

此設置控制在指定的時間內沒有被訪問的緩存文件將被刪除。

  • 直接在緩存路徑上操作,而不是使用臨時路徑

修改設定檔,配置 proxy cache

找到 config 中的 server ,在裡面添加相關設定

server {
    listen 80;
    server_name yourdomain.com;

    location / {
        proxy_pass http://your_backend_server;
        proxy_cache my_cache;
        proxy_cache_revalidate on;
        proxy_cache_min_uses 1;
        proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
        proxy_cache_lock on;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404 1m;
    }
}

反向代理配置

  • 後端伺服器的地址: proxy_pass
    • 此設置指定後端伺服器的地址。後端伺服器是 Nginx 將請求轉發到的伺服器。
  • 使用之前定義的緩存區域: proxy_cache
    • 此設置指定要使用的緩存區域。緩存區域是 Nginx 用於儲存靜態內容的區域。
  • 啟用後,會在緩存過期時向後端伺服器驗證緩存內容是否仍然有效: proxy_cache_revalidate
    • 此設置控制是否在緩存過期時向後端伺服器驗證緩存內容是否仍然有效。默認情況下,Nginx 將在緩存過期時直接使用緩存內容。
  • 在緩存內容之前,請求必須達到指定的次數: proxy_cache_min_uses
    • 此設置控制在緩存內容之前,請求必須達到指定的次數。這可以防止頻繁更新的內容被緩存。
  • 在後端伺服器錯誤或超時時,使用舊的緩存數據: proxy_cache_use_stale
    • 此設置控制在後端伺服器錯誤或超時時是否使用舊的緩存數據。默認情況下,Nginx 將在後端伺服器錯誤或超時時向客戶端返回錯誤。
  • 在更新緩存內容時,防止多個請求同時向後端伺服器發送: proxy_cache_lock
    • 此設置控制在更新緩存內容時是否防止多個請求同時向後端伺服器發送。這可以防止後端伺服器過載。
  • 設定不同響應狀態碼的緩存時間: proxy_cache_valid
    • 此設置控制不同響應狀態碼的緩存時間。您可以根據您的需求設置不同的緩存時間。

重新開啟 Nginx 讓設定生效

sudo nginx -t
sudo systemctl reload nginx

快取的時間設定

Nginx 支持多種時間單位来指定 cache 的有效期,这包括:

  • s
  • m 分鐘
  • h 小時
  • d
  • w
  • M 月(30 天)
  • y 年(365 天)

舉例子

快取檔案 30 秒

proxy_cache_valid 200 302 30s;

刪除快取的方法

1.直接刪除快取檔案

找到你設定的路徑,直接刪除檔案即可

sudo rm -rf /path/to/cache/*

2.使用 Nginx Cache Purge

如果你在編譯 Nginx 有加入 cache purge ,就可以用下面的設定,如果你是用預設安裝,通常不包含 cache purge,可以看下我之前的安裝教學

location /purge_cache/ {
    proxy_cache_purge my_cache $scheme$host$request_uri;
}
使用 WP-CLI 管理 WordPress

使用 WP-CLI 管理 WordPress

WordPress 是全球最受歡迎的內容管理系統之一,提供了直觀的圖形使用者介面來管理網站。然而,對於開發者系統管理員來說,通過命令列介面管理 WordPress 也是非常必要的。這就是 WP-CLI 發揮作用的地方。WP-CLI 是一個為 WordPress 站點提供的命令列工具,允許用戶快速執行許多任務,如安裝和更新插件、配置多站點安裝、生成內容等,而無需使用 Web 瀏覽器。

WP-CLI 的優勢

  • 效率:通過命令列執行任務通常比使用圖形使用者介面更快。
  • 自動化:可以輕鬆地將命令腳本化和自動化,以便批量處理任務。
  • 無需 GUI:對於僅命令列介面訪問的伺服器,這是管理 WordPress 站點的理想選擇。

安裝 WP-CLI

WP-CLI 的安裝過程簡單直接,可以通過幾個簡單的步驟在任何類 UNIX 系統上安裝(包括 MacOS、Linux 發行版和 Windows 的 WSL)。

下載 WP-CLI: 首先,使用 curlwget 命令下載 WP-CLI 的 Phar 檔案。

使用 curl:

curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar

或者使用 wget:

wget https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar

驗證 Phar 檔案是否可執行: 執行以下命令測試 wp-cli.phar 是否正常工作:

php wp-cli.phar --info

將它變成執行檔: 將下載的檔案轉換為可執行檔案,並移動到全域路徑中,以便從任何位置訪問 WP-CLI。

chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp

驗證及測試WP-CLI: 輸入以下命令以確認 WP-CLI 正確安裝:

wp --info

會看到結果如下

以下示範一些簡單的功能

檢查 WordPress 核心檔案更新

wp core check-update

安裝插件

wp plugin install [plugin-name] --activate

更新單一外掛

wp plugin update [plugin-name]

更新所有插件

wp plugin update --all

創建新的用戶

wp user create bob [email protected] --role=author