前言
如果想統計網站的訪問來源信息,可以用 php 獲取信息,記錄到數據庫的形式,也可以直接使用 nginx 提供的訪問日志,來記錄網站的訪問詳情,管理員可以通過分析 nginx 的訪問日志,來分析用戶的訪問來源,訪問行為詳情,網站頁面訪問熱度等。此外,nginx 自身也有錯誤日志,方便運維人員調試 nginx。對于記錄日志的行為,如果每次進行磁盤操作,將會較多的耗費資源,基于這個情況可以開啟 nginx 日志緩沖區,緩沖區滿或者定時寫入的時間到了,再一次寫入日志。
訪問日志
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 或 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 塊級指令內,所有時間值均以毫秒為單位,以毫秒分辨率進行測量。 。
新聞熱點
疑難解答