自行架設雲端主機(VPS)或專用伺服器運維也有了一段時間。剛開台時訂製的硬碟空間看似充裕,但在沒有特別注意定期維護的情況下,某天登入系統執行指令時,赫然發現根目錄的磁碟使用率竟然一路攀高到了 91%,只剩下不到 9% 的殘餘空間!

在 Linux 伺服器環境中,磁碟空間耗盡(Disk Full)是引發災難性崩潰的頭號殺手之一。一旦硬碟剩餘空間歸零,MySQL / MariaDB 資料庫將無法寫入暫存表格而直接崩潰死鎖,Web 伺服器無法寫入 Session 導致訪客全數登出,甚至 SSH 服務都會因為無法生成認證暫存檔而將管理者拒之門外。

當發現磁碟拉警報時,該如何迅速找出吞噬空間的元兇?又該如何安全釋放空間並治本預防?本文將為大家整理一套標準的排查與清理 SOP。


一、第一步:全盤診斷,精準揪出空間殺手

不要盲目隨意刪除檔案!我們先透過終端機指令由大到小精確定位問題所在。

1. 檢視各掛載分區使用率(df 指令)

首先輸入以下指令,以人類可讀(Human-readable)的形式查看所有磁碟分區:

df -h

輸出範例通常如下:

Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        40G   36G  1.8G  95% /
udev            2.0G     0  2.0G   0% /dev
tmpfs           400M  1.2M  399M   1% /run

如果發現掛載在根目錄 / 的使用率已經超過 90%,就代表我們必須深入根目錄排查。

2. 逐層追查最大佔用目錄(du 指令)

輸入以下指令,列出根目錄下體積最大的前 10 個目錄:

sudo du -sh /* 2>/dev/null | sort -hr | head -n 10

根據站長多年維運經驗,在多數 Web 伺服器中,除了存放使用者上傳圖片的 wp-content/uploads 之外,最常見的空間殺手幾乎無一例外落在 /var/log(系統與網頁日誌)!

最佔用磁碟空間的單一資料夾:var/log/apache2/domains

如上圖所示,當我們深入排查時,往往會發現最佔用磁碟空間的單一目錄正是: var/log/apache2/domains(或者是 Nginx 站點的 access.log)。

長期運行的網站每天會迎來數以萬計的正常訪客與網路爬蟲,如果沒有設定自動截斷,單一網域的訪問日誌動輒可以累積到 10GB 甚至 20GB 以上,不知不覺將硬碟塞爆。


二、第二步:安全清理!切勿直接執行 rm 刪除使用中的日誌

找到龐大的日誌檔後,很多新手的直覺反應是直接敲指令:rm -f access.log。

嚴正警告: 千萬不要對正在被 Apache 或 Nginx 寫入的日誌檔案直接執行 rm 指令! 在 Linux 系統中,如果一個檔案仍被運行的進程(Process)開啟著,即使你在檔案系統中刪除了該檔名,該檔案的 Inode 與磁碟區塊仍然會被該進程牢牢鎖定。結果就是:檔案看似消失了,但磁碟空間根本不會釋放! 更糟的是,Web 伺服器可能會因為失去日誌控制代碼而發生異常。

正確做法:以「截斷(Truncate)」方式安全清空日誌

使用重定向符號將檔案大小歸零,進程無需重啟即可立即釋放磁碟空間:

# 方法一:利用重定向清空特定日誌
sudo sh -c '> /var/log/apache2/domains/yourdomain.com.error.log'
sudo sh -c '> /var/log/apache2/domains/yourdomain.com.log'

# 方法二:清空系統標準日誌
sudo truncate -s 0 /var/log/apache2/access.log
sudo truncate -s 0 /var/log/syslog

三、第三步:清理套件快取與舊核心

除了網站日誌,Linux 系統長時間運行後,套件管理器與系統暫存也會沉積大量無用垃圾:

1. 清理 APT 套件快取(Ubuntu / Debian)

每次執行 apt update 與 apt upgrade 後,下載的 .deb 安裝包都會被快取在硬碟中:

# 清除已下載但不再需要的舊版本套件快取
sudo apt-get clean

# 自動移除過去作為依賴安裝但現在已不再使用的孤兒套件
sudo apt-get autoremove --purge -y

2. 清理 YUM 套件快取(CentOS / RHEL)

sudo yum clean all
sudo rm -rf /var/cache/yum

3. 清理暫存目錄 /tmp

檢查 /tmp 與 /var/tmp 是否有長時間遺留的大型壓縮檔或測試檔案:

sudo rm -rf /tmp/*

四、第四步:治本防範!配置 Logrotate 日誌自動輪替

把日誌清空只是治標,如果不及時處理,幾週後硬碟又會再度爆滿。徹底解決問題的關鍵在於建立良好的「日誌輪替(Logrotate)」機制。

Linux 系統內建了 logrotate 工具。請檢查 /etc/logrotate.d/apache2 設定檔:

sudo nano /etc/logrotate.d/apache2

確保設定中包含以下關鍵參數,要求系統按週(或按日)輪替、壓縮封存,並自動刪除超過期限的舊紀錄:

/var/log/apache2/*.log /var/log/apache2/domains/*.log {
    daily               # 每天輪替一次
    missingok           # 若日誌不存在也忽略
    rotate 7            # 最多僅保留 7 天的歷史日誌
    compress            # 舊日誌自動使用 gzip 壓縮(體積縮小 90%)
    delaycompress       # 延遲到下一次輪替才壓縮前一天的日誌
    notifempty          # 日誌為空則不輪替
    create 640 root adm
    sharedscripts
    postrotate
        /etc/init.d/apache2 reload > /dev/null
    endscript
}

儲存後,可執行以下指令強制測試輪替運作是否正常:

sudo logrotate -f /etc/logrotate.d/apache2

五、第五步:若為真實業務增長,如何在線擴充硬碟?

如果排查後發現磁碟佔用全都是真實的使用者圖片、影音上傳或龐大的業務資料庫,而不是暫存垃圾,那就意味著你的網站流量與規模已經成長,該為 VPS 擴充硬碟了。

現代主流雲端服務商(如 Linode、DigitalOcean、AWS EBS、GCP、Bluehost VPS)都支援在管理後台「線上無縫升級磁碟容量」:

  1. 後台擴容:在主機商控制台將磁碟從 40GB 調整為 80GB。
  2. 在線調整分割區大小(免重開機):
    # 安裝 growpart 工具
    sudo apt-get install cloud-guest-utils -y
    
    # 擴展第一個分割區(例如 /dev/vda 上的第 1 分割區)
    sudo growpart /dev/vda 1
  3. 擴展檔案系統(Filesystem Resize):
    # 如果檔案系統為 ext4:
    sudo resize2fs /dev/vda1
    
    # 如果檔案系統為 xfs:
    sudo xfs_growfs /
  4. 再次輸入 df -h,就能看到硬碟容量立即從 40GB 擴充至 80GB,且所有運行的服務完全無需中斷!

結語:防患於未然的伺服器運維思維

伺服器維護最忌諱「平時不聞不問,直到當機才救火」。

建議大家花 10 分鐘檢查伺服器的 logrotate 配置,並在伺服器上設定簡單的每日 Cron 任務:當 df -h 的根目錄使用率超過 80% 時,自動發送 Telegram 或 Email 通知給管理員。掌握系統的即時脈搏,才能讓你的網站永遠在穩定可靠的高速軌道上平穩前行。

✦ 獨立報導 · 讀者支持 ✦

以實際行動支持獨立觀點,與我們一同走得更遠

每一篇條理清晰的分析、每一次不隨波逐流的觀察,背後都是對真實與品質的堅持。我們拒絕內容農場與演算法流量綁架,堅持自由獨立的客觀發聲。

維持高品質的原創寫作與獨立營運,需要持續的實質力量。您可以選擇一次性贊助或每月定期支持,透過 Google 安全結帳,與我們一同守護這份深刻與清醒。

由 Google 安全處理付款 · 可隨時於 Google 帳戶管理或取消

為節省資源,留言將於捲動至此處或點擊按鈕後載入。