前言
Nginx日志對於統計、系統服務排錯很有用。
Nginx日志主要分為兩種:access_log(訪問日志)和error_log(錯誤日志)。通過訪問日志我們可以得到用戶的IP地址、瀏覽器的信息,請求的處理時間等信息。錯誤日志記錄了訪問出錯的信息,可以幫助我們定位錯誤的原因。
本文將詳細描述一下如何配置Nginx日志。
1、設置access_log
訪問日志主要記錄客戶端的請求。客戶端向Nginx服務器發起的每一次請求都記錄在這里。客戶端IP,瀏覽器信息,referer,請求處理時間,請求URL等都可以在訪問日志中得到。當然具體要記錄哪些信息,你可以通過log_format指令定義。
1、1 語法
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。如果指定了該值,當前作用域下的所有的請求日志都被關閉。
1.2 作用域
可以應用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指令中常用的一些變量:
$bytes_sent
發送給客戶端的總字節數
$body_bytes_sent
發送給客戶端的字節數,不包括響應頭的大小
$connection
連接序列號
$connection_requests
當前通過連接發出的請求數量
$msec
日志寫入時間,單位為秒,精度是毫秒
$pipe
如果請求是通過http流水線發送,則其值為"p",否則為“."
$request_length
請求長度(包括請求行,請求頭和請求體)
$request_time
請求處理時長,單位為秒,精度為毫秒,從讀入客戶端的第一個字節開始,直到把最后一個字符發送張客戶端進行日志寫入為止
$status
響應狀態碼
$time_iso8601
標准格式的本地時間,形如“2017-05-24T18:31:27+08:00”
$time_local
通用日志格式下的本地時間,如"24/May/2017:18:31:27 +0800"
$http_referer
請求的referer地址。
$http_user_agent
客戶端瀏覽器信息。
$remote_addr
客戶端IP
$http_x_forwarded_for
當前端有代理服務器時,設置web節點記錄客戶端地址的配置,此參數生效的前提是代理服務器也要進行相關的x_forwarded_for設置。
$request
完整的原始請求行,如 "GET / HTTP/1.1"
$remote_user
客戶端用戶名稱,針對啟用了用戶認證的請求
$request_uri
完整的請求地址,如 "https://daojia.com/"
下面演示一下自定義日志格式的使用:
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=N [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_log和error_log指令配置訪問日志和錯誤日志,通過log_format我們可以自定義日志格式。如果日志文件路徑中使用了變量,我們可以通過open_log_file_cache指令來設置緩存,提升性能。
另外,在access_log和log_format中使用了很多變量,這些變量沒有一一列舉出來,詳細的變量信息可以參考Nginx官方文檔:http://nginx.org/en/docs/varindex.html