日誌
Nginx通過 ngx_ http_ log_ module來對日誌的記錄進行配置。
記錄自定義變量
指令: log_ format
語法: log_ format name [escape = default | json | none] string …;
默認值: log_ format combined “...";
環境: http
含義:配置日誌的格式。
絕大部分請求信息都可以通過 Nginx現有的變量來獲取,例如常見的 Cookie、 IP地址、 User_ Agent、請求體大小、單個請求頭、 server_ ip、後端節點和端口號等。
當然還有自定義變量,如需將自定義變量存放到日誌中,只需簡單的兩步。
- 使用自定義變量前需要先進行初始化:
set $a '123';
- 爲自定義變量添加日誌格式:
log_format main '$remote_addr $a'
日誌格式規範
日誌經常會被用來分析和查找問題,爲了提升日誌的可讀性,需要規範日誌的格式以減少解析日誌時出現的麻煩。
在 Nginx 1. 11. 8版本之後,提供了[ escape = default | json | none]配置,它可以讓 Nginx在記錄變量時使用 JSON格式或默認字符。如果使用默認字符則會被轉義,特別是當 POST請求中包含中文字符或需要轉義的字符時,默認轉義的操作會使日誌無法記錄明確的信息。
日誌記錄推薦使用如下格式:
使用 escape = json則日誌內容不會被轉義,中文字符可以直接在日誌裏面顯示。日誌的格式採用 JSON的方式進行配置,對後期的數據採集會有很大的幫助,當在日誌裏添加新的變量時,不會影響日誌分析的流程。
日誌存儲
日誌存儲通過 access_ log來完成。
指令: access_ log
語法: access_ log path [format [buffer = size] [gzip[ = level]] [flush = time] [if = condition]]; access_ log off;
默認值: access_ log logs/ access. log combined;
環境: http、 server、 location、 if in location、 limit_ except
- 在同一個階段中,支持多種格式和文件的收集。
- 若不在同一個階段,則會以最小配置階段的 access_ log爲指定文件。
- 支持壓縮存儲,可以減少硬盤的使用空間。
- 支持只記錄某些狀態。
- 支持關閉日誌記錄。
指令 access_ log只記錄訪問日誌,關於錯誤信息的日誌記錄在 error_ log上,示例如下:
注意:日誌應該存放在獨立的硬盤上,最好和系統盤及存放 Nginx配置文件的硬盤相互獨立,避免讓日誌硬盤的 I/ O影響服務器的其他服務。在高併發的情況下,可能每秒會生成幾十兆的日誌。
HTTP執行階段
Nginx對請求的處理髮生在多個 HTTP執行階段,前面介紹的指令都是在這些階段中執行的,瞭解這些階段的執行順序和用途,對後續原生模塊、第三方模塊的學習,以及使用 Lua開發新的功能都有非常重要的作用。
HTTP執行階段配置在 ngx_ http_ core_ module中,下載 Nginx的源碼包後在 src/ http/ ngx_ http_ core_ module. h中可以看到。
下面是 ngx_ http_ core_ module. h中的一段源碼:
通過上述配置,可以看出 Nginx包含 11個階段,當請求進入 Nginx後,每個 HTTP執行階段的作用見下表(按照執行順序進行排列)。