5
0
0
负载均衡+keepalived+vip
文章摘要
|
反向代理
nginx 安装、配置
install (文档:https://nginx.org/en/linux_packages.html#RHEL)
# SELinux 策略 布尔值 on,可以使nginx对外发送请求
sudo setsebool -P httpd_can_network_relay on基础模板
# /etc/nginx/conf.d/myapp.conf 基础模板
server {
listen 80;
server_name 域名/IP;
location / {
proxy_pass http://127.0.0.1:端口号; # 你的web应用暴露的端口号
proxy_set_header Host $host;
proxy_set_header X_Real_IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
client_max_body_size 5m; # 最大传输数据,例如上传图片等,报413错误
}
# ==================== ssl 模板 ======================
server {
listen 80;
server_name 192.168.3.101;
return 301 https://$server_name$request_uri; # http 重定向至 https
}
server {
listen 443 ssl;
server_name 域名/IP;
location / {
proxy_pass http://127.0.0.1:端口号; # 你的web应用暴露的端口号
proxy_set_header Host $host;
proxy_set_header X_Real_IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
client_max_body_size 5m; # 最大传输数据,例如上传图片等,报413错误
}负载均衡
地址池
策略:轮巡、权重、最少连接、固定客户端
# 端口池的名称可自定义
upstream halo_backend {
server ip:端口;
server ip:端口;
}
server {
listen 80;
server_name 192.168.3.101;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name 域名/IP;
location / {
proxy_pass http://halo_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;
}
client_max_body_size 5m;
}实现高可用
本地部署:
阿里云VPC不允许使用VRP广播抢占VIP,可在控制台直接申请一个HAVIP,若想公网暴露,还想绑定一个EIP。
阿里云是老牌负载均衡SLB已停售,现如今有两款产品ALB(应用型)、ELB(网络型),按量收费,费用分为实例费和LCU费,实例费现在优惠一天约莫3元,一个月90+,LCU一个月下来怎么也得几块,抵得上个人ECS一年99元的费用了。个人学习用完即删。
KeepAlived
(本地部署,VRP广播抢占虚拟IP,VRRP协议探测ESC是否存活)
安装keepalived ,直接dnf install -y keepalived
内核开权限(以下操作主备均衡机都需要配置)
让nginx可以绑定一个额外的ip地址
# 1
echo "net.ipv4.ip_nonlocal_bind=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 开端口,避免防火墙阻拦了心跳(本地部署,VRP广播抢占虚拟IP,VRRP协议探测ESC是否存活)
sudo firewall-cmd --permanent --add-rich-rule='rule protocol value="vrrp" accept'
sudo firewall-cmd --reloadnginx 需要反代理一个路由供keepalived探测nginx是否活着
主备机都需要配置,然后就是访问对方的这个路径看是否能返回200
# 主备都需要
server {
listen 80;
server_name localhost;
location = /healthz {
return 200 "OK\n";
add_header Content-Type text/plain;
}
}
# /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_101 # 标识本机,主备要不同(比如 101 用 LVS_101,102 用 LVS_102)
script_user root # 让检查脚本以 root 运行(检查 Nginx 需要)
enable_script_security # 安全加固,只允许 root 运行脚本
}
# 引用你写好的 Nginx 检查脚本
vrrp_script chk_nginx {
script "/etc/keepalived/check-nginx.sh"
interval 5 # 每 5 秒检查一次
weight -20 # 检查失败,优先级减 20
fall 2 # 连续失败 2 次才算真挂
rise 2 # 连续成功 2 次才算恢复
}
vrrp_instance VI_1 {
state MASTER # 101 写 MASTER,102 写 BACKUP
interface ens33 # 换成你的真实网卡名(用 ip addr 查)
virtual_router_id 51 # 主备必须完全一致(0-255)
priority 100 # 101 写 100,102 写 90
advert_int 1 # 心跳间隔 1 秒
authentication {
auth_type PASS
auth_pass 123456 # 主备密码必须一致
}
virtual_ipaddress {
192.168.3.100/24 # 你计划使用的 VIP
}
track_script {
chk_nginx # 关联上面的检查脚本
}
}探测脚本
/etc/keepalived/check-nginx.sh,代码第一行别忘了,定义脚本的。根据退出码判断对方是否宕机。
#!/bin/bash
if curl -s --connect-timeout 3 -m 5 http://127.0.0.1/healthz >/dev/null 2>&1; then
exit 0
fi
systemctl try-restart nginx >/dev/null 2>&1
sleep 2
if curl -s --connect-timeout 3 -m 5 http://127.0.0.1/healthz >/dev/null 2>&1; then
exit 0
fi
exit 1线上版,自建
待补充
线上版(ALB,ELB)
待补充

