文章目录
为了分析Nginx日志,通常需要先了解日志格式,然后通过命令行工具或专业工具提取关键信息。以下是完整的操作指南:
1. 确认日志格式
检查Nginx配置文件(如/etc/nginx/nginx.conf
),找到log_format
定义。例如:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
如果日志是JSON格式(例如使用escape=json
),可能需要使用jq
工具解析。
2. 常用命令行分析示例
(1) 统计访问量最多的IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10
(2) 查看最常见的请求URL
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10
(3) 列出所有HTTP错误(如4xx/5xx)
awk '$9 >= 400 {print $9, $7, $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
(4) 统计流量消耗最大的请求
awk '{sum[$7]+=$10} END {for (url in sum) print sum[url], url}' /var/log/nginx/access.log | sort -nr | head -n 10
(5) 分析用户浏览器分布
awk -F'"' '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
3. 使用jq
分析JSON格式日志
如果日志是JSON格式(需配置log_format
启用escape=json
),例如:
log_format json_analytics escape=json '{'
'"time_local":"$time_local",'
'"remote_addr":"$remote_addr",'
'"request":"$request",'
'"status":"$status",'
'"body_bytes_sent":"$body_bytes_sent",'
'"user_agent":"$http_user_agent"'
'}';
(1) 安装jq
(若未安装)
# CentOS 7/8 启用EPEL后安装
yum install -y epel-release && yum install -y jq
(2) 提取关键字段
cat /var/log/nginx/access.log | jq -r '[.time_local, .remote_addr, .request, .status] | @tsv'
(3) 统计状态码分布
cat /var/log/nginx/access.log | jq -r '.status' | sort | uniq -c | sort -nr
4. 使用专业工具分析
(1) GoAccess(实时可视化分析)
# 安装GoAccess
yum install -y goaccess
# 生成HTML报告
goaccess /var/log/nginx/access.log --log-format=COMBINED -o report.html
(2) ELK Stack(长期日志管理)
- 使用Elasticsearch、Logstash、Kibana搭建日志分析平台,适合大规模日志处理。
5. 高级场景分析
(1) 识别恶意爬虫
grep -E 'Googlebot|Baiduspider|YandexBot' /var/log/nginx/access.log | awk '{print $1}' | sort | uniq
(2) 分析慢请求(需日志记录响应时间)
如果配置了$request_time
字段:
awk '{print $NF, $7}' /var/log/nginx/access.log | sort -nr | head -n 20
6. 自动化脚本示例
保存以下脚本为nginx_analytics.sh
,赋予执行权限后运行:
#!/bin/bash
LOG_PATH="/var/log/nginx/access.log"
echo "Top 10 IPs:"
awk '{print $1}' $LOG_PATH | sort | uniq -c | sort -nr | head -n 10
echo -e "\nTop 10 URLs:"
awk '{print $7}' $LOG_PATH | sort | uniq -c | sort -nr | head -n 10
echo -e "\nStatus Code Distribution:"
awk '{print $9}' $LOG_PATH | sort | uniq -c | sort -nr
7. 注意事项
- 权限问题:若日志文件权限受限,使用
sudo
或切换为root
用户。 - 日志轮转:检查是否启用了
logrotate
,避免分析旧日志(如access.log.1
)。 - 自定义字段:根据实际日志格式调整命令中的字段位置(如
$7
表示URL,可能因配置不同而变化)。
通过以上方法,你可以快速定位Nginx服务器的性能瓶颈、安全威胁或用户行为模式。