wordpress mysql php Android Ubuntu centos 云计算 google 开源 Windows java shell 编程 linux Python nginx apache Firefox 程序员 微软

10分鐘精通Nginx訪問日誌分析統計

很多個人站長在搭建網站時使用Nginx作為服務器,為了了解網站的訪問情況,一般有兩種手段:

使用CNZZ之類的方式,在前端頁面插入js,用戶訪問的時候觸發js,記錄訪問請求。
利用流計算、或離線統計分析nginx的access log,從日誌中挖掘有用信息。
兩種方式各有優缺點:

CNZZ使用起來比較簡單,各種指標定義清楚。但這種方式只能記錄頁面的訪問請求,像ajax之類的請求是無法記錄的,還有爬蟲信息也不會記錄。
利用流計算、離線計算引擎可以支持個性化需求,但需要搭建一套環境,並且在實時性以及分析靈活性上比較難平衡。
兩種手段相互補充,才能對網站的狀況有更加深入的了解。

日誌服務在查詢基礎上新推出來SQL支持實時日誌分析功能,極大的降低了站長們分析access log的門檻,本文將詳細介紹如何使用日誌服務分析access log中的各種指標。

Nginx訪問日誌格式

一個典型的nginx訪問日誌配置:

      log_format  main  '$remote_addr - $remote_user [$time_local] "$request" $http_host '
                        '$status $request_length $body_bytes_sent "$http_referer" '
                        '"$http_user_agent"  $request_time';
  
      access_log  access.log  main;

字段解釋:

remote_addr : 客戶端地址
remote_user : 客戶端用戶名
time_local : 服務器時間
request : 請求內容,包括方法名,地址,和http協議
http_host : 用戶請求是使用的http地址
status : 返回的http 狀態碼
request_length : 請求大小
body_bytes_sent : 返回的大小
http_referer : 來源頁
http_user_agent : 客戶端名稱
request_time : 整體請求延時
收集訪問日誌到日誌服務

首先把日誌收集到日誌服務

請參考文檔[5分鐘快速文檔](https://help.aliyun.com/document_detail/29005.html?spm=5176.doc49084.6.554.T6emkU)
把日誌收集到日誌服務後,設置每一列的類型:
![index_attribute](https://yqfile.alicdn.com/040597e2b56c987f0430e0124f1d20fee32f7125.png)
>註:其中request拆分城method 和uri兩列

日誌樣例:

![sample_log](https://yqfile.alicdn.com/5de2c57afd7986032b64646510c72c4c8869dfbc.png)
分析訪問日誌

通常,对access log的访问需求有,查看网站的pv,uv,热点页面,热点方法,错误请求,客户端类型,来源页面等等。下文将逐个介绍各个指标的计算方法。

  1. PV统计不仅可以一段时间总的PV,还可以按照小的时间段,查看每段时间的,比如每5分钟pv

    统计代码
    
    *|select from_unixtime( __time__- __time__% 300) as t, 
    count(1) as pv  
    group by t
    order by t limit 60
    
    统计结果
    
    ![pv](https://yqfile.alicdn.com/56ce62cab64e3542fc9d6a3f6b14a22abc5fe2af.png)
  2. 统计一小时内每5分钟的UV

    统计代码:
    
    *|select from_unixtime( __time__- __time__% 300) as t,
       approx_distinct(remote_addr) as uv  
       group by t
       order by t limit 60
    ![uv_5min](https://yqfile.alicdn.com/687bde0d8995d71d8374349ce7757c6f9825d24d.png)
  3. 統計一小時內總的UV

    統計代碼:
    *|select approx_distinct(remote_addr)  

    統計結果:

    ![uv](https://yqfile.alicdn.com/001e8ef12a3fc472b708aeceee2d3ad70764ea8a.png)
    最近一小時訪問最多的10個頁面

    *|select url,count(1) as pv group by url order by pv desc limit 10
    ![top10page](https://yqfile.alicdn.com/af2291d35c0c30d168258ab44137a54190a78c1c.png)
    最近一小時各種請求方法的占比

    *| select method, count(1) as pv group by method
    ![method](https://yqfile.alicdn.com/195aaf278462ee01ca382c475611d98fd3aaa1f9.png)
    最近一小時各種http狀態碼的占比

    *| select status, count(1) as pv group by status
    ![status](https://yqfile.alicdn.com/a28b4f6ce427a052371fc7b374d66b3dd5d36259.png)
    最近一小時各種瀏覽器的占比

    *| select user_agent, count(1) as pv group by user_agent
    ![user_agent](https://yqfile.alicdn.com/aa0272f6fc0e57afff39eb89d4272895847c907a.png)    
    最近一小時referer來源於不同域名的占比

    *|select url_extract_host(http_referer) ,count(1) group by url_extract_host(http_referer)
     註:url_extract_host為從url中提取域名
     ![referer](https://yqfile.alicdn.com/cb241e0fa6c27cdd07fc4052499f9f4a77e48f55.png)
    最近一小時用戶訪問不同域名的占比

    *|select  http_host ,count(1) group by http_host
    ![host](https://yqfile.alicdn.com/a47534252b8310a187d8d19d49e18b18f7edff53.png)
    一些高級功能

除了一些访问指标外,站长常常还需要对一些访问请求进行诊断,查看一下处理请求的延时如何,有哪些比较大的延时,哪些页面的延时比较大。

  1. 通過每5分鐘的平均延時和最大延時, 對延時的情況有個總體的把握

    *|select from_unixtime(__time__ -__time__% 300) as time
       avg(request_time) as avg_latency ,
       max(request_time) as max_latency  
       group by time
       limit 60
    ![avg_max_latency](https://yqfile.alicdn.com/bdcf7bc7b88bc764dfe5aa5be340e0775127e1af.png)
    知道了最大延時之後,我們需要知道最大延時對應的請求頁面是哪個,方便進一步優化頁面響應。

    *|select from_unixtime(__time__ - __time__% 60) as t , 
    max_by(url,request_time)  
    group by t
    ![top_latency_req](https://yqfile.alicdn.com/9e63e61c50f50f42be77e44824d581b86b23b50b.png)
    從總體把握,我們需要知道網站的所有請求的延時的分布, 把延時分布在十個桶裏邊,看每個延時區間的請求個數

    *|select  numeric_histogram(10,request_time)

    ![latency_histogram1](https://yqfile.alicdn.com/9dcbf7ca5a04786f6009c41efd49954e20dd6554.png)
    除了最大的延時,我們還需要知道最大的十個延時,對應的值是多少

     *|select max(request_time,10)
     
    ![top_10_latency](https://yqfile.alicdn.com/13ba86be8c2dfdc10760ba3ce8c5b530c075b351.png)    
    當我們知道了/0這個頁面的訪問延時最大,為了對/0頁面進行調優,接下來需要統計/0這個頁面的訪問PV,UV,各種method次數,各種status次數,各種瀏覽器次數,平均延時,最大延時

    url:"/0"|select count(1) as pv, approx_distinct(remote_addr) as uv, histogram(method) as method_pv,histogram(status) as status_pv, histogram(user_agent) as user_agent_pv, avg(request_time) as avg_latency,  max(request_time) as max_latency
    
    ![url0](https://yqfile.alicdn.com/9ee2bc365a84de38e8581225c9ee9e6042ff4b06.png)
    
    ![url0method](https://yqfile.alicdn.com/013143a1eb8c8fd751414596e0561c10db921b26.png)

    url0useragent

url0status

  1. 同時,我們也可以限定只查看request_time 大於1000的請求的pv,uv,以及各個url的請求次數

    request_time > 1000 |select count(1) as pv, approx_distinct(remote_addr) as uv, histogram(url) as url_pv
    ![url_pv](https://yqfile.alicdn.com/1ebc8a4ea3e2faaf0b211ea46c1d092385b0bb7c.png)
    
    
    ![latency1000url](https://yqfile.alicdn.com/5c2faacf8860fac0d9f519474023f57ddd78bcb6.png)
    

延伸阅读

    评论