Nginx每天莫名自動重啟問題

風輕雲淡不發表於2018-12-14

最近在做基於openresty的waf,在測試openresty的過程中用openresty替代了原nginx,結果第二天又自動切換回了原nginx,通過ps -ef 看到nginx在凌晨3點多自動重啟。連續幾天在多個機器上都發現同樣的情況。

剛開始我以為是以前的運維在crontab裡配置裡什麼自動重啟nginx的定時任務,然而crontab -l 並沒有發現什麼任務,同時我還發現nginx的日誌是有做切割的,nginx log日誌每天會自動切割壓縮儲存三天。這一發現讓我更納悶了,然後就在機器裡篩選各種指令碼都沒有發現有做日誌切割的,但是像這種動作明顯還是通過類似定時任務做出來的。難道是之前運維在其他機器上有做遠端執行指令碼?心裡還想真如果是這樣,那這坑還真挖的深。經過一番查詢然而還是沒有。。。

左思右想,,,還是覺得nginx的莫名重啟和日誌分割是分不開的,在網上查詢nginx日誌分割發現都是通過指令碼做的分割,但是之前伺服器裡並沒有這樣的指令碼。我就覺得很有可能和nginx本身有關係了,然後就換了辦法搜尋,“nginx log 預設壓縮日誌”, 好吧,還真找到了。還是定時任務的原因。

因為Nginx在安裝時加入了一個logrotate任務: /etc/logrotate.d/nginx

/var/log/nginx/*.log { 
        daily 
        missingok 
        rotate 52 
        compress 
        delaycompress 
        notifempty 
        create 640 nginx adm 
        sharedscripts 
        postrotate 
                [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid` 
        endscript 
} 

Linux日誌管理服務logrotate會定時讀取該檔案,根據設定按日誌大小或天數刪除/歸檔舊日誌,建立新日誌.

配置說明:
daily: 日誌檔案每天進行滾動
missingok: 如果找不到這個log檔案,就忽略過去
rotate: 保留最進52次滾動的日誌
compress: 通過gzip壓縮轉儲以後的日誌
delaycompress: 和compress一起使用時,轉儲的日誌檔案到下一次轉儲時才壓縮
notifempty 如果是空檔案的話,不轉儲
create mode owner group:轉儲檔案,使用指定的檔案模式建立新的日誌檔案
sharedscripts: 執行postrotate指令碼(該指令碼作用為讓nginx重新生成日誌檔案)
postrotate/endscript: 在轉儲以後需要執行的命令可以放入這個對,這兩個關鍵字必須單獨成行

logrotate預設被加入到cron的/etc/cron.daily中作為每日任務執行,配置定義在:
/etc/cron.daily/logrotate

#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

檢視logrotate最近進行了哪些日誌歸檔。


相關文章