Nginx+Keepalived构建的是高可用日志接入层,非处理引擎:Nginx统一接收请求并输出结构化JSON日志,Keepalived通过VIP漂移保障入口不中断,真实日志处理由Fluentd/Logstash+Kafka/ES完成。

Nginx 本身不直接处理日志分析或日志存储,它只负责生成访问日志(access log)和错误日志(error log)。所谓“Nginx 与 Keepalived 构建高可用日志处理集群”,实际是指:用 Keepalived 保障 Nginx 日志采集入口的高可用,再将日志可靠转发至后端日志处理系统(如 Fluentd、Logstash、Filebeat + Kafka/Elasticsearch)。真正的日志“处理”发生在下游,Nginx + Keepalived 的角色是高可用日志接入层。
下面从真实生产视角,讲清楚怎么搭、为什么这么搭、关键避坑点在哪:
一、明确架构定位:Nginx 是日志“入口网关”,不是处理引擎
Nginx 在这里承担两个核心职责:
- 作为反向代理或 API 网关,统一接收业务服务的 HTTP 请求,并写入标准化 access_log(含时间、URI、状态码、响应时长、客户端 IP 等);
- 利用
log_format和access_log指令,将日志格式化为结构化 JSON(例如log_format json '{"time":"$time_iso8601","host":"$host","uri":"$uri","status":$status,"bytes":$body_bytes_sent}';),便于下游解析; - 不做日志聚合、过滤、转换——这些交给 Fluentd 或 Logstash 做。
Keepalived 的作用就是确保这个日志入口永不单点:当主 Nginx 节点宕机、网络中断或进程崩溃时,VIP 自动漂移到备节点,业务侧无感知,日志采集链路不断。
二、部署要点:两台 Nginx 节点必须完全对等
- 两台服务器(如 192.168.5.10 / 192.168.5.11)均安装相同版本 Nginx + Keepalived;
- Nginx 配置完全一致(包括
log_format、access_log路径、upstream、server块),且日志目录需挂载同一共享存储(如 NFS)或配置 rsync 同步(推荐用inotifywait + rsync实时同步日志文件,避免丢日志); - 若使用本地磁盘,必须确保两节点日志路径、权限、rotate 策略(logrotate)完全一致,否则 VIP 切换后日志路径错位会导致采集失败;
- 所有业务服务把日志上报地址指向 VIP(如
192.168.5.100),而非具体 Nginx IP。
三、Keepalived 配置要监控 Nginx 进程 + 端口 + 日志写入能力
不能只靠 VRRP 心跳,必须叠加健康检查脚本,否则 Nginx 进程僵死但 Keepalived 仍认为“活着”。示例检测脚本 /etc/keepalived/check_nginx.sh:
- 检查
nginx -t配置是否合法; -
curl -s --connect-timeout 2 http://127.0.0.1/healthz返回 200(需在 Nginx 中配一个轻量 healthz location); -
tail -n1 /var/log/nginx/access.log 2>/dev/null | grep -q "$(date '+%Y-%m-%d')" || exit 1(验证日志仍在实时写入); - 脚本返回非 0,Keepalived 触发权重下降,触发主备切换。
四、日志采集链路必须解耦且具备缓冲能力
- Nginx 日志写入后,由 Filebeat 或 Fluentd 客户端监听该文件(注意 use
tail_mode: true+close_inactive防止句柄泄漏); - Filebeat 输出到 Kafka(而非直连 ES),Kafka 作为缓冲队列,应对下游(Logstash/ES)短暂不可用;
- Kafka topic 设置多副本(
replication.factor=3)、至少 2 个分区,保证消息不丢失; - 不建议让 Keepalived 直接管理日志处理进程(如重启 Filebeat),那是下游系统的职责。
这样一套组合下来,即使一台 Nginx 服务器整机宕机,VIP 秒级漂移,日志采集路径自动切换,下游 Kafka 持续收数,整个日志链路 RTO < 3 秒,满足大多数企业级可观测性 SLA 要求。


















