通过Nginx日志监控服务器状态是运维工作中的重要环节,以下是系统化的解决方案:
一、日志配置优化(nginx.conf) 1. 推荐日志格式(http模块内添加):
log_format main_ext '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'rt=$request_time uct="$upstream_connect_time" '
'uht="$upstream_header_time" urt="$upstream_response_time"';
- $request_time:请求处理总时间 - $upstream_*:后端服务耗时指标 - $status:HTTP状态码 - $body_bytes_sent:响应体大小
二、实时监控方案 1. 使用GoAccess实时分析:
goaccess /var/log/nginx/access.log -o /var/www/html/report.html --real-time-html --log-format=COMBINED
ngxtop -l /var/log/nginx/access.log --group-by remote_addr
三、ELK Stack方案 1. Filebeat配置示例:
filebeat.inputs:
- type: log
paths:
- /var/log/nginx/*.log
json.keys_under_root: true
json.add_error_key: true
output.elasticsearch:
hosts: ["elasticsearch:9200"]
- 状态码分布饼图 - 请求速率时间序列 - 响应时间百分位图 - 地理IP分布图
四、Prometheus监控方案 1. Nginx Exporter配置:
scrape_configs:
- job_name: 'nginx'
static_configs:
- targets: ['nginx-exporter:9113']
- nginx_http_requests_total - nginx_http_request_duration_seconds - nginx_upstream_response_length
五、关键告警规则 1. 错误率告警(5分钟内5xx错误>5%):
sum(rate(nginx_http_requests_total{status=~"5.."}[5m])) by (host)
/
sum(rate(nginx_http_requests_total[5m])) by (host)
> 0.05
histogram_quantile(0.99, sum(rate(nginx_http_request_duration_seconds_bucket[5m])) by (le, host)) > 2
六、日志分析脚本示例 1. 异常IP检测:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 20
awk '{print $NF}' /var/log/nginx/access.log | grep rt= | cut -d= -f2 | sort -n | awk '
BEGIN {
sum = 0
p50 = 0
p95 = 0
p99 = 0
}
NR == 1 { min = $1 }
{ sum += $1; arr[NR] = $1 }
END {
printf "Min: %.3fs\n", min
printf "Max: %.3fs\n", arr[NR]
printf "Avg: %.3fs\n", sum/NR
printf "P50: %.3fs\n", arr[int(NR*0.50)]
printf "P95: %.3fs\n", arr[int(NR*0.95)]
printf "P99: %.3fs\n", arr[int(NR*0.99)]
}'
七、进阶建议 1. 结构化日志: - 使用JSON格式日志输出 - 添加自定义业务标签(如用户ID、API版本等)
- 对健康检查请求降低日志级别 - 对静态资源请求单独记录日志
- 使用logrotate进行日志轮转 - 对历史日志进行压缩归档
通过以上方案组合,可以实现从基础监控到深度分析的完整监控体系。建议根据实际业务规模选择适合的方案组合,中小规模网站可采用GoAccess+脚本方案,大规模分布式系统建议采用ELK+Prometheus的全套方案。