1. 高可用集群架构设计原理
Nginx+Keepalived高可用集群的核心价值在于解决单点故障问题,确保Web服务持续可用。这套架构通过虚拟IP(VIP)机制和健康检查实现了故障自动转移,其设计哲学可以概括为"冗余+自动切换"。
在典型的生产环境中,我们通常会部署两台Nginx服务器组成主备集群。主节点正常工作时,所有流量通过VIP指向主节点;当主节点发生故障时,Keepalived会在秒级(通常1-3秒)内检测到异常,并将VIP自动漂移到备用节点。这种切换对前端用户完全透明,不会导致服务中断。
关键设计要点:VIP必须与物理服务器IP处于同一网段,且需要确保网络环境中没有IP冲突。实际部署时建议使用192.168.x.x或10.x.x.x这类内网地址段。
2. 环境准备与拓扑规划
2.1 基础环境配置
建议使用以下IP规划方案:
- 主Nginx节点:192.168.1.101
- 备Nginx节点:192.168.1.102
- 虚拟IP(VIP):192.168.1.100
- Tomcat应用服务器:192.168.1.201-192.168.1.204(根据业务规模可扩展)
所有节点需要确保:
- 关闭SELinux:
setenforce 0 - 配置时间同步:
yum install -y ntpdate && ntpdate time.nist.gov - 配置主机名解析:
/etc/hosts中添加所有节点IP与主机名映射
2.2 网络拓扑验证
使用以下命令验证网络连通性:
# 在各节点执行ping测试 ping -c 4 192.168.1.101 ping -c 4 192.168.1.102 ping -c 4 192.168.1.201 # 检查防火墙规则 iptables -L -n | grep 803. Nginx负载均衡配置详解
3.1 编译安装优化版Nginx
推荐使用以下编译参数获取最佳性能:
./configure \ --prefix=/usr/local/nginx \ --user=nginx \ --group=nginx \ --with-http_ssl_module \ --with-http_realip_module \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --with-pcre \ --with-stream \ --with-file-aio \ --with-threads \ --with-http_v2_module3.2 负载均衡策略对比
Nginx支持多种负载均衡算法,实际测试数据对比如下:
| 算法类型 | 描述 | 适用场景 | 性能影响 |
|---|---|---|---|
| 轮询(rr) | 默认方式,按时间顺序分配 | 后端服务器性能均衡 | 低 |
| 权重(weight) | 按配置的权重分配 | 服务器配置不均 | 低 |
| ip_hash | 按访问IP的hash结果分配 | 需要会话保持 | 中 |
| least_conn | 最少连接数优先 | 长连接服务 | 中 |
| url_hash | 按访问URL的hash结果分配 | 缓存服务器 | 高 |
3.3 生产级nginx.conf配置
upstream tomcat_cluster { least_conn; server 192.168.1.201:8080 weight=5 max_fails=3 fail_timeout=30s; server 192.168.1.202:8080 weight=5 max_fails=3 fail_timeout=30s; server 192.168.1.203:8080 weight=3 max_fails=3 fail_timeout=30s; keepalive 32; } server { listen 80 reuseport; server_name example.com; # 启用0-RTT TLSv1.3 ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; location / { proxy_pass http://tomcat_cluster; proxy_http_version 1.1; proxy_set_header Connection ""; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 超时设置 proxy_connect_timeout 3s; proxy_read_timeout 15s; proxy_send_timeout 10s; } # 健康检查接口 location /nginx_status { stub_status; access_log off; allow 192.168.1.0/24; deny all; } }4. Keepalived高可用实现
4.1 主备节点配置差异
主节点配置关键参数:
global_defs { router_id nginx_master } vrrp_instance VI_1 { state MASTER priority 100 # 必须高于备节点 virtual_ipaddress { 192.168.1.100/24 dev eth0 label eth0:1 } }备节点配置关键参数:
global_defs { router_id nginx_backup } vrrp_instance VI_1 { state BACKUP priority 90 # 必须低于主节点 virtual_ipaddress { 192.168.1.100/24 dev eth0 label eth0:1 } }4.2 健康检查脚本优化
改进版检查脚本/usr/local/bin/check_nginx.sh:
#!/bin/bash # 增加curl检查确保Nginx真正可用 if ! curl -I http://localhost -m 3 >/dev/null 2>&1; then systemctl restart nginx sleep 3 if ! curl -I http://localhost -m 3 >/dev/null 2>&1; then pkill -9 keepalived fi fi设置可执行权限并测试:
chmod +x /usr/local/bin/check_nginx.sh /usr/local/bin/check_nginx.sh echo $? # 返回0表示正常5. 高级调优与故障排查
5.1 内核参数优化
在/etc/sysctl.conf中添加:
# 最大文件描述符 fs.file-max = 655350 # 端口范围 net.ipv4.ip_local_port_range = 1024 65000 # 启用TCP快速回收 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 # 最大SYN队列 net.ipv4.tcp_max_syn_backlog = 262144 # 保持连接时间 net.ipv4.tcp_keepalive_time = 600应用配置:sysctl -p
5.2 常见故障排查表
| 故障现象 | 排查命令 | 可能原因 | 解决方案 |
|---|---|---|---|
| VIP不生效 | ip addr show | 防火墙阻止VRRP协议 | iptables -I INPUT -p vrrp -j ACCEPT |
| Nginx不转发 | curl -v http://localhost | upstream配置错误 | 检查nginx -t输出 |
| 主备不同步 | journalctl -u keepalived | 认证配置不一致 | 检查auth_pass值 |
| 脑裂问题 | tcpdump -i eth0 vrrp | 网络隔离 | 配置多播检测 |
6. 安全加固措施
- Nginx安全配置:
server_tokens off; add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block";- Keepalived安全配置:
vrrp_instance VI_1 { authentication { auth_type AH # 改用AH认证 auth_pass Secr3tP@ss } unicast_src_ip 192.168.1.101 # 主节点IP unicast_peer { 192.168.1.102 # 备节点IP } }- 定期维护建议:
- 每月进行故障转移演练
- 每季度更新SSL证书
- 实时监控VIP状态和Nginx负载
在实际生产环境中,我们曾遇到一个典型问题:当主节点负载过高时,虽然Nginx仍在运行,但响应变慢导致健康检查失败。解决方案是在检查脚本中增加响应时间阈值判断,避免不必要的故障转移。这个案例告诉我们,高可用配置需要根据实际业务特点进行针对性调整。