nginx的web日志分析
在企业服务器运维中,当Nginx服务器正常运行后,SA会经常密切关注Nginx的访问日志,发现有异常的日志信息需要进行及时处理。
Nginx默认日志路径/usr/local/nginx/logs/,其中包含访问日志access.log 和错误记录日志error.log,如图查看nginx访问日志:cat /usr/local/nginx/logs/access.log |more,如图
Nginx访问日志打印的格式可以自定义,例如Nginx日志打印格式配置如下,Log_format 用来设置日志格式,Name(模块名) Type(日志类型),可以配置多个日志模块,分别供不同的虚拟主机日志记录所调用:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $request_time';
Nginx日志格式内部变量及函数参数说明:
$remote_addr 记录客户端IP地址;
$server_name 虚拟主机名称;
$http_x_forwarded_for HTTP的请求端真实的IP;
$remote_user 记录客户端用户名称;
$request 记录请求的URL和HTTP协议;
$status 记录返回HTTP请求的状态;
$uptream_status upstream的状态;
$ssl_protocol SSL协议版本;
$body_bytes_sent 发送给客户端的字节数,不包括响应头的大小;
$bytes_sent 发送给客户端的总字节数;
$connection_requests 当前通过一个连接获得的请求数量;
$http_referer 记录从哪个页面链接访问过来的;
$http_user_agent 记录客户端浏览器相关信息;
$request_length 请求的长度,包括请求行,请求头和请求正文;
$msec 日志写入时间;
$request_time 请求处理时间,单位为秒,精度毫秒,Nginx接受用户请求的第一个字节到发送完响应数据的时间,包括:接收请求数据时间、程序响应时间、输出、响应数据时间。
$upstream_response_time 应用程序响应时间,Nginx向后端服务建立连接开始到接受完数据然后关闭连接为止的总时间。
通过Nginx日志,可以简单分析WEB网站的运行状态、数据报表、IP、UV(unique visitor)、PV(page view)访问量等需求,如下为常用需求分析:
(1) 统计Nginx服务器独立IP数。
awk '{print $1}' access.log |sort -r|uniq -c | wc -l
(2) 统计Nginx服务器总PV量。
awk '{print $7}' access.log |wc -l
(3) 统计Nginx服务器UV统计。
awk '{print $11}' access.log |sort -r|uniq -c |wc -l
(4) 分析Nginx访问日志截止目前为止访问量前20的IP列表。
awk '{print $1}' access.log|sort |uniq -c |sort -nr |head -20
(5) 分析Nginx访问日志早上9点至中午12点的总请求量。
sed -n "/2016:09:00/,/2016:12:00/"p access.log awk '/2017:09:00/,/2017:12:00/' access.log|wc –l
(6) 分析Nginx访问日志总的独立IP数。
awk '{print $1}' access.log |sort |uniq -c|wc -l
(7) 分析Nginx访问日志截止目前为止访问量前20的IP列表。
awk '{print $1}' access.log|sort |uniq -c |sort -nr |head -20
(8) 分析Nginx访问日志截止目前为止访问量前20的IP列表。
awk '{print $1}' access.log|sort |uniq -c |sort -nr |head -20
(9) 分析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}'
(10) 分析Nginx访问日志访问最多的页面。
awk '{print $7}' access.log |sort |uniq -c|sort -nr|head -20
(11) 分析Nginx访问日志请求处理时间大于5秒的URL,并打印出时间、URL、访客IP。
awk '{if ($NF>5) print $NF,$7,$1}' access.log|sort -nr|more