天天看點

Nginx日志切割

Nginx是我們生産環境的主要入口,所有的請求都會在這裡留下痕迹,是以會導緻一個問題,它的日志檔案會一天比一天的大。直到有一天你無法接受這個龐大的檔案的時候,就你就會想到了切割檔案的這個辦法。

能想到切割日志的童鞋那肯定是對Nginx用的熟悉的不能再熟悉的了,是以這裡我就不過多的闡述Nginx的應用了,隻說一個點  -USR1選項的用法

在沒有執行kill -USR1 `cat ${pid_path}`之前,即便已經對檔案執行了mv指令而改變了檔案名稱,

nginx還是會向新命名的檔案” xxx.log_ 20130909”照常寫入日志資料的。

原因在于:linux系統中,核心是根據檔案描述符來找檔案的

1、說說對linux檔案描述符的了解

檔案描述符是linux核心為每個打開的檔案命名的一個整數辨別。 

linux核心為每一個程序生成(或者說維護)一個”檔案描述符表”,這個檔案描述符表記錄的是“此程序所打開的檔案(進行辨別)”。 

在這裡的環境中,nginx就是一個運作中的程序,這個程序早就打開了一個日志檔案,在檔案描述符表是記錄了檔案的。 

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

2、說說腳本中kill -USR $(cat /var/run/nginx.pid)文法的了解

當執行指令“kill -USR1 `cat ${pid_path}`”的時候,nginx.pid檔案中儲存的其實就是一個數字(自己可以打開看一下,我這裡是894),

nginx 将其主程序的 pid (程序号)寫入到了nginx.pid 檔案中,是以可以通過cat指令直接拿到其主程序号,直接操作指定的程序号。 

kill -USR $(cat /var/run/nginx.pid)就等同于 

kill –USR1 894  #指定發信号(USR1)信号給這個程序編号。 

3、說說腳本中kill -USR1 `cat ${pid_path}文法的了解

 在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)

1

2

3

4

5

6

7

8

9

<code>#!/bin/bash</code>

<code>#零點執行該腳本</code>

<code>#NGinx 日志檔案所在目錄</code>

<code>LOGS_PATH=</code><code>/Disk/log/nginx</code>

<code>#擷取昨天時間YYYY-MM-DD</code>

<code>YESTERDAY=$(</code><code>date</code> <code>-d </code><code>"yesterday"</code> <code>+%Y-%m-%d)</code>

<code>#移動檔案</code>

<code>mv</code> <code>${LOGS_PATH}</code><code>/access</code><code>.log ${LOGS_PATH}</code><code>/access_</code><code>${YESTERDAY}.log</code>

<code>kill</code> <code>-USR1 $(</code><code>cat</code> <code>/var/run/nginx</code><code>.pid)</code>

<code></code>

本文轉自 xinsir999 51CTO部落格,原文連結:http://blog.51cto.com/xinsir/1915682,如需轉載請自行聯系原作者