Nginx Web 日志分析
在企业服务器运维中,当 Nginx 服务器正常运行后, SA 会经常密切关注 Nginx 的访问日志,发现有异常的日志信息需要进行及时处理;
Nginx 默认日志路径/usr/local/nginx/logs/,其中包含访问日志 access.log
和错误记录日志 error.log
;
一、Nginx 访问日志打印的格式
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" "$http_x_forwarded_for" $request time ',
192.168.146.132 - - [13/Dec/2019:16:33:33 +0800] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0" "-" GET / HTTP/1.1 time
Nginx 日志格式内部变量及函数参数说明如下:
$remote_addr
:记录客户端 IP 地址 。$server_name
:虚拟主机名称。$http x forwarded for
: HTTP 请求端真实的 IP。$remote_user
:记录客户端用户名称。$rquest
:记录请求的 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
:请求处理时间,单位为 s,精度为 ms,Nginx 接受用户请求的第一个 字节到发送完响应数据的时间,包括接收请求数据时间、程序响应时间、输出、响应 数据时间。$upstream_response_time
:应用程序响应时间,Nginx 向后端服务建立连接开始到 接受完数据然后关闭连接为止的总时间。
二、Web访问信息统计
通过 Nginx 日志,可以简单分析 Web 网站的运行状态
、数据报表
、IP
、UV (独立访问用户数)
、PV(页面访问量)
访问量等需求,以下为常用需求分析:
- 统计 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 访问日志总的独立 IP 数:
awk '{print $1}' access.log | sort | uniq -c | wc -l
- 分析 Nginx 访问日志截至目前为止访问量前 20 的 IP 列表:
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -20
- 分析 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 访问日志请求处理时间大于 5s 的 URL,并打印出时间、 URL、访客 IP:
awk '{if ( $NF > 5) print $NF,$7,$1 }' access.log|sort -nr|more