Nginx 日誌配置,超詳細解讀

前言

Nginx 日誌對於統計、系統服務排錯很有用。

Nginx 日誌主要分爲兩種: access_log(訪問日誌) 和error_log(錯誤日誌)。通過訪問日誌我們可以得到用戶的 IP 地址、瀏覽器的信息,請求的處理時間等信息。錯誤日誌記錄了訪問出錯的信息,可以幫助我們定位錯誤的原因。

本文將詳細描述一下如何配置 Nginx 日誌。

設置 access_log

訪問日誌主要記錄客戶端的請求。客戶端向 Nginx 服務器發起的每一次請求都記錄在這裏。客戶端 IP,瀏覽器信息,referer,請求處理時間,請求 URL 等都可以在訪問日誌中得到。當然具體要記錄哪些信息,你可以通過 log_format 指令定義。

語法

access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; # 設置訪問日誌  
access_log off; # 關閉訪問日誌
  • path 指定日誌的存放位置。

  • format 指定日誌的格式。默認使用預定義的 combined。

  • buffer 用來指定日誌寫入時的緩存大小。默認是 64k。

  • gzip 日誌寫入前先進行壓縮。壓縮率可以指定,從 1 到 9 數值越大壓縮比越高,同時壓縮的速度也越慢。默認是 1。

  • flush 設置緩存的有效時間。如果超過 flush 指定的時間,緩存中的內容將被清空。

  • if 條件判斷。如果指定的條件計算爲 0 或空字符串,那麼該請求不會寫入日誌。

另外,還有一個特殊的值 off。如果指定了該值,當前作用域下的所有的請求日誌都被關閉。

作用域

可以應用access_log指令的作用域分別有 http,server,location,limit_except。也就是說,在這幾個作用域外使用該指令,Nginx 會報錯。

以上是 access_log 指令的基本語法和參數的含義。下面我們看一幾個例子加深一下理解。

基本用法

access_log /var/logs/nginx-access.log

該例子指定日誌的寫入路徑爲 / var/logs/nginx-access.log,日誌格式使用默認的 combined。

access_log /var/logs/nginx-access.log buffer=32k gzip flush=1m

該例子指定日誌的寫入路徑爲/var/logs/nginx-access.log,日誌格式使用默認的 combined,指定日誌的緩存大小爲 32k,日誌寫入前啓用 gzip 進行壓縮,壓縮比使用默認值 1,緩存數據有效時間爲 1 分鐘。

使用 log_format 自定義日誌格式

Nginx 預定義了名爲 combined 日誌格式,如果沒有明確指定日誌格式默認使用該格式:

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

如果不想使用 Nginx 預定義的格式,可以通過 log_format 指令來自定義。

語法

log_format name [escape=default|json] string ...;
  • name 格式名稱。在 access_log 指令中引用。

  • escape 設置變量中的字符編碼方式是 json 還是 default,默認是 default。

  • string 要定義的日誌格式內容。該參數可以有多個。參數中可以使用 Nginx 變量。

下面是 log_format 指令中常用的一些變量:

圖片

下面演示一下自定義日誌格式的使用:

access_log /var/logs/nginx-access.log main  
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '  
                  '$status $body_bytes_sent "$http_referer" '  
                  '"$http_user_agent" "$http_x_forwarded_for"';

我們使用 log_format 指令定義了一個 main 的格式,並在 access_log 指令中引用了它。假如客戶端有發起請求:https://suyunfe.com/,我們看一下我截取的一個請求的日誌記錄:

112.195.209.90 - - [20/Feb/2018:12:12:14 +0800]   
"GET / HTTP/1.1" 200 190 "-" "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N)   
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36" "-"

我們看到最終的日誌記錄中$remote_user$http_referer$http_x_forwarded_for都對應了一個-,這是因爲這幾個變量爲空。

設置 error_log

錯誤日誌在 Nginx 中是通過 error_log 指令實現的。該指令記錄服務器和請求處理過程中的錯誤信息。

語法

配置錯誤日誌文件的路徑和日誌級別。

error_log file [level];  
Default:      
error_log logs/error.log error;

第一個參數指定日誌的寫入位置。

第二個參數指定日誌的級別。level 可以是 debug, info, notice, warn, error, crit, alert,emerg 中的任意值。可以看到其取值範圍是按緊急程度從低到高排列的。只有日誌的錯誤級別等於或高於 level 指定的值纔會寫入錯誤日誌中。默認值是 error。

基本用法

error_log /var/logs/nginx/nginx-error.log

它可以配置在:main, http, mail, stream, server, location 作用域。

例子中指定了錯誤日誌的路徑爲:/var/logs/nginx/nginx-error.log,日誌級別使用默認的 error。

open_log_file_cache

每一條日誌記錄的寫入都是先打開文件再寫入記錄,然後關閉日誌文件。如果你的日誌文件路徑中使用了變量,如access_log /var/logs/$host/nginx-access.log,爲提高性能,可以使用open_log_file_cache指令設置日誌文件描述符的緩存。

語法

open_log_file_cache max=[inactive=time] [min_uses=N] [valid=time];
  • max 設置緩存中最多容納的文件描述符數量,如果被佔滿,採用 LRU 算法將描述符關閉。

  • inactive 設置緩存存活時間,默認是 10s。

  • min_uses 在 inactive 時間段內,日誌文件最少使用幾次,該日誌文件描述符記入緩存,默認是 1 次。

  • valid:設置多久對日誌文件名進行檢查,看是否發生變化,默認是 60s。

  • off:不使用緩存。默認爲 off。

基本用法

open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;

它可以配置在 http、server、location 作用域中。

例子中,設置緩存最多緩存 1000 個日誌文件描述符,20s 內如果緩存中的日誌文件描述符至少被被訪問 2 次,纔不會被緩存關閉。每隔 1 分鐘檢查緩存中的文件描述符的文件名是否還存在。

總結

Nginx 中通過access_logerror_log指令配置訪問日誌和錯誤日誌,通過log_format我們可以自定義日誌格式。如果日誌文件路徑中使用了變量,我們可以通過open_log_file_cache指令來設置緩存,提升性能。

另外,在access_loglog_format中使用了很多變量,這些變量沒有一一列舉出來,詳細的變量信息可以參考 Nginx 官方文檔:

http://nginx.org/en/docs/varindex.html

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/55FzEVnx9EIHweplD_5PEw