WordPress 404 攻擊 – 文章超過 4 萬篇,頻繁刪除舊文為什麼會讓 CPU 一直偏高?

WordPress 404 攻擊 – 如果網站平常經常刪除舊文章,可能會出現一個容易被忽略的問題,那就是 404 攻擊。原本可以直接由快取回應的文章,因為快取失效或找不到對應內容,最後重新交由 index.php 處理。當這種情況大量發生時,PHP、PHP-FPM、資料庫甚至整台伺服器的 CPU 使用率都可能長時間維持在較高狀況。

一、WordPress 404 攻擊是怎麼產生的?

一般訪客開啟 WordPress 文章時,理想的流程是:

訪客 → Web Server → 快取 → 直接回傳頁面

如果快取中已經存在完整的 HTML,Web Server 可以直接把內容送給訪客,不需要再次啟動 WordPress。

這種情況下 CPU 使用量通常非常低。

但是當快取找不到對應文章時,流程就可能變成:

訪客 → Web Server → 找不到快取 → index.php → WordPress → 資料庫 → 查詢文章 → 產生頁面 → 回傳

這時候就不再只是單純傳送一個已經產生好的 HTML,而是需要重新執行 WordPress。

二、為什麼刪除舊文章可能讓問題更加明顯?

假設網站原本有 40,000 篇文章。

隨著時間過去,網站可能會刪除其中一部分舊文章,例如:

  • 刪除過期內容
  • 刪除失效下載
  • 刪除重複文章
  • 整理分類與標籤
  • 大量清理歷史文章

文章刪除本身不一定會直接造成 CPU 長時間升高。

真正需要注意的是:

刪除文章之後,如果沒有妥善處理,就可能形成大量「快取未命中」的請求。也就是 404 回應。

三、快取找不到文章時,為什麼會跑到 index.php?

WordPress 本身是一個 PHP 動態網站。

當 Web Server 沒有辦法直接提供現成的快取檔案時,請求通常會進入 WordPress 的 PHP 處理流程。

簡化來說:

訪客請求文章
       ↓
檢查快取
       ↓
   找到快取?
    ↙       ↘
  是         否
  ↓                ↓
直接回傳    index.php
                      ↓
         啟動 WordPress
                     ↓
         查詢資料庫
                    ↓
         判斷文章狀態
                    ↓
         產生網頁內容
                   ↓
         回傳給訪客

因此,真正需要注意的不是「index.php 本身很慢」,而是:

為什麼這麼多請求沒有在前面的快取層被直接處理掉?

應該如何改善?

方法一:提高頁面快取命中率

首先應該確認網站的 Page Cache 是否正常,且要能設定 404 快取才有用

也許可以使用:

  • Cloudflare ? 。但我用 AI 建議設定未成功。
  • 其它快取服務可用 404 快取才有用。

方法二:不要讓所有 404 都進 WordPress

如果 Web Server 可以直接判斷某些不存在的檔案或 URL,就可以避免不必要地進入 WordPress。

理想情況:

請求不存在的資源
       ↓
Web Server 直接判斷
       ↓
直接回傳 404

而不是:

請求不存在的資源
       ↓
index.php
       ↓
WordPress
       ↓
資料庫
       ↓
404

後者會浪費 PHP 與資料庫資源。

我這邊是使用正面表列黑名單處理。在 site 的 config 增加

RewriteMap blocklist "txt:/etc/apache2/block.list.txt"
#block.list.txt 黑名單表列 第一行為文章 ID 。第二行都是 1
94985   1
95290   1
95727   1
95969   1
96427   1
96509   1

設定黑名單後 CPU 可明顯下降

GA4 圖示

高點當時全都一堆機器人。且一堆 404 。造成長時間 CPU 100%

WordPress 404 攻擊

延伸閱讀

blog.ocam.live
blog.ocam.live

關注科技新聞、SEO、人工智慧、電玩模擬器、程式設言、與 IT 日常等議題,深入簡出文章的說明並持續追蹤相關新聞的發展與報導。