更新時間:2021-09-22 10:14:15 來源:動力節(jié)點 瀏覽1809次
在本地或通過 syslog 捕獲日志文件中有關(guān)錯誤和請求處理的詳細(xì)信息。
本文介紹了如何在 NGINX Open Source 和 NGINX Plus 中配置錯誤和已處理請求的日志記錄。
NGINX 將有關(guān)遇到的不同嚴(yán)重性級別的問題的信息寫入錯誤日志。在error_log中 指令集日志記錄到一個特定的文件,stderr或syslog與指定消息的最低嚴(yán)重級別登錄。默認(rèn)情況下,錯誤日志位于logs/error.log(絕對路徑取決于操作系統(tǒng)和安裝),并且記錄來自指定級別以上的所有嚴(yán)重級別的消息。
下面的配置將要記錄的錯誤消息的最低嚴(yán)重性級別從error更改為warn:
error_log logs/error.log warn;
在這種情況下,消息warn,error crit,alert,和emerg水平被記錄。
錯誤日志的默認(rèn)設(shè)置全局有效。要覆蓋它,請將error_log 指令放在main(頂級)配置上下文中。main上下文中的設(shè)置始終由其他配置級別 ( http、server、location)繼承。所述error_log指令可以在被同時指定的HTTP ,流 ,server和位置 的水平,并覆蓋從較高級別繼承設(shè)置。如果出現(xiàn)錯誤,消息只會寫入一個錯誤日志,該日志最接近發(fā)生錯誤的級別。但是,如果error_log在同一級別指定了多個指令,則消息將寫入所有指定的日志。
注意:error_log在 NGINX 開源版本1.5.2 中添加了在同一配置級別指定多個指令的能力 。
NGINX 在處理請求后立即將有關(guān)客戶端請求的信息寫入訪問日志。默認(rèn)情況下,訪問日志位于logs/access.log,信息以預(yù)定義的組合格式寫入日志。要覆蓋默認(rèn)設(shè)置,請使用log_format 指令更改記錄消息的格式,以及使用access_log 指令指定日志的位置及其格式。日志格式是使用變量定義的。
以下示例定義了日志格式,該格式使用指示響應(yīng)的 gzip 壓縮比率的值擴展了預(yù)定義的組合格式。然后將該格式應(yīng)用于啟用壓縮的虛擬服務(wù)器。
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 和上游服務(wù)器之間的不同時間值,這可能有助于在您的網(wǎng)站速度變慢時診斷問題。您可以使用以下變量來記錄指示的時間值:
$upstream_connect_time – 與上游服務(wù)器建立連接所花費的時間
$upstream_header_time – 從建立連接到從上游服務(wù)器接收響應(yīng)頭的第一個字節(jié)之間的時間
$upstream_response_time – 從建立連接到從上游服務(wù)器接收響應(yīng)體的最后一個字節(jié)之間的時間
$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;
...
}
}
在讀取結(jié)果時間值時,請記住以下幾點:
當(dāng)一個請求通過多個服務(wù)器處理時,該變量包含多個以逗號分隔的值
當(dāng)存在從一個上游組到另一組的內(nèi)部重定向時,值用分號分隔
當(dāng)請求無法到達(dá)上游服務(wù)器或無法接收完整標(biāo)頭時,該變量包含0(零)
如果在連接到上游時發(fā)生內(nèi)部錯誤或從緩存中獲取回復(fù)時,該變量包含-(連字符)
可以通過啟用日志消息緩沖區(qū)和名稱包含變量的常用日志文件的描述符緩存來優(yōu)化日志記錄。要啟用緩沖,請使用access_log 指令的buffer參數(shù)來指定緩沖區(qū)的大小。當(dāng)下一條日志消息不適合緩沖區(qū)時以及在其他一些情況下,緩沖的消息然后被寫入日志文件 。
要啟用日志文件描述符的緩存,請使用open_log_file_cache 指令。
與該error_log指令類似,在 特定配置級別上定義的access_log指令會覆蓋先前級別的設(shè)置。當(dāng)請求處理完成時,消息將寫入在當(dāng)前級別配置的或從先前級別繼承的日志中。如果一級定義了多個訪問日志,則消息將寫入所有這些日志。
條件記錄允許從訪問日志中排除瑣碎或不重要的日志條目。在 NGINX 中,條件日志由access_log 指令的if參數(shù)啟用。
此示例排除具有 HTTP 狀態(tài)代碼2xx(成功)和3xx(重定向)的請求:
map $status $loggable {
~^[23] 0;
default 1;
}
access_log /path/to/access.log combined if=$loggable;
許多客戶端使用早于 TLS 1.3 的 TLS 版本。盡管許多密碼被聲明為不安全,但較舊的實現(xiàn)仍在使用它們;ECC 證書提供比 RSA 更高的性能,但并非所有客戶端都可以接受 ECC。許多 TLS 攻擊依賴于“中間人”,他攔截密碼協(xié)商握手并強制客戶端和服務(wù)器選擇安全性較低的密碼。因此,重要的是將 NGINX Plus 配置為不支持弱密碼或舊密碼,但這樣做可能會排除舊客戶端。
您可以評估從客戶端獲得的 SSL 數(shù)據(jù),并確定在刪除對舊 SSL 協(xié)議和密碼的支持時排除的客戶端比例。
以下配置示例記錄User-Agent任何連接的 TLS 客戶端的 SSL 協(xié)議、密碼和標(biāo)頭,假設(shè)每個客戶端選擇它支持的最新協(xié)議和最安全的密碼。
在此示例中,每個客戶端都由其唯一的 IP 地址和用戶代理組合標(biāo)識。
1.定義自定義日志格式sslparams,包括 SSL 協(xié)議的版本 ( $ssl_protocol )、連接中使用的密碼 ( $ssl_cipher )、客戶端 IP 地址 ( $remote_addr ) 和標(biāo)準(zhǔn)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.創(chuàng)建的變量,例如,$seen對于的每個唯一組合$remote_addr和User-Agent標(biāo)頭:
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.處理日志文件以確定數(shù)據(jù)的傳播:
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實用程序是計算機消息日志記錄的標(biāo)準(zhǔn),允許從單個系統(tǒng)日志服務(wù)器上的不同設(shè)備收集日志消息。在 NGINX 中,日志記錄到 syslog 是使用error_log 和access_log 指令中的syslog:前綴配置的。
系統(tǒng)日志消息可以發(fā)送到一個server=域名、IP 地址或 UNIX 域套接字路徑。可以使用端口指定域名或 IP 地址以覆蓋默認(rèn)端口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 地址和端口的系統(tǒng)日志服務(wù)器1234。
該facility=參數(shù)指定記錄消息的程序類型。默認(rèn)值為local7。其他可能的值是:auth, authpriv, daemon, cron, ftp, lpr, kern, mail, news, syslog, user, uucp, local0 ... local7。
該tag=參數(shù)將自定義標(biāo)記應(yīng)用于系統(tǒng)日志消息(nginx在我們的示例中)。
該severity=參數(shù)設(shè)置訪問日志的系統(tǒng)日志消息的嚴(yán)重性級別。嚴(yán)重程度的增加順序可能的值有:debug,info,notice,warn,error(默認(rèn)), ,crit,alert和emerg。消息記錄在指定級別和所有更嚴(yán)重的級別。在我們的例子中,嚴(yán)重程度error也使crit,alert和emerg被記錄的水平。
實時活動監(jiān)控NGINX Plus 提供實時活動監(jiān)控界面,顯示HTTP 和TCP 上游服務(wù)器的關(guān)鍵負(fù)載和性能指標(biāo)。
如果對Nginx感興趣,不妨來關(guān)注一下動力節(jié)點Nginx視頻教程,課程內(nèi)容詳細(xì),通俗易懂,適合初學(xué)者學(xué)習(xí),希望對大家能夠有所幫助。
初級 202925
初級 203221
初級 202629
初級 203743