Nginx结合ELK构建5xx监控的核心是打通日志格式—采集解析—结构化存储—多维聚合—分级告警全链路;关键启用$upstream_status记录真实后端状态码,Filebeat直解析JSON并打标上下文,Kibana按upstream_status/upstream_addr/host+path多维下钻分析,Kibana Alerting基于upstream_status匹配50[234]配置带静默期的精准告警。

Nginx 结合 ELK 构建负载均衡实时流量监控与 5xx 状态码大盘,核心不在堆组件,而在打通“日志格式—采集解析—结构化存储—多维聚合—分级告警”这条数据链。关键要让 5xx 不只是数字,而是可定位、可归因、可响应的信号。
一、确保 Nginx 日志输出真实上游状态码
默认 $status 是返回给客户端的状态,可能被错误页重写掩盖问题。必须启用并记录 $upstream_status,它反映后端真实响应。
在 http 块中定义专用日志格式:
log_format upstream_json '{"@timestamp":"$time_iso8601",'
'"remote_addr":"$remote_addr",'
'"host":"$host",'
'"request":"$request",'
'"status":$status,'
'"upstream_status":$upstream_status,'
'"upstream_addr":"$upstream_addr",'
'"request_time":$request_time,'
'"upstream_response_time":$upstream_response_time,'
'"http_referer":"$http_referer",'
'"http_user_agent":"$http_user_agent"}';
然后在 upstream 或 location 中启用:
access_log /var/log/nginx/upstream.log upstream_json;
这样每条日志都是标准 JSON,后续无需 grok 解析,直接由 Filebeat 解码。
二、用 Filebeat 直接解析 JSON 并打标集群上下文
避免 Logstash 做繁重解析,让 Filebeat 承担轻量预处理:
- 启用
decode_json_fields提取message字段为顶层字段 - 用
add_kubernetes_metadata自动注入 Pod、Namespace、Node 信息(K8s 环境) - 添加自定义字段标记负载均衡角色:
processors:
- add_fields: target: '' fields: nginx_role: "ingress-lb" cluster_env: "prod"
三、Kibana 中构建可下钻的 5xx 监控面板
不只看总数,重点设计以下维度联动:
- 按
upstream_status分桶(区分 502/503/504) - 按
upstream_addr聚合,快速识别异常节点 - 按
host+path关联,定位具体服务或接口路径 - 叠加
upstream_response_time百分位线(p95/p99),判断是否伴随延迟升高
创建一个“5xx 突增检测” Lens 可视化:X 轴为时间,Y 轴为upstream_status: 5*的计数,添加移动平均线(窗口 5 分钟),再叠加一条阈值线(如 10 次/分钟)。点击某高峰点,可下钻查看对应upstream_addr和request样本。
四、设置精准告警避免噪音
直接在 Kibana Alerting 中配置基于 Elasticsearch 查询的规则:
- 触发条件:过去 2 分钟内
upstream_status匹配50[234]的文档数 > 20 - 过滤范围:
nginx_role: "ingress-lb"且cluster_env: "prod" - 告警内容包含:
- 当前突增比例(对比前 10 分钟基线)
- 主要影响的
upstream_addr列表 - 最高频的 3 个
path
- 静默期:同一
upstream_addr5 分钟内不重复通知
这样既避开凌晨批量任务等误报场景,又能对真实故障秒级响应。











