zl程序教程

您现在的位置是:首页 >  其他

当前栏目

10分钟精通Nginx访问日志分析统计

统计日志Nginx 分析 10 访问 精通 分钟
2023-09-11 14:17:32 时间

很多个人站长在搭建网站时使用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,热点页面,热点方法,错误请求,客户端类型,来源页面等等。下文将逐个介绍各个指标的计算方法。


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)

*|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)

最近一小时访问最多的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)

一些高级功能

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


通过每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

同时,我们也可以限定只查看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)

采集并分析Nginx日志


采集 Nginx 日志的几种方式,你知道几种? 由于nginx功能强大,性能突出,越来越多的web应用采用nginx作为http和反向代理的web服务器。而nginx的访问日志不管是做用户行为分析还是安全分析都是非常重要的数据源之一。如何有效便捷的采集nginx的日志进行有效的分析成为大家关注的问题。
Nginx状态监控及日志分析 Nginx提供了一个内置的状态信息监控页面可用于监控Nginx的整体访问情况,这个功能由`ngx_http_stub_status_module`模块进行实现。日志的分析通过cat,awk等工具统计。
如何采集Nginx的日志? 由于nginx功能强大,性能突出,越来越多的web应用采用nginx作为http和反向代理的web服务器。而nginx的访问日志不管是做用户行为分析还是安全分析都是非常重要的数据源之一。
阿里云日志服务:实用nginx日志查询 查看非内网IP | SELECT client_ip as ip WHERE ip_to_domain(client_ip) != intranet GROUP BY ip | SELECT client_ip as ip,COUNT(*) as count WHERE ip_t...
日志服务-15分钟搞定NGINX访问日志分析 15分钟能做什么? 可能一本书只能看一个章节,慢慢品一杯咖啡才喝了一半,或许玩一把炉石传说。 日志服务11月份发布数据接入向导功能,如果平均一首歌的时间按3分钟计算,那么给我们5首歌的时间,我们一起来通过日志服务的数据接入向导快速玩转NGINX访问日志分析~
阿里云存储服务 193992 阿里云存储基于飞天盘古2.0分布式存储系统,产品包括对象存储OSS、块存储Block Storage、共享文件存储NAS、表格存储、日志存储与分析、归档存储及混合云存储等,充分满足用户数据存储和迁移上云需求,连续三年跻身全球云存储魔力象限四强。