每天早上醒来,最怕的就是收到监控报警短信,线上服务挂了,等着打工人去救火。尤其是在流量高峰期,单个节点的故障很容易导致服务雪崩。今天,我们来聊聊如何利用 Nginx 搭建高可用架构,避免类似打工人日报#20250930 中描述的悲剧重演,让大家也能稍微喘口气。
Nginx 高可用架构原理深度剖析
反向代理与负载均衡
Nginx 的核心功能之一就是反向代理,它可以将客户端的请求转发到后端的多个服务器上。而负载均衡则是在反向代理的基础上,将流量均匀地分配到不同的后端服务器,从而提高整体的吞吐量和可用性。常见的负载均衡算法包括轮询、加权轮询、IP Hash 等。
健康检查机制
仅仅做负载均衡是不够的,我们需要确保后端服务器是健康的。Nginx 提供了健康检查机制,定期探测后端服务器的状态,如果发现服务器不可用,则将其从负载均衡列表中移除,避免将流量转发到故障节点。当服务器恢复正常后,Nginx 会自动将其重新加入负载均衡列表。
Keepalived 与虚拟 IP
为了实现 Nginx 本身的高可用,我们可以使用 Keepalived。Keepalived 基于 VRRP 协议,可以实现多个 Nginx 节点之间的故障转移。通过配置虚拟 IP (VIP),当主 Nginx 节点宕机时,Keepalived 会自动将 VIP 切换到备用节点,从而保证服务的连续性。
实战:基于 Nginx 和 Keepalived 搭建高可用 Web 服务
1. Nginx 安装与配置
首先,在两台服务器上安装 Nginx。以 CentOS 为例:
yum install -y nginx
然后,配置 Nginx 的反向代理和负载均衡。例如,将请求转发到两个后端的 Tomcat 服务器:
http {
upstream backend {
server 192.168.1.101:8080 weight=5; # Tomcat 服务器 1
server 192.168.1.102:8080 weight=5; # Tomcat 服务器 2
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend; # 转发到后端 upstream
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
2. Keepalived 安装与配置
在两台服务器上安装 Keepalived:
yum install -y keepalived
配置主 Nginx 节点(192.168.1.110):
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh" # 健康检查脚本
interval 2 # 间隔时间,单位秒
weight -20 # 权重,如果脚本返回错误,则降低权重
}
vrrp_instance VI_1 {
state MASTER # 初始状态为主节点
interface eth0 # 网络接口
virtual_router_id 51 # VRRP 路由 ID,需要保持一致
priority 100 # 优先级,主节点优先级较高
advert_int 1 # 广播间隔,单位秒
authentication {
auth_type PASS
auth_pass 1111 # 认证密码
}
virtual_ipaddress {
192.168.1.100 # 虚拟 IP
}
track_script {
chk_nginx # 引用健康检查脚本
}
}
配置备 Nginx 节点(192.168.1.111):
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh" # 健康检查脚本
interval 2 # 间隔时间,单位秒
weight -20 # 权重,如果脚本返回错误,则降低权重
}
vrrp_instance VI_1 {
state BACKUP # 初始状态为备节点
interface eth0 # 网络接口
virtual_router_id 51 # VRRP 路由 ID,需要保持一致
priority 90 # 优先级,备节点优先级较低
advert_int 1 # 广播间隔,单位秒
authentication {
auth_type PASS
auth_pass 1111 # 认证密码
}
virtual_ipaddress {
192.168.1.100 # 虚拟 IP
}
track_script {
chk_nginx # 引用健康检查脚本
}
}
创建健康检查脚本 /etc/keepalived/check_nginx.sh:
#!/bin/bash
nginx_pid=`pidof nginx`
if [ -z "$nginx_pid" ]; then
exit 1
else
exit 0
fi
3. 启动服务
分别启动 Nginx 和 Keepalived 服务:
systemctl start nginx
systemctl start keepalived
实战避坑经验总结
- 防火墙配置:确保服务器的防火墙允许 Nginx 和 Keepalived 的流量通过,否则可能会导致服务不可用。
- 健康检查脚本:健康检查脚本需要足够健壮,能够准确判断 Nginx 的状态。避免误判导致频繁的故障转移。
- 会话保持:如果后端服务需要会话保持,可以考虑使用 Nginx 的 IP Hash 负载均衡算法,或者使用 Redis 等外部存储来共享会话。
- 日志监控:配置 Nginx 的日志,并使用 ELK 等工具进行监控,以便及时发现和解决问题。
- 性能优化:根据实际情况调整 Nginx 的 worker 进程数、连接超时时间等参数,以提高性能。宝塔面板是一个方便的可视化管理工具,可以简化 Nginx 的配置和管理。
通过以上方法,我们就可以搭建一个高可用的 Web 服务,降低服务宕机的风险,减少打工人的焦虑。希望这些经验能够帮助大家更好地应对线上问题。
冠军资讯
代码一只喵