存取日誌
nginx 在處理請求後立即在存取日誌中寫入有關客戶端請求的資訊。預設情況下,存取日誌位元 logs/access.log 中,訊息以預先定義的組合格式寫入日誌。
想要精確記錄存取信息,就需要自訂一個更完整的存取日誌格式,如下所示:
http { log_format geoproxy '[$time_local] $remote_addr ' '$realip_remote_addr $remote_user ' '$request_method $server_protocol ' '$scheme $server_name $uri $status ' '$request_time $body_bytes_sent ' '$geoip_city_country_code3 $geoip_region ' '"$geoip_city" $http_x_forwarded_for ' '$upstream_status $upstream_response_time ' '"$http_referer" "$http_user_agent"'; ... }
這個日誌配置被命名為geoproxy,它使用許多nginx 變數來示範nginx 日誌記錄功能。詳細講解設定選項中各變數的特定意義:
當使用者發起請求時,會記錄伺服器時間 $time_local , $remote_user 值為通過基本授權的使用者名稱;
用於nginx處理 geoip_proxy 和 realip_header 指令的開啟連線的ip 位址與用戶端ip 位址;
之後記錄http 要求方法 $request_method 、協定 $server_protocol 和http 方法 $scheme:http 或#httpshttps ;# #https ;# 當然還有伺服器名稱 $server_name 、請求的uri 和回應狀態碼;
除基本資訊外,還有一些統計的結果資料:包含請求處理的毫秒時間 $request_time 、伺服器回應的資料區塊大小 $body_bytes_sent ;
此外,客戶端所在國家 $geoip_city_country_code3 、地區 $geoip_region 和城市資訊 $geoip_city 也被記錄在內;
# $http_x_forwarded_for 是用來記錄它代理伺服器來記錄
$http_x_forwarded_for 是由它發起它代理伺服器來記錄$http_x_forwarded_for 是由它發起它代理伺服器來記錄
$http_x_forwarded_for 是由它發起它代理伺服器來記錄$http_x_forwarded_for 來記錄。的請求的 x-forwarded-for 頭訊息;
upstream 模組中一些資料也被記錄到日誌中:被代理伺服器的回應狀態碼 $upstream_status 、建立連結和從上游伺服器接收回應主體最後一個位元組的時間 $upstream_response_time 、 建立和上游伺服器的連結時間 $upstream_connect_time 、建立連結和從上游回應頭的第一個位元組的時間 $upstream_header_time 。
請求來源 $http_referer 和使用者代理 $http_user_agent 也可以記錄在日誌中;
nginx 的日誌記錄功能非常強大且靈活的,需要注意的是: 用來定義日誌格式的 log_format 指令僅適用於 http 區塊級指令內,所有時間值均以毫秒為單位,以毫秒解析度進行測量。 。
這個格式的日誌配置將產生如下類型的日誌:"ann arbor" - 200 0.001 "-" "curl/7.47.0"
[25/feb/2019:16:20:42 0000] 10.0.1.16 192.168.0.122 derek
get http/1.1 http / 200 0.001 370 usa mi
#如果需要使用這個日誌設定,需要結合使用 access_log 指令, access_log 指令接收一個日誌目錄和使用的設定名作為參數:
server { access_log /var/log/nginx/access.log geoproxy; ... }
access_log 能在多個情境中使用,每個情境中可以定義各自的日誌目錄和日誌記錄格式。
結論:nginx 中的日誌模組允許為不同的場景配置日誌格式,以便查看不同的日誌檔案。
在實際運用中,為不同上下文配置不同的日誌會非常有用,記錄的日誌內容可以簡單的信息,也可以詳細記錄所有必要信息。不僅如此,日誌內容除了支援文字
也能記錄 json 格式和 xml 格式資料。實際上 nginx 日誌有助於您了解伺服器流量、客戶端使用情況和客戶端來源等資訊。此外,存取日誌還可以幫助您定位與上游伺服器或特定 uri 相關的回應和問題;對於測試來講,存取日誌同樣有用,它可以用於分析流量情況,模擬真實的使用者互動場景。日誌在故障排除、調試、應用分析及業務調整中作用是不可或缺的。
錯誤日誌
為了精確定位nginx 的錯誤日誌,使用自帶的 error_log 指令定義錯誤日誌目錄及記錄錯誤日誌的等級,並設定如下:
error_log /var/log/nginx/error.log warn;
error_log 指令配置時需要一個必選的日誌目錄和一個可選的錯誤等級選項。
除 if 指令外, error_log 指令能在所有的上下文中使用。錯誤日誌等級包括:
debug、info、notice、warn、error、crit、alert 和 emerg。給出的日誌
等級順序就是記錄最小到最嚴謹的日誌等級順序。要注意的是 debug 日誌
需要在編譯 nginx 伺服器時,帶上 --with-debug 標識才能使用。
當伺服器配置出錯時,首先需要查看錯誤日誌以定位問題。錯誤日誌
###也是定位應用程式伺服器(如 fastcgi 服務)的利器。透過錯誤日誌,我們可以偵錯 worker 進程連線錯誤、記憶體分配、客戶端 ip 和 應用程式伺服器等問題。 錯誤日誌格式不支援自訂日誌格式 ;但他同樣記錄目前時間、日誌等級和特定資訊等資料。 ###注意:错误日志的默认设置适用于全局。要覆盖它,请将 error_log 指令放在 main (顶级)配置上下文中。 error_log 在开源 nginx 1.5.2 版中添加了在同一配置级别指定多个指令的功能。
通过 syslog 将日志发送到统一服务器
既然不再需要将日志写到磁盘的某个目录,而是发送到统一的日志服务器,则将原有的目录部分替换为服务器 ip 即可,配置如下:
error_log syslog:server=10.0.1.42 debug; access_log syslog:server=10.0.1.42,tag=nginx,severity=info geoproxy; #error_log server=unix:/var/log/nginx.sock debug; #access_log syslog:server=[2001:db8::1]:1234,facility=local7,tag=nginx,severity=info;
error_log 和 access_log 指令的 syslog 参数紧跟冒号 : 和一些参数选项。包括:必选的 server 标记表示需要连接的 ip、dns 名称或 unix 套接字;
可以使用如上注释的高端玩。
可选参数有 facility 、 severity 、 tag :
server 参数接收带端口的 ip 地址或 dns 名称;默认是 udp 514 端口。
facility 参数设置 syslog 的类型 facility ,值是 syslog rfc 标准定义的 23 个值中一个,默认值为 local7 。其他可能的值是: auth , authpriv , daemon , cron , ftp , lpr , kern , mail , news , syslog , user , uucp , local0 ... local7
tag 参数表示日志文件中显示时候的标题,默认值是 nginx 。
severity 设置消息严重程度,默认是 info 级别日志。
日志缓冲区
当系统处于负载状态时,启用日志缓冲区以降低 nginx worker 进程阻塞。大量的磁盘读写和 cpu 资源使用对于服务器资源也是一种巨大消耗。将日志数据缓冲到内存中可能是很小的一个优化手段, buffer 参数意义是缓冲区的大小,功能是当缓冲区已经写满时,日志会被写入文件中; flush 参数意义是缓冲区内日志在缓冲区内存中保存的最长时间,功能即当缓存中的日志超过最大缓存时间,也会被写入到文件中, 不足的地方即写入到日志文件的日志有些许延迟,即时调试中应当关闭日志缓冲。 。配置如下:
http { access_log /var/log/nginx/access.log main buffer=32k flush=1m; }
以上是Nginx如何自訂記錄及啟用日誌緩衝區的詳細內容。更多資訊請關注PHP中文網其他相關文章!