在企业服务器运维中,当Nginx服务器正常运行后,运维会经常密切关注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:请求处理时间,单位为s,精度为ms,Nginx接受用户请求的第一个字节到发送完响应数据的时间,包括接受请求数据时间,程序响应时间,输出,响应数据时间
$upstream_response_time:应用程序响应时间,Nginx向后端服务器建立连接开始到接受完数据后关闭连接为止的总时间
通过Nginx日志,可以简单分析Web网站的运行状态、数据报表、IP、UV、PV访问量等需求,以下为常用需求分析:
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 “/2019:9:00/,/2019:12:00/”p access.log
awk '/2019:09:00/,/2019:12:00/' access.log |wc -l
6、分析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}'
7、分析Nginx访问日志访问最多的页面,代码如下
awk ‘{print $7}’ access.log | sort |uniq -c | sort -nr | head -20
8、分析Nginx访问日志请求处理时间大于5s的URL,并打印出时间、URL、访客ip
awk '{if ($NF>5) print $NF,$7,$1}' access.log | sort -nr | more