Nginx 日誌和監控
1. 配置錯誤日誌 Error Log
Nginx 將遇到的不同嚴重級別問題的資訊寫入錯誤日誌。 error_log 指令設定對特定檔案,stderr 或 syslog 的日誌記錄,並指定要記錄的訊息的最低嚴重級別。 預設情況下,錯誤日誌位於 logs/error.log(絕對路徑取決於作業系統和安裝),並且預設記錄所有嚴重級別的訊息。
下面的配置將記錄錯誤資訊的最低級別從 error 改為 warn:
error_log logs/error.log warn;
此時,warn、error crit、alert 和 emerg 這幾種級別的訊息會寫入日誌。
錯誤日誌的預設設定在全域性範圍內有效。為了覆蓋這個設定,可以在主配置檔案的頂級上下文中使用
注意:Nginx 開源版本 1.5.2 之後才增加了在同一個上下文中使用了多個 error_log 指令寫入所有指定的日誌中這個功能。
2. 配置訪問日誌 Access Log
Nginx 會在客戶端請求處理完成後,立刻把相關資訊寫入訪問日誌。預設情況下,訪問日誌位於 logs/access.log,並且資訊會以預定義的組合格式寫入日誌。要覆蓋預設設定,可以使用 log_format
access_log
指令指明日誌位置和格式。日誌格式用變數定義。
以下示例定義了將預定義的組合格式與指示響應的 gzip 壓縮比率的值一起擴充套件的日誌格式。 然後將格式應用於啟用壓縮的虛擬伺服器。
http {
log_format compression '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" "$gzip_ratio"' ;
server {
gzip on;
access_log /spool/logs/nginx-access.log compression;
...
}
}
日誌格式的另一個例子,可以跟蹤 Nginx 和上游伺服器之間的不同時間值,如果您的網站體驗變慢,可能有助於診斷問題。 可以使用以下變數記錄指示的時間值:
所有時間值均以秒為單位進行測量,以毫秒為解析度。
http {
log_format upstream_time '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"'
'rt=$request_time uct="$upstream_connect_time" uht="$upstream_header_time" urt="$upstream_response_time"';
server {
access_log /spool/logs/nginx-access.log upstream_time;
...
}
}
下面是幾個如何讀取結果時間值的規則:
- 當一個請求需要幾臺伺服器來處理時,變數包含幾個用逗號分隔的值。
- 當有 upstream 伺服器組之間的內部重定向,結果值用分號分隔。
- 當一個請求無法到達 upstream 伺服器或者無法接受到完整的頭欄位,變數包含“0”。
- 連線到 upstream 伺服器時發生錯誤,或者從快取中獲取響應,變數包含“-”。
日誌記錄可以通過啟用日誌訊息的緩衝區以及名稱包含變數的常用日誌檔案描述符的快取(the cache of descriptors of frequently used log files whose names contain variables)來優化。 要啟用緩衝,請使用 access_log 指令的 buffer 引數指定緩衝區的大小。 當下一條日誌訊息不適合緩衝區(填滿緩衝區)以及 其他一些情況 時,將緩衝的訊息寫入日誌檔案。
access_log 指令和 error_log 指令類似,指定層級的配置會覆蓋上一層級的配置。當請求處理完成後,訊息寫入當前層級指定的日誌檔案,或從上面層級繼承的日誌檔案。如果一個層級中定義了多個訪問日誌,則訊息寫入到所有的日誌中。
3. 啟用條件日誌記錄(Conditional Logging)
條件日誌記錄允許從訪問日誌中排除不重要日誌(trivial)或不重要的日誌條目(unimportant log entries)。 在 Nginx 中,條件日誌記錄由 access_log 指令的 if 引數啟用。
下面的例子中,將 HTTP 狀態碼為 2XX(成功)和 3XX(重定向)的請求排除:
map $status $loggable {
~^[23] 0;
default 1;
}
access_log /path/to/access.log combined if=$loggable;
4. 寫入系統日誌(Syslog)
syslog 實用程式是計算機訊息日誌記錄的標準,允許從不同裝置收集日誌訊息到單個系統日誌伺服器上。 在 Nginx 中,使用 error_log 和 access_log 指令中的 syslog:
字首配置如何記錄日誌到 syslog。
syslog 的訊息可以傳送到 server=
引數,可以是域名,IP 地址或 Unix 域名套接字路徑。域名或 IP 地址可以通過制定埠來覆蓋預設的 514 埠。Unix 域名套接字路徑可以通過 unix:
字首制定:
error_log server=unix:/var/log/nginx.sock debug;
access_log syslog:server=[2001:db8::1]:1234,facility=local7,tag=nginx,severity=info;
這個例子中,Nginx 錯誤日誌訊息中的 debug 級別訊息會寫入制定的 Unix 域名套接字路徑,訪問日誌會寫入通過 IPv6 地址和埠號 1234 制定的 syslog 伺服器。
facility=
引數指定記錄訊息的程式的型別。 預設值是 local7。 其他可能的值是:auth, authpriv, daemon, cron, ftp, lpr, kern, mail, news, syslog, user, uucp, local0 … local7.
tag=
引數將自定義 tag 標記應用於系統日誌訊息(這裡制定為 nginx)。
severity=
引數設定訪問日誌的系統日誌訊息的嚴重級別。可用值按照嚴重級別排列如下:debug、info、notice、warn、error (default)、crit、alert 和 emerg。所有指定級別和更加嚴重級別的訊息會寫入日誌。指定的嚴重級別為 error 時,嚴重級別為 crit、alert 和 emerg 的訊息也會寫入日誌。
5. 實時活動監控
Nginx Plus 提供了一個實時活動監控介面,顯示 HTTP 和 TCP 上游 upstream 伺服器的關鍵負載和效能指標。更多資訊 參考這裡。
6. 用 Amplify 監測 Nginx
Nginx 有一個自帶的監控工具,稱為 NGINX Amplify,是一個 SaaS 工具,可以用來監控伺服器。
Nginx Amplify 上手資料 參考這裡。 在十分鐘內,可以獲得所有關鍵 Nginx 指標的開箱即用圖表,而且還可以獲得 Linux 作業系統,PHP-FPM,Docker 容器等的指標。 Nginx Amplify 會自動使用來自 stub_status 和 訪問日誌 的指標,並且還可以收集各種作業系統資訊。
更多資料 參考這裡。