1. 環境說明
本教學適用於以下環境:
- WordPress 以 LAMP 方式直接安裝在 Ubuntu 主機上 (Apache + MySQL + PHP)
- Traefik 以 Docker Compose 容器化方式運行,作為反向代理
- 目標:完整移除 WordPress 及 LAMP,保留 Traefik 繼續服務其他服務
一開始玩Ubuntu的時候沒想太多,原本只是打算換個作業系統來玩看看而已,所以裝個桌面版本,結果越玩越有興趣,開始瞎忙服務如NextCloud及WordPress等,架設網頁伺服器、資料庫啥的,到後期才發現還有Docker這個好東西,所以打算利用放假期間來好好整理一下伺服器。
考量一番之後決定把WordPress關掉改用hugo來利用CloudFlare page架設,畢竟我想要的也就只是簡單部落格功能,其他的都不需要。但請神容易送神難,網路上很多教學都教你怎麼安裝,鮮少人會教怎麼移除。
2. 確認 MySQL 資料庫狀況
先查看主機上有哪些資料庫,確認哪些可以刪除:
sudo mysql -e "SHOW DATABASES;"
系統預設庫(不可刪除):information_schema、mysql、performance_schema、sys
若看到 wordpress 或其他舊服務的資料庫,需先確認這些服務是否真的已經不再使用。
注意:若你有其他服務(例如舊版裸機安裝的 Nextcloud)已改用 Docker 內建資料庫,其在主機 MySQL 上的殘留資料庫可以一併刪除。確認方式為查看該服務的 Docker 容器使用哪種資料庫:
docker ps | grep <服務名稱>若看到
postgresql或mariadb等獨立容器,代表主機上的 MySQL 資料庫是舊殘留,可安全刪除。
3. 移除 MySQL
確認無其他服務使用主機 MySQL 後,執行移除:
sudo systemctl stop mysql
sudo apt purge "mysql-*" -y
sudo apt autoremove -y
sudo rm -rf /etc/mysql /var/lib/mysql /var/log/mysql
sudo deluser mysql 2>/dev/null
sudo delgroup mysql 2>/dev/null
確認已完全移除:
systemctl status mysql
# 應顯示:Unit mysql.service could not be found.
注意:在 zsh 環境下,
mysql-server-core-*這類萬用字元需加引號,或直接使用"mysql-*"一次處理所有套件。
4. 移除 WordPress 檔案
確認 WordPress 所在目錄:
ls /var/www/
刪除對應目錄(路徑依實際情況替換):
sudo rm -rf /var/www/wordpress
sudo rm -rf /var/www/html
5. 移除 Apache
先確認 Apache 目前啟用了哪些虛擬主機,避免誤刪仍在使用的設定:
ls /etc/apache2/sites-enabled/
cat /etc/apache2/sites-enabled/*.conf
確認所有設定都是舊的殘留後,執行移除:
sudo systemctl stop apache2
sudo apt purge apache2 apache2-bin apache2-data apache2-utils libapache2-mod-rpaf python3-certbot-apache -y
sudo apt autoremove -y
sudo rm -rf /etc/apache2
sudo rm -rf /var/lib/apache2
若移除時出現「目錄不是空的,不會刪除」的警告,屬正常保護行為,手動執行
rm -rf清除殘留目錄即可。
6. 移除 PHP
列出目前已安裝的 PHP 套件(確認範圍):
dpkg -l | grep -E "^ii.*(apache|php)" | awk '{print $2}'
批次移除所有 PHP 套件:
sudo apt purge "php*" -y
sudo apt autoremove -y
sudo rm -rf /etc/php
7. 移除 Let’s Encrypt 憑證(Certbot 管理的部分)
若你的 Traefik 是自己管理 ACME 憑證(通常存在 Docker volume 或掛載檔案中),則主機上的 /etc/letsencrypt 是舊版 Certbot 的殘留,可以安全刪除:
先確認 Traefik 的憑證存放位置:
docker inspect traefik 2>/dev/null | grep -i "letsencrypt\|acme\|Binds" | head -20
若看到類似 "acme.storage=/acme.json" 並且掛載路徑指向主機上的某個 json 檔,代表 Traefik 完全獨立管理憑證,執行:
sudo apt purge certbot -y
sudo rm -rf /etc/letsencrypt
8. 清理 Traefik 的 WordPress 路由設定
找到 Traefik 動態設定目錄:
find /path/to/traefik -name "*.yml" -o -name "*.yaml" 2>/dev/null
查看 WordPress 設定檔內容確認只有 WordPress 相關設定:
cat /path/to/traefik/configurations/wordpress.yml
確認後直接刪除:
rm /path/to/traefik/configurations/wordpress.yml
Traefik 會自動偵測檔案變更,不需重啟。確認 log 無異常:
docker logs traefik --tail 20
9. 清理防火牆規則
查看目前 UFW 規則:
sudo ufw status numbered
找到 WordPress 使用的 Apache port(例如 480)對應的規則編號,刪除:
sudo ufw delete <規則編號>
注意:若同時有 IPv4 和 IPv6 兩條規則,都要刪除。刪除時先刪編號大的,避免編號重排造成誤刪。
若有不再使用的其他 port(例如 FTP 的 20/21),也建議一併刪除以減少攻擊面。
10. 清理 Cloudflare DNS 記錄
在 Cloudflare 儀表板中,找到 WordPress 網域對應的 A 記錄(例如 xixinote.example.com),直接刪除。
11. 取消 Jetpack Monitor 通知
若 WordPress 有安裝 Jetpack 並啟用網站監控,下線後會持續收到停機警報信。
處理方式:
- 前往 wordpress.com 登入帳號
- 進入 Jetpack → Monitor
- 找到對應網站,關閉 Monitor 功能或將網站從 Jetpack 移除
12. 清理完成確認
執行以下指令確認各項目已移除:
# Apache 已移除
systemctl status apache2
# PHP 已移除
php --version
# MySQL 已移除
systemctl status mysql
# WordPress 目錄已清空
ls /var/www/
以上指令皆應回傳「找不到」或空白結果,代表 WordPress 及 LAMP 完整清除完成。
13. 最終狀態總覽
| 項目 | 處理結果 |
|---|---|
| WordPress 資料庫 | 已移除 |
| 舊服務殘留資料庫 | 已移除 |
| WordPress 檔案 | 已移除 |
| MySQL | 已移除 |
| Apache | 已移除 |
| PHP (全版本) | 已移除 |
| Certbot + /etc/letsencrypt | 已移除 |
| Traefik WordPress 路由設定 | 已移除 |
| UFW WordPress 相關規則 | 已移除 |
| Cloudflare DNS 記錄 | 已移除 |
| Jetpack Monitor 通知 | 已關閉 |
| Traefik 本體 | 保留,正常運作 |
| 其他 Docker 服務 | 保留,不受影響 |
