自行架設雲端主機(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(或者是 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)都支援在管理後台「線上無縫升級磁碟容量」:
- 後台擴容:在主機商控制台將磁碟從 40GB 調整為 80GB。
- 在線調整分割區大小(免重開機):
# 安裝 growpart 工具 sudo apt-get install cloud-guest-utils -y # 擴展第一個分割區(例如 /dev/vda 上的第 1 分割區) sudo growpart /dev/vda 1 - 擴展檔案系統(Filesystem Resize):
# 如果檔案系統為 ext4: sudo resize2fs /dev/vda1 # 如果檔案系統為 xfs: sudo xfs_growfs / - 再次輸入
df -h,就能看到硬碟容量立即從 40GB 擴充至 80GB,且所有運行的服務完全無需中斷!
結語:防患於未然的伺服器運維思維
伺服器維護最忌諱「平時不聞不問,直到當機才救火」。
建議大家花 10 分鐘檢查伺服器的 logrotate 配置,並在伺服器上設定簡單的每日 Cron 任務:當 df -h 的根目錄使用率超過 80% 時,自動發送 Telegram 或 Email 通知給管理員。掌握系統的即時脈搏,才能讓你的網站永遠在穩定可靠的高速軌道上平穩前行。
以實際行動支持獨立觀點,與我們一同走得更遠
每一篇條理清晰的分析、每一次不隨波逐流的觀察,背後都是對真實與品質的堅持。我們拒絕內容農場與演算法流量綁架,堅持自由獨立的客觀發聲。
維持高品質的原創寫作與獨立營運,需要持續的實質力量。您可以選擇一次性贊助或每月定期支持,透過 Google 安全結帳,與我們一同守護這份深刻與清醒。
由 Google 安全處理付款 · 可隨時於 Google 帳戶管理或取消



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