Nginx 伺服器在長時間運行後,錯誤日誌與存取日誌檔案會持續增大,若不定期清理,不僅佔用大量磁碟空間,嚴重時甚至會導致 Nginx 服務異常。本文詳細介紹如何在 Linux 系統中透過 Shell 腳本與 Crontab 計劃任務,實現 Nginx 日誌的按天分割與舊日誌自動清理。
Nginx 本身不具備自動分割日誌的功能,常見做法是:每天零點將前一天的日誌重新命名備份(如 access_20240115.log),清空當前日誌檔案供 Nginx 繼續寫入;同時刪除超過保留天數(如 7 天或 30 天)的舊日誌檔案。
建立腳本檔案:
vi /usr/local/nginx/clear_log.sh
寫入以下內容(請根據實際 Nginx 日誌路徑調整):
#!/bin/bash
# 設定日誌路徑與備份目錄
LOG_PATH="/usr/local/nginx/logs"
BACKUP_PATH="/var/log/nginx/backup"
DATE_YESTERDAY=$(date -d "yesterday" +"%Y%m%d")
# 建立備份目錄
mkdir -p ${BACKUP_PATH}/access
mkdir -p ${BACKUP_PATH}/error
# 分割 access.log
cp ${LOG_PATH}/access.log ${BACKUP_PATH}/access/access-${DATE_YESTERDAY}.log
cat /dev/null > ${LOG_PATH}/access.log
# 分割 error.log
cp ${LOG_PATH}/error.log ${BACKUP_PATH}/error/error-${DATE_YESTERDAY}.log
cat /dev/null > ${LOG_PATH}/error.log
關鍵點說明:
cat /dev/null > file 清空檔案,比 echo "" > file 更高效且不留換行符。chmod +x /usr/local/nginx/clear_log.shvi /usr/local/nginx/dellog.sh
#!/bin/bash
# 刪除 7 天前的備份日誌
find /var/log/nginx/backup/access -mtime +7 -type f -name "*.log" -exec rm -f {} \;
find /var/log/nginx/backup/error -mtime +7 -type f -name "*.log" -exec rm -f {} \;
參數說明:
-mtime +7:查找修改時間超過 7 天的檔案。-exec rm -f {} \;:安全刪除找到的檔案,避免參數過長問題。編輯當前使用者的計劃任務:
crontab -e
加入以下兩行(每天零點執行):
0 0 * * * /usr/local/nginx/clear_log.sh
0 0 * * * /usr/local/nginx/dellog.sh
儲存離開後,可用 crontab -l 驗證。
假設今天是 3 月 18 日 00:00:
clear_log.sh 將 3 月 17 日的日誌備份為 access_20240317.log、error_20240317.log,並清空當前 access.log、error.log。dellog.sh 掃描備份目錄,刪除 3 月 11 日以前(含)的舊日誌檔案。logrotate 工具,配置更靈活,支援壓縮、郵件通知等功能。透過上述步驟,即可實現 Nginx 日誌的自動化分割與清理,保障伺服器長期穩定運行。