nginx web日志介绍和分析

Nginx访问日志打印的格式可以自定义,例如Nginx日志打印格式配置如下,Log_format 用来设置日志格式,Name(模块名) Type(日志类型),可以配置多个日志模块,分别供不同的虚拟主机日志记录所调用:

log_format

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
              '"$http_user_agent"  $request_time';
access_log /spool/logs/nginx-access.log compression buffer=32k;

log_format 指定日志格式 niginx日志格式及其内部变量函数参数说明:

  1. $remote_addr 记录客户端IP地址

  2. $server_name 虚拟机主机名称

  3. $http_x_forwarded_for HTTP请求的真实IP

  4. $remote_user 记录客户端用户名称

  5. $request 记录请求的URL和Http协议版本

  6. $status 记录返回http请求的状态

  7. $upstream_status upstream的状态

  8. $ssl_protocol SSL协议版本

  9. $body_bytes_sent 发送客户端的字节数,不包括响应头的大小

  10. $bytes_sent 发送客户端的总字节数

  11. $connection_requests 当前通过一个连接获得的请求数量

  12. $http_referer 记录从哪个页面链接过来的

  13. $http_user_agent 记录客户端浏览器的相关信息

  14. $request_length 请求的长度,包括请求行,请求头和正文

  15. $msec 日志写入时间

  16. $request_time 请求处理的时间,单位为秒,精度毫秒,nginx发送第一个字节到发送完响应数据的时间。

  17. $upstream_response_time 应用程序响应的时间,nginx响应向后端服务器建立连接开始到接受完数据然后关闭连接为止的总时间。

access_log

access_log /spool/logs/nginx-access.log compression buffer=32k;access_log off;

access_log: 为访问日志设置路径,格式和缓冲区的大小(nginx访问日志支持缓存)。 在同一个配置层级里可以指定多个日志。 特定值off会取消当前配置层级里的所有access_log指令。 如果没有指定日志格式则会使用预定义的“combined”格式。

日志文件的路径可以包含变量,但此类日志存在一些限制:

  1. 工作进程使用的user 应拥有在目录里创建文件的权限;

  2. 写缓冲无效;

  3. 每条日志写入都会打开和关闭文件。然而,频繁使用的文件描述符可以存储在缓存中, 在open_log_file_cache指令的valid参数指定的时间里, 

    写操作能持续写到旧文件

  4. 每次日志写入的操作都会检查请求的 根目录是否存在, 如果不存在则日志不会被创建。 

    因此在一个层级里同时指定root 和access_log是一个不错的想法。

open_log_file_cache

open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;

open_log_file_cache: 定义一个缓存,用来存储频繁使用的文件名中包含变量的日志文件描述符。 该指令包含以下参数:

  1. max : 设置缓存中描述符的最大数量;如果缓存被占满,最近最少使用(LRU)的描述符将被关闭。

  2. inactive : 设置缓存文件描述符在多长时间内没有被访问就关闭; 默认为10秒。

  3. min_uses : 设置在inactive参数指定的时间里, 最少访问多少次才能使文件描述符保留在缓存中;默认为1。

  4. valid : 设置一段用于检查超时后文件是否仍以同样名字存在的时间; 默认为60秒。

  5. off : 禁用缓存功能

IP PV UV VV的介绍

IP:独立的IP,一天内相同的访问相同的IP地址被计算一次。

PV:Page View,就是页面浏览量或者点击量,就是每次打开一个页面就算作一次PV,也指页面刷新的次数,每一次页面刷新,就算做一次PV流量。

UV:Unique Visitor,独立访客数,一天内访问某站点的人数,以COOKIE为依据,一天内相同客户端的IP只被计算为一次访客。

用Cookie分析UV值 : 当客户端第一次访问某个网站服务器的时候,网站服务器会给这个客户端的电脑发出一个Cookie,通常放在这个客户端电脑的C盘当中。在这个Cookie中会分配一个独一无二的编号,这其中会记录一些访问服务器的信息,如访问时间,访问了哪些页面等等。当你下次再访问这个服务器的时候,服务器就可以直接从你的电脑中找到上一次放进去的Cookie文件,并且对其进行一些更新,但那个独一无二的编号是不会变的。

VV : Visit View,访客访问的次数,当访客完成所有的浏览并最终关掉该网站的所有页面时,便完成了一次访问,同一访客一天内可能有多次访问行为,访问次数累计。

实例说明

小明在家用ADSL拨号上网,早上8点访问了www.jj.com下的2个页面,下午2点又访问了www.jj.com的3个页面。那么,对于www.jj.com来讲,今天的PV、UV、VV、IP各项指标该如何计算呢?

PV:5 PV指浏览量,因此PV指等于上午浏览的2个页面和下午浏览的3个页面之和;

UV:1 UV指独立访客数,因此一天内同一访客的多次访问只计为1个UV;

VV:1 VV指访客的访问次数,上午和下午分别有一次访问行为,因此VV为2

IP:2 IP为独立IP数,由于ADSL拨号上网每次都IP不同,因此独立IP数位2;

日志分析

通过Nginx日志,可以简单分析WEB网站的运行状态、数据报表、IP、UV(unique visitor)、PV(page view)访问量等需求,如下为常用需求分析:

使用的日志格式

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
              '$status $body_bytes_sent "$http_referer" '
          '"$http_user_agent"  $request_time';
  •  统计nginx服务器的独立IP数

    awk  '{print $1}' access.log |sort -r|uniq -c | wc -l
  •  统计Nginx的PV量

    awk  '{print $7}' access.log |wc -l
  •  统计Nginx服务器UV统计(仅做演示)

    awk  '{print $11}' access.log |sort -r|uniq -c |wc -l
  •  分析Nginx访问日志截止目前为止访问量前20的IP列表。

    awk  '{print  $1}'  access.log|sort |uniq -c |sort -nr |head -20
  •  分析Nginx访问日志早上9点至中午12点的总请求量。

    sed  -n  "/2016:09:00/,/2016:12:00/"p access.log|wc -lawk  '/2017:09:00/,/2017:12:00/' access.log|wc –l
  •  分析Nginx访问日志截止目前为止访问量前20的IP列表。

    awk  '{print  $1}'  access.log|sort |uniq -c |sort -nr |head -20
  •  分析Nginx访问日志状态码404、502、503、500、499等错误信息页面,打印错误出现次数大于20的IP地址。

    awk '{if ($9~/502|499|500|503|404/) print $1,$9}' access.log|sort|uniq –c|sort –nr | awk '{if($1>20) print $2}'
  •  分析Nginx访问日志访问最多的页面。

    awk  '{print $7}'   access.log |sort |uniq -c|sort -nr|head -20
  •  分析Nginx访问日志请求处理时间大于5秒的URL,并打印出时间、URL、访客IP。

    awk  '{if ($NF>5)  print $NF,$7,$1}'  access.log|sort -nr|more