Nginx實戰(三) 日誌配置與切割

樑桂釗發表於2016-10-18

Nginx實戰系列目錄

訪問日誌主要記錄客戶端訪問Nginx的每一個請求,格式可以自定義。通過訪問日誌,你可以得到使用者地域來源、跳轉來源、使用終端、某個URL訪問量等相關資訊。

Nginx中訪問日誌相關指令主要有兩條,一條是log_format,用來設定日誌的格式,另外一條是access_log,用來指定日誌文職的存放路徑、格式和快取大小。兩條指令在Nginx配置檔案中的位置可以在http之間。

日誌配置

log_format

log_format用來設定日誌格式,格式如下所示

log_format name(名稱) format(格式)

在Nginx中有自己預設的日誌格式,如下內容:

#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
#                  '$status $body_bytes_sent "$http_referer" '
#                  '"$http_user_agent" "$http_x_forwarded_for"';

這段內容什麼意思呢?我們來理解下。

  • $remote_addr:客戶端的ip地址(如果中間有代理伺服器那麼這裡顯示的ip就為代理伺服器的ip地址)
  • $remote_user:用於記錄遠端客戶端的使用者名稱稱(一般為“-”)
  • $time_local:用於記錄訪問時間和時區
  • $request:用於記錄請求的url以及請求方法
  • $status:響應狀態碼
  • $body_bytes_sent:給客戶端傳送的檔案主體內容大小
  • $http_referer:可以記錄使用者是從哪個連結訪問過來的
  • $http_user_agent:使用者所使用的代理(一般為瀏覽器)
  • $http_x_forwarded_for:可以記錄客戶端IP,通過代理伺服器來記錄客戶端的ip地址

現在,我們新增一個我們自定義日誌資訊。例如,如果我們用Nginx作為反向代理服務,就不能獲取客戶端的真實IP地址IP了,因為經過反向代理後,在客戶端和Web伺服器之間增加了中間層,因此Web伺服器無法直接拿到客戶端的IP。

log_format mylog '$remote_addr [$time_local] "$request" $status';

日誌格式允許包含的變數註釋,如下所示

$remote_addr, $http_x_forwarded_for 記錄客戶端IP地址
$remote_user 記錄客戶端使用者名稱稱
$request 記錄請求的URL和HTTP協議
$status 記錄請求狀態
$body_bytes_sent 傳送給客戶端的位元組數,不包括響應頭的大小; 該變數與Apache模組mod_log_config裡的“%B”引數相容。
$bytes_sent 傳送給客戶端的總位元組數。
$connection 連線的序列號。
$connection_requests 當前通過一個連線獲得的請求數量。
$msec 日誌寫入時間。單位為秒,精度是毫秒。
$pipe 如果請求是通過HTTP流水線(pipelined)傳送,pipe值為“p”,否則為“.”。
$http_referer 記錄從哪個頁面連結訪問過來的
$http_user_agent 記錄客戶端瀏覽器相關資訊
$request_length 請求的長度(包括請求行,請求頭和請求正文)。
$request_time 請求處理時間,單位為秒,精度毫秒; 從讀入客戶端的第一個位元組開始,直到把最後一個字元傳送給客戶端後進行日誌寫入為止。
$time_iso8601 ISO8601標準格式下的本地時間。
$time_local 通用日誌格式下的本地時間。

access_log

用log_format指令設定了日誌格式之後,需要用access_log指令指定日誌檔案存放路徑。

格式如下所示

access_log path(存放路徑) [format(自定義日誌格式名稱) [buffer=size | off]]

在Nginx中有自己預設的日誌路徑,如下內容:

#access_log  logs/access.log  main;

如果想關閉日誌,可以如下:

access_log off;

值得注意的是,Nginx程式設定的使用者和組必須對日誌路徑有建立檔案的許可權,否則,會報錯。

此外,對於每一條日誌記錄,都將是先開啟檔案,再寫入日誌,然後關閉。可以使用open_log_file_cache來設定日誌檔案快取(預設是off)。

日誌切割

當網站訪問量大後,日誌資料就會很多,如果全部寫到一個日誌檔案中去,檔案會變得越來越大。檔案大速度就會慢下來,比如一個檔案幾百兆。寫入日誌的時候,會影響操作速度。另外,如果我想看看訪問日誌,一個幾百兆的檔案,下載下來開啟也很慢。

為了方便對日誌進行分析計算,需要對日誌進行定時切割。定時切割的方式有按照月切割、按天切割,按小時切割等。最常用的是按天切割。

配置shell指令碼

#!/bin/bash
# 設定日誌檔案存放目錄
logs_path="/var/logs/nginx/"
# 設定pid檔案
pid_path="/usr/local/dev/nginx/nginx.pid"
# 重新命名日誌檔案
mv ${logs_path}access.log ${logs_path}access_$(date -d "yesterday" +"%Y%m%d").log
# 向nginx主程式發訊號重新開啟日誌
kill -USR1 `cat ${pid_path}`

crontab中設定定時作業

進行編輯

crontab -e

配置內容如下

0 0 * * * bash /usr/local/dev/nginx/nginx_log.sh

這樣在每天的夜晚12點就會自動建立備份檔案了。.

相關文章