原文連接: 何曉東 博客php
若是想統計網站的訪問來源信息,能夠用 php 獲取信息,記錄到數據庫的形式,也能夠直接使用 nginx 提供的訪問日誌,來記錄網站的訪問詳情,管理員能夠經過分析 nginx 的訪問日誌,來分析用戶的訪問來源,訪問行爲詳情,網站頁面訪問熱度等。此外,nginx 自身也有錯誤日誌,方便運維人員調試 nginx。對於記錄日誌的行爲,若是每次進行磁盤操做,將會較多的耗費資源,基於這個狀況能夠開啓 nginx 日誌緩衝區,緩衝區滿或者定時寫入的時間到了,再一次寫入日誌。
nginx 在處理請求後當即在訪問日誌中寫入有關客戶端請求的信息。默認狀況下,訪問日誌位 logs/access.log
中,信息以預約義的組合格式寫入日誌。
想要精確記錄訪問信息,就須要自定義一個更加完整的訪問日誌格式,以下所示:nginx
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
或 https
;
固然還有服務器名稱 $server_name
、請求的 URI 和響應狀態碼;
除基本信息外,還有一些統計的結果數據:包括請求處理的毫秒級時間 $request_time
、服務器響應的數據塊大小 $body_bytes_sent
;
此外,客戶端所在國家 $geoip_city_country_code3
、地區 $geoip_region
和城市信息 $geoip_city
也被記錄在內;
變量 $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
塊級指令內,全部時間值均以毫秒爲單位,以毫秒分辨率進行測量。。git
這個格式的日誌配置將產生以下類型的日誌:github
[25/Feb/2019:16:20:42 +0000] 10.0.1.16 192.168.0.122 Derek GET HTTP/1.1 http www.example.com / 200 0.001 370 USA MI "Ann Arbor" - 200 0.001 "-" "curl/7.47.0"
若是須要使用這個日誌配置,須要結合使用 access_log
指令,access_log
指令接收一個日誌目錄和使用的配置名做爲參數:數據庫
server { access_log /var/log/nginx/access.log geoproxy; ... }
access_log
能在多個上下文使用,每一個上下文中能夠定義各自的日誌目錄和日誌記錄格式。json
結論: nginx 中的日誌模塊容許爲不一樣的場景配置日誌格式,以便查看不一樣的日誌文件。
在實際運用中,爲不一樣上下文配置不一樣的日誌會很是有用,記錄的日誌內容能夠簡單的信息,也能夠詳細記錄全部必要信息。不只如此,日誌內容除了支持文本
也能記錄 json 格式和 xml 格式數據。實際上 nginx 日誌有助於您瞭解服務器流量、客戶端使用狀況和客戶端來源等信息。此外,訪問日誌還能夠幫助您定位與上游服務器或特定 uri 相關的響應和問題;對於測試來說,訪問日誌一樣有用,它能夠用於分析流量狀況,模擬真實的用戶交互場景。日誌在故障排除、調試、應用分析及業務調整中做用是不可或缺的。segmentfault
爲了精肯定位 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 版中添加了在同一配置級別指定多個指令的功能。
既然再也不須要將日誌寫到磁盤的某個目錄,而是發送到統一的日誌服務器,則將原有的目錄部分替換爲服務器 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; }
參考連接:
如常,給你們推薦一波課程,我看過的,質量很高 -> 去瞅瞅