磁盘空間被寫满,往往不是一瞬間發生的。多數时候是日誌、缓存、临时文件、备份包一類的東西慢慢堆积,直到某個时刻應用寫不進日誌、資料库無法寫入、上传失敗,網站開始报错。蜘蛛来抓取时遇到 5xx 或连接中断,抓取记錄也會變得难看。定期做一次日誌與磁盘空間自查,比等故障發生再處理要轻松得多。
日誌為什么會悄悄吃掉磁盘
訪問日誌、错誤日誌、應用調试日誌、資料库慢查询日誌,各自增長速度不同。訪問量大的站点,單個訪問日誌每天增長几百 MB 並不少见。如果只按天切割却不刪除、不压缩,几個月後就能占满小磁盘。
還有几種容易被忽略的情况:
- 調试日誌忘了關,框架把每個請求的详细上下文都寫進文件。
- 错誤日誌被反复刷新,某個循环报错在短時間内产生大量重复记錄。
- 日誌切割後舊文件没有压缩,保留數量设得過大。
- 临时目錄被上传、導出、缓存文件占用,和日誌一起挤压剩余空間。
先看几個信号
- 網站偶發 500,刷新後恢复,過一會儿又出現。
- 資料库提示“磁盘已满”或進入只讀模式。
- SSH 登入後提示無法寫入,命令补全失效。
- 日誌文件最後修改時間停在某個時間点,之後没有新内容。
- 监控里磁盘使用率持續上升,没有回落。
出現這些信号时,先確認磁盘和 inode 的使用情况,再决定是清理還是扩容。
检查磁盘與 inode
登入服務器後,用几個基础命令快速定位:
- df -h:查看各分区剩余空間,關注 / 和 /var 這類常用分区。
- df -i:查看 inode 使用率。即使空間還有,inode 耗尽也會導致無法建立新文件。
- du -sh /var/log/*:查看日誌目錄下各文件或子目錄大小。
- du -sh /tmp /var/tmp:检查临时目錄占用。
- find / -xdev -size +500M -type f:找出大文件,可按需調整路径和大小阈值。
如果 du 統計的總和與 df 顯示的已用空間差距很大,可能有文件已被刪除但進程仍持有句柄,或者存在挂载点被覆盖的情况。可以用 lsof 查看被刪除但仍占用的文件。
日誌轮轉的基本做法
Linux 上常见的是 logrotate。它按時間或大小切割日誌,並可選擇压缩和保留份數。大多數發行版已经為系統日誌配好了規則,但自己部署的應用、Nginx、PHP、資料库等需要單獨確認。
配置时重点看這几項
- rotate:保留多少個歷史文件。訪問日誌保留 7 到 30 天較常见,按分析需求决定。
- daily / weekly / size:触發切割的條件。寫量大的日誌可以用 size 辅助。
- compress 與 delaycompress:是否压缩舊日誌。压缩能省不少空間。
- copytruncate 或 create:前者适合不支持重開日誌文件的應用,但极端情况下可能丢少量日誌;後者需要應用配合重载。
- postrotate:切割後通知服務重新打開日誌文件,避免繼續寫舊句柄。
應用自己管日誌时
有些應用框架内置日誌滚動,比如按天寫文件、按大小切割。要確認它是否同时限制文件數量和總大小。只按天切割但不清理,長期看仍然會涨。可以設定保留天數,或把日誌輸出到标准輸出交给容器和日誌采集系統處理。
保留周期與归档
不是所有日誌都必须長期留在服務器上。可按用途分层:
- 最近 7 天的原始日誌留在本地,便于排查最近問题。
- 更早的日誌压缩後归档到對象存储或另一块磁盘。
- 需要長期分析的訪問日誌,先確認合規和隐私要求,再决定保留范围。
- 調试日誌、临时導出文件设定明确的生命周期,用完就清。
归档之後,服務器上只保留必要窗口,磁盘压力會小很多。
清理时的注意事項
- 不要直接刪除正在寫入的日誌文件。進程可能仍持有句柄,空間不會立即释放。可以用 truncate 清空,或先停服務、切割、再刪除。
- 刪除前確認文件用途,避免誤删資料库文件、證书、备份或业務上传目錄。
- 如果訪問日誌還要用于分析蜘蛛抓取和流量来源,不要因為清理磁盘全部删掉。
- 清理後再次執行 df -h,確認空間确實释放。
把磁盘监控加進日常
- 設定磁盘使用率告警,比如超過 80% 提醒,超過 90% 升級處理。
- 同时监控 inode 使用率,避免只看空間不看文件數。
- 對日誌增長速度做趋势记錄,提前判断扩容時間。
- 把日誌轮轉配置纳入服務器初始化清單,新机器上线时就配好。
磁盘空間和日誌轮轉是容易被忽略的基础項。它們平时不出声,一旦出問题却可能让整站短時間不可用。把它放進每月自查,比事後救火省事。
建议在业務低峰期做一次完整检查:看目前占用、確認轮轉規則、清理無用文件、設定告警。做完後记錄一份現状,下次對照變化即可。