生产环境源码安装Nginx高可用集群需结合Keepalived实现VIP漂移:编译启用ssl、stub_status、stream、realip模块,统一安装路径;双节点独立配置、隔离路径;Keepalived配置主备角色、健康检查及内网VIP;须验证故障转移并同步时间。

在生产环境中用源码安装 Nginx 并构建高可用集群,核心不是只装好 Nginx,而是让它能自动故障转移、不单点失效。关键靠 Nginx + Keepalived 组合实现虚拟 IP(VIP)漂移,主挂了备立刻顶上,业务无感。
源码编译 Nginx 要带关键模块
生产环境不能只跑 HTTP,得预留扩展能力:
- --with-http_ssl_module:必须开启,HTTPS 是生产标配
- --with-http_stub_status_module:暴露 /status 接口,便于监控连接数、请求率等指标
- --with-stream:四层负载均衡必需,支持 TCP/UDP 透传(如数据库、Redis 代理)
- --with-http_realip_module:当 Nginx 前还有 CDN 或云 LB 时,能正确拿到用户真实 IP
- 安装路径统一设为 --prefix=/usr/local/nginx,避免混入系统目录,方便后续多实例管理
部署双节点 Nginx 实例并隔离配置
主从 Nginx 不是简单复制文件,要确保独立运行、互不影响:
- 两台服务器分别编译安装,使用相同版本和模块,但 配置文件路径、日志路径、pid 文件路径全部区分(例如主用 /usr/local/nginx/conf/nginx-main.conf,备用 nginx-backup.conf)
- 反向代理后端服务(如 Tomcat)建议部署在独立机器或容器中,避免 Nginx 主机宕机连带压垮应用节点
- 两个 Nginx 的 server_name、监听端口、upstream 分组保持一致,仅 keepalived 角色不同
- 关闭 SELinux 和防火墙:
setenforce 0、systemctl stop firewalld && systemctl disable firewalld
Keepalived 配置主备切换逻辑
Keepalived 不只是绑定 VIP,还要主动检查 Nginx 健康状态:
- 主节点
state MASTER,priority 设为 100;备节点state BACKUP,priority 设为 90 - virtual_router_id 必须相同(如 51),且同一局域网内唯一,否则 VRRP 报文冲突
- 务必注释掉
vrrp_strict—— 它会限制 VRRP 在非直连网络工作,测试环境常因此导致 VIP 不生效 - 添加健康检查脚本:用
kill -0 $(cat /usr/local/nginx/logs/nginx.pid)判断 Nginx 进程是否存在,失败则降权触发切换 - VIP 建议用内网地址(如 192.168.200.100),避免公网 IP 漂移引发 DNS 缓存问题
验证与日常维护要点
上线前必须模拟故障,不能只看 VIP 是否出现:
- 启动 keepalived 后执行
ip a,确认 VIP 出现在主节点的网卡上 - 从客户端 ping VIP,再 curl 测试接口,确认流量走通
- 手动 kill 主节点 Nginx 进程,等待约 3 秒,观察 VIP 是否自动迁移到备节点(
ip a再查) - keepalived 日志默认输出到
/var/log/messages,出问题第一时间查它 - 定期检查两节点时间同步(
chronyd或ntpd),VRRP 对时钟偏差敏感


















