更新時間:2021-09-22 10:14:15 來源:動力節點 瀏覽1794次
在本地或通過 syslog 捕獲日志文件中有關錯誤和請求處理的詳細信息。
本文介紹了如何在 NGINX Open Source 和 NGINX Plus 中配置錯誤和已處理請求的日志記錄。
NGINX 將有關遇到的不同嚴重性級別的問題的信息寫入錯誤日志。在error_log中 指令集日志記錄到一個特定的文件,stderr或syslog與指定消息的最低嚴重級別登錄。默認情況下,錯誤日志位于logs/error.log(絕對路徑取決于操作系統和安裝),并且記錄來自指定級別以上的所有嚴重級別的消息。
下面的配置將要記錄的錯誤消息的最低嚴重性級別從error更改為warn:
error_log logs/error.log warn;
在這種情況下,消息warn,error crit,alert,和emerg水平被記錄。
錯誤日志的默認設置全局有效。要覆蓋它,請將error_log 指令放在main(頂級)配置上下文中。main上下文中的設置始終由其他配置級別 ( http、server、location)繼承。所述error_log指令可以在被同時指定的HTTP ,流 ,server和位置 的水平,并覆蓋從較高級別繼承設置。如果出現錯誤,消息只會寫入一個錯誤日志,該日志最接近發生錯誤的級別。但是,如果error_log在同一級別指定了多個指令,則消息將寫入所有指定的日志。
注意:error_log在 NGINX 開源版本1.5.2 中添加了在同一配置級別指定多個指令的能力 。
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 和上游服務器之間的不同時間值,這可能有助于在您的網站速度變慢時診斷問題。您可以使用以下變量來記錄指示的時間值:
$upstream_connect_time – 與上游服務器建立連接所花費的時間
$upstream_header_time – 從建立連接到從上游服務器接收響應頭的第一個字節之間的時間
$upstream_response_time – 從建立連接到從上游服務器接收響應體的最后一個字節之間的時間
$request_time – 處理請求所花費的總時間
所有時間值都以毫秒為單位測量。
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;
...
}
}
在讀取結果時間值時,請記住以下幾點:
當一個請求通過多個服務器處理時,該變量包含多個以逗號分隔的值
當存在從一個上游組到另一組的內部重定向時,值用分號分隔
當請求無法到達上游服務器或無法接收完整標頭時,該變量包含0(零)
如果在連接到上游時發生內部錯誤或從緩存中獲取回復時,該變量包含-(連字符)
可以通過啟用日志消息緩沖區和名稱包含變量的常用日志文件的描述符緩存來優化日志記錄。要啟用緩沖,請使用access_log 指令的buffer參數來指定緩沖區的大小。當下一條日志消息不適合緩沖區時以及在其他一些情況下,緩沖的消息然后被寫入日志文件 。
要啟用日志文件描述符的緩存,請使用open_log_file_cache 指令。
與該error_log指令類似,在 特定配置級別上定義的access_log指令會覆蓋先前級別的設置。當請求處理完成時,消息將寫入在當前級別配置的或從先前級別繼承的日志中。如果一級定義了多個訪問日志,則消息將寫入所有這些日志。
條件記錄允許從訪問日志中排除瑣碎或不重要的日志條目。在 NGINX 中,條件日志由access_log 指令的if參數啟用。
此示例排除具有 HTTP 狀態代碼2xx(成功)和3xx(重定向)的請求:
map $status $loggable {
~^[23] 0;
default 1;
}
access_log /path/to/access.log combined if=$loggable;
許多客戶端使用早于 TLS 1.3 的 TLS 版本。盡管許多密碼被聲明為不安全,但較舊的實現仍在使用它們;ECC 證書提供比 RSA 更高的性能,但并非所有客戶端都可以接受 ECC。許多 TLS 攻擊依賴于“中間人”,他攔截密碼協商握手并強制客戶端和服務器選擇安全性較低的密碼。因此,重要的是將 NGINX Plus 配置為不支持弱密碼或舊密碼,但這樣做可能會排除舊客戶端。
您可以評估從客戶端獲得的 SSL 數據,并確定在刪除對舊 SSL 協議和密碼的支持時排除的客戶端比例。
以下配置示例記錄User-Agent任何連接的 TLS 客戶端的 SSL 協議、密碼和標頭,假設每個客戶端選擇它支持的最新協議和最安全的密碼。
在此示例中,每個客戶端都由其唯一的 IP 地址和用戶代理組合標識。
1.定義自定義日志格式sslparams,包括 SSL 協議的版本 ( $ssl_protocol )、連接中使用的密碼 ( $ssl_cipher )、客戶端 IP 地址 ( $remote_addr ) 和標準User AgentHTTP 請求字段的值( $http_user_agent):
log_format sslparams '$ssl_protocol $ssl_cipher '
'$remote_addr "$http_user_agent"';
2.定義一個鍵值存儲,用于保存客戶端及其用戶代理的 IP 地址,例如clients:
keyval_zone zone=clients:80m timeout=3600s;
3.創建的變量,例如,$seen對于的每個唯一組合$remote_addr和User-Agent標頭:
keyval $remote_addr:$http_user_agent $seen zone=clients;
server {
listen 443 ssl;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
if ($seen = "") {
set $seen 1;
set $logme 1;
}
access_log /tmp/sslparams.log sslparams if=$logme;
# ...
}
4.查看使用此配置生成的日志文件:
TLSv1.2 AES128-SHA 1.1.1.1 "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 2.2.2.2 "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1"
TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 3.3.3.3 "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:58.0) Gecko/20100101 Firefox/58.0"
TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 4.4.4.4 "Mozilla/5.0 (Android 4.4.2; Tablet; rv:65.0) Gecko/65.0 Firefox/65.0"
TLSv1 AES128-SHA 5.5.5.5 "Mozilla/5.0 (Android 4.4.2; Tablet; rv:65.0) Gecko/65.0 Firefox/65.0"
TLSv1.2 ECDHE-RSA-CHACHA20-POLY1305 6.6.6.6 "Mozilla/5.0 (Linux; U; Android 5.0.2; en-US; XT1068 Build/LXB22.46-28) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/12.10.2.1164 Mobile Safari/537.36"
5.處理日志文件以確定數據的傳播:
cat /tmp/sslparams.log | cut -d ' ' -f 2,2 | sort | uniq -c | sort -rn | perl -ane 'printf "%30s %s\n", $F[1], "="x$F[0];'
在此輸出中,識別出低容量、安全性較低的密碼:
ECDHE-RSA-AES128-GCM-SHA256 =========================
ECDHE-RSA-AES256-GCM-SHA384 ========
AES128-SHA ====
ECDHE-RSA-CHACHA20-POLY1305 ==
ECDHE-RSA-AES256-SHA384 ==
然后您可以檢查日志以確定哪些客戶端正在使用這些密碼,然后決定從 NGINX Plus 配置中刪除這些密碼。
該syslog實用程序是計算機消息日志記錄的標準,允許從單個系統日志服務器上的不同設備收集日志消息。在 NGINX 中,日志記錄到 syslog 是使用error_log 和access_log 指令中的syslog:前綴配置的。
系統日志消息可以發送到一個server=域名、IP 地址或 UNIX 域套接字路徑。可以使用端口指定域名或 IP 地址以覆蓋默認端口514. 可以在unix:前綴后指定 UNIX 域套接字路徑:
error_log syslog: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。
該facility=參數指定記錄消息的程序類型。默認值為local7。其他可能的值是:auth, authpriv, daemon, cron, ftp, lpr, kern, mail, news, syslog, user, uucp, local0 ... local7。
該tag=參數將自定義標記應用于系統日志消息(nginx在我們的示例中)。
該severity=參數設置訪問日志的系統日志消息的嚴重性級別。嚴重程度的增加順序可能的值有:debug,info,notice,warn,error(默認), ,crit,alert和emerg。消息記錄在指定級別和所有更嚴重的級別。在我們的例子中,嚴重程度error也使crit,alert和emerg被記錄的水平。
實時活動監控NGINX Plus 提供實時活動監控界面,顯示HTTP 和TCP 上游服務器的關鍵負載和性能指標。
如果對Nginx感興趣,不妨來關注一下動力節點Nginx視頻教程,課程內容詳細,通俗易懂,適合初學者學習,希望對大家能夠有所幫助。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習