在CentOS 7.6系统(2台4核CPU/8G内存)服务器上搭建nginx高可用负载均衡集群,以下是生产环境最佳实践的分步指南和优化建议:
一、架构设计
-
硬件需求
- 至少2台服务器:主节点(Master)和备节点(Backup)
- 虚拟IP(VIP):用于对外提供服务的浮动IP(如192.168.1.150)
-
软件组件
- Nginx:处理HTTP请求并实现负载均衡
- Keepalived:通过VRRP协议实现VIP漂移,保障服务高可用
- 健康检查脚本:监控Nginx进程状态,异常时触发主备切换
-
架构拓扑
+-------------+
| VIP:虚拟IP |
+------+------+
|
+----------------+-------------------+
| |
+-------v-----------+ +-------v-----------+
| Nginx主节点 |<----->| Nginx备用节点 |
| 192.168.1.10 | | 192.168.1.11 |
| (VIP:192.168.1.150)| | (VIP漂移目标) |
+-------+-----------+ +-------+-----------+
| |
| |
+-------v-----------+ +-------v-----------+
| 后端Web服务器 |<----->| 后端Web服务器 |
| 192.168.1.20 | | 192.168.1.21 |
+-------------------+ +-------------------+
二、资源规划
- Nginx负载均衡节点(2台):
nginx1
:IP192.168.1.10
(主节点)nginx2
:IP192.168.1.11
(备用节点)
- 后端Web服务器(示例2台):
web1
:IP192.168.1.20
,端口80
web2
:IP192.168.1.21
,端口80
三、基础环境准备
-
主机名与解析
在两台Nginx节点上执行以下操作:# 修改主机名 hostnamectl set-hostname nginx1 # 在nginx1上执行 hostnamectl set-hostname nginx2 # 在nginx2上执行 # 编辑hosts文件(所有节点都需要配置) echo "192.168.1.10 nginx1" >> /etc/hosts echo "192.168.1.11 nginx2" >> /etc/hosts echo "192.168.1.20 web1" >> /etc/hosts echo "192.168.1.21 web2" >> /etc/hosts
-
时间同步(所有节点)
# 安装并配置NTP yum install ntp -y ntpdate pool.ntp.org systemctl enable ntpd && systemctl start ntpd
-
关闭SELinux
# 关闭防火墙和SELinux(生产环境建议配置安全组) systemctl stop firewalld && systemctl disable firewalld # 关闭SELinux(临时生效) setenforce 0 # 永久关闭 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
-
关闭防火墙
# 关闭防火墙和SELinux(生产环境建议配置安全组) systemctl stop firewalld && systemctl disable firewalld
-
内核参数优化
编辑/etc/sysctl.conf, 编辑好之后执行sysctl -p
使配置生效# 编辑/etc/sysctl.conf,添加以下参数 vm.swappiness = 10 # 减少Swap使用 net.ipv4.tcp_tw_reuse = 1 # 允许重用TIME-WAIT sockets net.ipv4.ip_local_port_range = 1024 65535 # 扩大端口范围 net.ipv4.tcp_max_tw_buckets = 6000 net.core.somaxconn = 32768 net.ipv4.tcp_fin_timeout = 30
四、Nginx安装与配置
-
安装Nginx
# 添加官方仓库 cat > /etc/yum.repos.d/nginx.repo <<EOF [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/ gpgcheck=1 enabled=1 EOF yum install -y nginx systemctl enable nginx && systemctl start nginx
-
负载均衡配置
在两台Nginx节点上编辑配置文件:vi /etc/nginx/nginx.conf
# /etc/nginx/nginx.conf中http块内添加 upstream backend { server 192.168.1.20:80 weight=1 max_fails=3 fail_timeout=30s; server 192.168.1.21:80 weight=1 max_fails=3 fail_timeout=30s; # 可选:配置负载均衡策略(默认轮询) # least_conn; # 最少连接 # ip_hash; # 基于客户端IP哈希 } server { listen 80; server_name _; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
优化参数:
worker_processes 4;
(与CPU核数一致)worker_connections 2048;
(根据内存调整)
-
测试nginx配置
nginx -t # 检查配置语法 systemctl restart nginx
五、Keepalived配置(高可用)
-
安装Keepalived
yum install -y keepalived
-
主节点配置(Master)
# /etc/keepalived/keepalived.conf # 检查Nginx健康状态的脚本 vrrp_script chk_nginx { script "/etc/keepalived/chk_nginx.sh" # 检查Nginx是否运行 interval 2 # 检查间隔(秒) weight -5 # 检查失败时降低优先级 } vrrp_instance VI_1 { state MASTER # 主节点设置为MASTER interface eth0 # 网卡名称(根据实际网络接口修改) virtual_router_id 51 # 路由ID,同一集群需一致 priority 100 # 主节点优先级高于备用节点 advert_int 1 # 广播报文间隔(秒) authentication { auth_type PASS auth_pass 1345 # 验证密码,需与备用节点一致 } virtual_ipaddress { 192.168.1.150/24 # VIP地址 } # 将健康检查与VRRP实例关联 track_script { chk_nginx } }
-
备节点配置(Backup)
state BACKUP priority 90 # 优先级低于主节点
-
健康检查脚本
# /etc/keepalived/chk_nginx.sh #!/bin/bash if ! pgrep -x nginx >/dev/null; then systemctl stop keepalived fi chmod +x /etc/keepalived/chk_nginx.sh
-
启动服务
systemctl enable keepalived && systemctl start keepalived
六、验证与测试
- VIP漂移测试
# 查看VIP绑定情况 ip addr show eth0 | grep "192.168.1.150" # 模拟主节点故障 systemctl stop nginx # 触发Keepalived停止
2.测试高可用性
- 访问VIP:
- 在任意客户端访问
http://192.168.1.150
,应能正常访问后端服务。
- 在任意客户端访问
- 模拟主节点故障:
- 关闭
nginx1
的Nginx服务:systemctl stop nginx
- 确认VIP切换到
nginx2
,且客户端仍能正常访问。
- 关闭
- 恢复主节点:
- 启动
nginx1
的Nginx服务后,VIP会自动切回主节点。
- 启动
七、生产环境优化建议
-
安全配置
- 仅开放必要端口(80/443、VRRP协议端口112)
- 使用HTTPS加密通信(Let’s Encrypt免费证书)
- 配置Nginx限流和WAF规则
-
监控与日志
- 使用Prometheus + Grafana监控Nginx和Keepalived状态
- 配置Logrotate实现日志自动切割
- 启用Nginx主动健康检查(
health_check
模块)
-
性能调优
- 调整TCP缓冲区大小:
net.ipv4.tcp_mem
- 启用HTTP/2和Gzip压缩
- 使用缓存加速静态资源
- 调整TCP缓冲区大小:
八、注意事项
-
硬件资源分配:4核8G环境下,建议单个Nginx实例处理不超过10万并发连接。
-
定期维护:更新SSL证书、备份配置文件、检查日志磁盘空间。
-
灾备演练:每季度模拟主备切换,验证恢复流程。
-
防火墙配置:
- 如果未关闭防火墙,需放行Nginx(80/443端口)、Keepalived(VRRP多播地址
224.0.0.18
或单播通信端口)。
firewall-cmd --permanent --add-port=80/tcp firewall-cmd --permanent --add-port=443/tcp firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="224.0.0.0/4" accept' firewall-cmd --reload
- 如果未关闭防火墙,需放行Nginx(80/443端口)、Keepalived(VRRP多播地址
-
监控与日志:
- 定期检查Nginx日志(
/var/log/nginx/error.log
)和Keepalived日志(/var/log/messages
)。 - 使用工具如
htop
、netstat
监控系统资源和网络连接。
- 定期检查Nginx日志(
-
扩展性:
- 可添加更多Nginx节点或后端Web服务器,只需修改
upstream
配置和Keepalived的优先级设置。
- 可添加更多Nginx节点或后端Web服务器,只需修改
通过上述方案,可实现生产环境下的高可用、高性能Nginx集群,确保服务的连续性和可靠性,满足企业级业务需求。