Nginx 重新加載日志配置


  最近在寫一個nginx日志的切割腳本,切割完后,發現可以不重啟服務,而直接重新加載日志配置文件的命令 [   kill -USR1 $nginx.pid   ],但是不知道 -USR1這個參數是什么意思,最后網上找找別人的經驗,話不多說,客官您往下看看。

 

-------------------------------我是分割線-------------------------------

在沒有執行kill -USR1  $nginx.pid之前,即便已經對文件執行了mv命令而改變了文件名稱,nginx還是會向新命名的文件” xxx.log_ 20130909”照常寫入日志數據的。原因在於:linux系統中,內核是根據文件描述符來找文件的。 

一 、對linux文件描述符的理解 
文件描述符是linux內核為每個打開的文件命名的一個整數標識。 

linux內核為每一個進程生成(或者說維護)一個”文件描述符表”,這個文件描述符表記錄的是“此進程所打開的文件(進行標識)”。 

在這里的環境中,nginx就是一個運行中的進程,這個進程早就打開了一個日志文件,在文件描述符表是記錄了文件的。 

即便日志文件的路徑改變了,但是還是能夠找到(根據文件描述符表可以定位)。

 

二、對kill -USR1  $nginx.pid 解釋

在linux系統中,linux是通過信號與”正在運行的進程”進行通信的。linux系統中,也很多預定義好的信號,像SIGHUP。USR1是用戶自定義信號。可以理解為:進程自己定義接到這個信號該干嘛(也就是進程編寫者自己確定收到這個信號干嘛還是什么都不做都行,完全交給開發人員自己決定)。而在nginx中,它自己編寫了代碼處理當我接到USR1信號的時候,讓nginx重新打開日志文件。具體原理如下: 

1、nginx 的主進程收到USR1信號,會重新打開日志文件(以nginx配置文件中的日志名稱命名,就是配置文件中access_log項所設置的值,如果文件不存在,會自動創建一個新的文件xxx.log)。 

2、然后把日志文件的擁有者改為“工作進程(worker進程)”,目的是讓worker進程就具備了對日志文件的讀寫權限(master和worker通常以不同用戶運行,所以需要改變擁有者)。 

3、nginx主進程會關閉重名的日志文件(也就是剛才使用mv命令重命名成xxx.log_ 20130909.log的文件),並通知工作進程使用新打開的日志文件(剛才主進程打開的文件xxx.log)。具體實現上更細化點就是,主進程把USR1信號發給worker,worker接到這個信號后,會重新打開日志文件(也就是配置文件中約定的xxx.log)

所以-USR1是Nginx的一個信號,那么還有哪些信號呢,這些信號有什么作用呢?總結如下:

主進程可以處理以下的信號:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM