閱讀235 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

簡介

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

  1. 使用CNZZ之類的方式,在前端頁麵插入js,用戶訪問的時候觸發js,記錄訪問請求。
  2. 分析nginx的access log,從日誌中挖掘有用信息。

兩種方式各有優缺點:

  1. CNZZ使用起來比較簡單,各種指標定義清楚。但這種方式隻能記錄頁麵的訪問請求,像ajax之類的請求是無法記錄的,還有爬蟲信息也不會記錄。
  2. access log對所有的請求都有記錄,可以說信息非常詳細,但需要站長對訪問日誌具備詳細的了解和動手能力。

兩種手段相互補充,才能對網站的狀況有更加深入的了解。

日誌服務新推出來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;

字段解釋:

  1. remote_addr : 客戶端地址
  2. remote_user : 客戶端用戶名
  3. time_local : 服務器時間
  4. request : 請求內容,包括方法名,地址,和http協議
  5. http_host : 用戶請求是使用的http地址
  6. status : 返回的http 狀態碼
  7. request_length : 請求大小
  8. body_bytes_sent : 返回的大小
  9. http_referer : 來源頁
  10. http_user_agent : 客戶端名稱
  11. request_time : 整體請求延時

收集訪問日誌到日誌服務

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

    請參考文檔5分鍾快速文檔

  2. 把日誌收集到日誌服務後,設置每一列的類型:

    注:其中request拆分城method 和uri兩列

    日誌樣例:

分析訪問日誌

通常,對access log的訪問需求有,查看網站的pv,uv,熱點頁麵,熱點方法,錯誤請求,客戶端類型,來源頁麵等等。下文將逐個介紹各個指標的計算方法。

  1. PV統計不僅可以一段時間總的PV,還可以按照小的時間段,查看每段時間的,比如每5分鍾pv

    統計代碼

    *|select from_unixtime( __time__- __time__% 300) as t, 
         count(1) as pv  
         group by __time__- __time__% 300 
         order by t limit 60
    
    

    統計結果

    pv

  2. 統計一小時內每5分鍾的UV

    統計代碼:

    *|select from_unixtime( __time__- __time__% 300) as t,
            approx_distinct(remote_addr) as uv  
            group by __time__- __time__% 300 
            order by t limit 60
    

    uv_5min

  3. 統計一小時內總的UV

    統計代碼:

    *|select approx_distinct(remote_addr)  
    

    統計結果:

    uv

  4. 最近一小時訪問最多的10個頁麵

    *|select url,count(1) as pv group by url order by pv desc limit 10
    

    top10page

  5. 最近一小時各種請求方法的占比

    *| select method, count(1) as pv group by method
    

    method

  6. 最近一小時各種http狀態碼的占比

    *| select status, count(1) as pv group by status
    

    status

  7. 最近一小時各種瀏覽器的占比

    *| select user_agent, count(1) as pv group by user_agent
    

    user_agent

  8. 最近一小時referer來源於不同域名的占比

    *|select url_extract_host(http_referer) ,count(1) group by url_extract_host(http_referer)
    

    注:url_extract_host為從url中提取域名
    referer

  9. 最近一小時用戶訪問不同域名的占比

    *|select  http_host ,count(1) group by http_host
    

    host

    一些高級功能

除了一些訪問指標外,站長常常還需要對一些訪問請求進行診斷,查看一下處理請求的延時如何,有哪些比較大的延時,哪些頁麵的延時比較大。

  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__ -__time__% 300 
             limit 60
    

    avg_max_latency

  2. 知道了最大延時帳號,我們需要知道最大延時對應的請求頁麵是哪個,方便進一步優化頁麵響應。

    *|select from_unixtime(__time__ - __time__% 60) , 
      max_by(url,request_time)  
      group by __time__ - __time__%60
    

    top_latency_req

  3. 從總體把握,我們需要知道網站的所有請求的延時的分布, 把延時分布在十個桶裏邊,看每個延時區間的請求個數

    *|select  numeric_histogram(10,request_time)
    

    latency_histogram1

  4. 除了最大的延時,我們還需要知道最大的十個延時,對應的值是多少

    *|select max(request_time,10)
    

    top_10_latency

  5. 當我們知道了/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

    url0method
    url0useragent
    url0status

  6. 同時,我們也可以限定隻查看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

    latency1000url

最後更新:2017-05-27 15:01:38

  上一篇:go  《精通Spring MVC 4》——1.5 那就正式開始吧
  下一篇:go  《深入理解Scala》——導讀