【Nginx】------3台nginx集群+HA高可用keepalived
·
一、环境规划
| 节点IP | 角色 | 软件版本(建议) | 安装路径 |
|---|---|---|---|
| 192.168.48.128 | Nginx+Keepalived(MASTER) | Nginx 1.24.0、Keepalived 2.2.7 | /usr/allsoft/nginx、/usr/allsoft/keepalived |
| 192.168.48.130 | Nginx+Keepalived(BACKUP1) | 同上 | 同上 |
| 192.168.48.131 | Nginx+Keepalived(BACKUP2) | 同上 | 同上 |
| 虚拟IP(VIP) | 对外提供服务的统一入口 | - | - |
二、前置准备(所有节点执行)
1. 依赖安装
# 更新源并安装编译依赖
apt update && apt install -y gcc g++ make libpcre3 libpcre3-dev zlib1g zlib1g-dev openssl libssl-dev libnl-3-dev libnl-genl-3-dev net-tools
2. 创建安装目录
mkdir -p /usr/allsoft/{nginx,keepalived}
mkdir -p /usr/allsoft/nginx/{conf,logs,html,sbin}
mkdir -p /usr/allsoft/keepalived/{conf,logs,sbin}
三、Nginx 编译安装与配置(所有节点)
1. 下载并解压Nginx
cd /tmp
wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0
2. 编译安装(指定路径)
./configure \
--prefix=/usr/allsoft/nginx \
--conf-path=/usr/allsoft/nginx/conf/nginx.conf \
--error-log-path=/usr/allsoft/nginx/logs/error.log \
--http-log-path=/usr/allsoft/nginx/logs/access.log \
--pid-path=/usr/allsoft/nginx/logs/nginx.pid \
--lock-path=/usr/allsoft/nginx/logs/nginx.lock \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-stream
make && make install
3. 验证安装
/usr/allsoft/nginx/sbin/nginx -v
# 输出 nginx version: nginx/1.24.0 则安装成功
4. Nginx 核心配置(所有节点统一)
编辑 /usr/allsoft/nginx/conf/nginx.conf:
user root;
worker_processes auto; # 自动匹配CPU核心数
error_log /usr/allsoft/nginx/logs/error.log warn;
pid /usr/allsoft/nginx/logs/nginx.pid;
events {
worker_connections 10240; # 提高连接数
use epoll; # 高性能IO模型
}
# HTTP层配置(转发到Java Gateway集群)
http {
include /usr/allsoft/nginx/conf/mime.types;
default_type application/octet-stream;
# 日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /usr/allsoft/nginx/logs/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# 开启gzip压缩
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_vary on;
# Java Gateway集群上游配置(替换为实际Gateway节点IP:端口)
upstream gateway_cluster {
server 192.168.48.xxx:8080 weight=10 max_fails=3 fail_timeout=30s;
server 192.168.48.yyy:8080 weight=10 max_fails=3 fail_timeout=30s;
server 192.168.48.zzz:8080 weight=10 max_fails=3 fail_timeout=30s;
ip_hash; # 可选:会话粘滞(根据业务需求选择,无状态服务可改用round_robin)
keepalive 32; # 长连接优化
}
# 虚拟主机配置
server {
listen 80;
server_name localhost; # 可替换为实际域名(如api.xxx.com)
# 健康检查接口(可选)
location /health {
access_log off;
return 200 "ok\n";
}
# 反向代理到Gateway集群
location / {
proxy_pass http://gateway_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 长连接配置
proxy_http_version 1.1;
proxy_set_header Connection "";
# 超时配置
proxy_connect_timeout 5s;
proxy_send_timeout 10s;
proxy_read_timeout 30s;
# 缓冲区配置
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
}
# 错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/allsoft/nginx/html;
}
}
}
5. 启动Nginx并设置自启
# 启动Nginx
/usr/allsoft/nginx/sbin/nginx
# 验证启动
netstat -tulpn | grep nginx
# 输出 0.0.0.0:80 监听则成功
# 创建systemd服务(实现自启)
cat > /etc/systemd/system/nginx.service << EOF
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/allsoft/nginx/logs/nginx.pid
ExecStart=/usr/allsoft/nginx/sbin/nginx -c /usr/allsoft/nginx/conf/nginx.conf
ExecReload=/usr/allsoft/nginx/sbin/nginx -s reload
ExecStop=/usr/allsoft/nginx/sbin/nginx -s stop
PrivateTmp=true
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
EOF
# 重载systemd并设置自启
systemctl daemon-reload
systemctl enable nginx
四、Keepalived 编译安装与高可用配置
1. 下载并解压Keepalived(所有节点)
cd /tmp
wget https://www.keepalived.org/software/keepalived-2.2.7.tar.gz
tar -zxvf keepalived-2.2.7.tar.gz
cd keepalived-2.2.7
2. 编译安装(所有节点)
./configure \
--prefix=/usr/allsoft/keepalived \
--sysconf=/usr/allsoft/keepalived/conf \
--with-log-file=/usr/allsoft/keepalived/logs/keepalived.log
make && make install
3. 配置Keepalived(区分节点)
(1)主节点(192.168.48.128)配置
编辑 /usr/allsoft/keepalived/conf/keepalived.conf:
! Configuration File for keepalived
global_defs {
router_id NGINX_MASTER # 唯一标识(如NGINX_128)
script_user root
enable_script_security
}
# 监控Nginx状态的脚本
vrrp_script check_nginx {
script "/usr/allsoft/keepalived/check_nginx.sh" # 脚本路径
interval 2 # 每2秒检查一次
weight -20 # 检查失败则优先级减20
fall 3 # 连续3次失败触发
rise 2 # 连续2次成功恢复
}
# VRRP实例配置
vrrp_instance VI_1 {
state MASTER # 主节点
interface ens33 # 网卡名称(通过ip addr查看,如ens33/eth0)
virtual_router_id 51 # 虚拟路由ID(1-255,所有节点一致)
priority 100 # 优先级(主节点最高,备节点依次降低)
advert_int 1 # 心跳间隔1秒
nopreempt # 非抢占模式(可选,避免主节点恢复后抢占VIP)
# 认证配置(所有节点一致)
authentication {
auth_type PASS
auth_pass 1111 # 密码(自定义)
}
# 虚拟IP(VIP,可配置多个,用空格分隔)
virtual_ipaddress {
192.168.48.200/24 dev ens33 label ens33:0 # VIP/子网掩码 网卡:别名
}
# 调用Nginx监控脚本
track_script {
check_nginx
}
# 主节点故障转移时执行的脚本(可选)
notify_master "/usr/allsoft/keepalived/notify.sh master"
notify_backup "/usr/allsoft/keepalived/notify.sh backup"
notify_fault "/usr/allsoft/keepalived/notify.sh fault"
}
(2)备节点1(192.168.48.130)配置
编辑 /usr/allsoft/keepalived/conf/keepalived.conf:
! Configuration File for keepalived
global_defs {
router_id NGINX_BACKUP1 # 唯一标识(如NGINX_130)
script_user root
enable_script_security
}
vrrp_script check_nginx {
script "/usr/allsoft/keepalived/check_nginx.sh"
interval 2
weight -20
fall 3
rise 2
}
vrrp_instance VI_1 {
state BACKUP # 备节点
interface ens33
virtual_router_id 51
priority 90 # 优先级低于主节点
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.48.200/24 dev ens33 label ens33:0
}
track_script {
check_nginx
}
notify_master "/usr/allsoft/keepalived/notify.sh master"
notify_backup "/usr/allsoft/keepalived/notify.sh backup"
notify_fault "/usr/allsoft/keepalived/notify.sh fault"
}
(3)备节点2(192.168.48.131)配置
仅需修改:
router_id NGINX_BACKUP2priority 80(优先级低于备节点1)
其余同备节点1。
4. 编写Nginx监控脚本(所有节点)
创建 /usr/allsoft/keepalived/check_nginx.sh:
#!/bin/bash
NGINX_PID=$(ps -ef | grep nginx | grep -v grep | grep -v keepalived | awk '{print $2}')
if [ -z "$NGINX_PID" ]; then
# Nginx未运行,尝试重启
/usr/allsoft/nginx/sbin/nginx
sleep 2
NGINX_PID=$(ps -ef | grep nginx | grep -v grep | grep -v keepalived | awk '{print $2}')
if [ -z "$NGINX_PID" ]; then
# 重启失败,停止keepalived(释放VIP)
/usr/allsoft/keepalived/sbin/keepalived -s stop
exit 1
fi
fi
exit 0
添加执行权限:
chmod +x /usr/allsoft/keepalived/check_nginx.sh
5. 编写通知脚本(可选,所有节点)
创建 /usr/allsoft/keepalived/notify.sh(用于日志/告警):
#!/bin/bash
LOG_FILE="/usr/allsoft/keepalived/logs/notify.log"
DATE=$(date +"%Y-%m-%d %H:%M:%S")
VIP="192.168.48.200"
ROLE=$1
echo "[$DATE] Node $(hostname -I | awk '{print $1}') role change to $ROLE, VIP: $VIP" >> $LOG_FILE
# 可选:添加邮件/钉钉/短信告警逻辑
# 例如发送邮件:
# echo "Nginx集群VIP切换,当前节点:$(hostname -I | awk '{print $1}'),角色:$ROLE" | mail -s "Keepalived VIP切换告警" admin@xxx.com
添加执行权限:
chmod +x /usr/allsoft/keepalived/notify.sh
6. 启动Keepalived并设置自启
# 启动Keepalived
/usr/allsoft/keepalived/sbin/keepalived -f /usr/allsoft/keepalived/conf/keepalived.conf
# 验证启动
ps -ef | grep keepalived
# 输出keepalived进程则成功
# 验证VIP(主节点应能看到VIP)
ip addr | grep 192.168.48.200
# 创建systemd服务
cat > /etc/systemd/system/keepalived.service << EOF
[Unit]
Description=Keepalived for Nginx High Availability
After=network.target nginx.service
[Service]
Type=forking
ExecStart=/usr/allsoft/keepalived/sbin/keepalived -f /usr/allsoft/keepalived/conf/keepalived.conf
ExecReload=/usr/allsoft/keepalived/sbin/keepalived -r
ExecStop=/usr/allsoft/keepalived/sbin/keepalived -s stop
PrivateTmp=true
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
EOF
# 重载systemd并设置自启
systemctl daemon-reload
systemctl enable keepalived
五、集群验证
1. 基础验证
# 所有节点检查Nginx和Keepalived状态
systemctl status nginx
systemctl status keepalived
# 主节点检查VIP
ip addr | grep 192.168.48.200
# 访问VIP测试转发
curl http://192.168.48.200/health
# 输出 "ok" 则Nginx转发正常
# 访问Gateway接口(替换为实际接口)
curl http://192.168.48.200/api/test
# 输出Gateway返回结果则转发成功
2. 故障转移验证
# 停止主节点(128)的Nginx
systemctl stop nginx
# 观察备节点1(130)是否接管VIP
ip addr | grep 192.168.48.200 # 130节点应显示VIP
# 恢复主节点Nginx
systemctl start nginx
# 非抢占模式下,VIP仍在130;抢占模式下会切回128(根据配置)
# 停止主节点Keepalived
systemctl stop keepalived
# 验证VIP切换到备节点
六、优化与注意事项
- 防火墙配置:开放80端口和VRRP协议(Keepalived心跳):
ufw allow 80/tcp ufw allow proto vrrp from 192.168.48.0/24 # 仅允许集群内网VRRP通信 ufw reload - 日志轮转:配置logrotate避免日志过大(示例):
cat > /etc/logrotate.d/nginx << EOF /usr/allsoft/nginx/logs/*.log { daily rotate 7 compress delaycompress missingok notifempty create 0640 root root } EOF - Gateway健康检查:Nginx可通过
proxy_next_upstream配置自动跳过故障Gateway节点:location / { proxy_pass http://gateway_cluster; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; } - SSL配置:如需HTTPS,在Nginx中添加SSL证书配置(监听443端口):
server { listen 443 ssl; server_name api.xxx.com; ssl_certificate /usr/allsoft/nginx/conf/cert.pem; ssl_certificate_key /usr/allsoft/nginx/conf/key.pem; # 其余配置同80端口 } - 性能调优:根据服务器配置调整Nginx的
worker_processes、worker_connections,Keepalived的priority和advert_int。
七、目录结构总结
/usr/allsoft/
├── nginx/
│ ├── conf/ # 配置文件
│ ├── logs/ # 日志
│ ├── html/ # 静态页面
│ └── sbin/ # 可执行文件
└── keepalived/
├── conf/ # 配置文件
├── logs/ # 日志
├── sbin/ # 可执行文件
├── check_nginx.sh # 监控脚本
└── notify.sh # 通知脚本
通过以上配置,实现了3台Nginx的高可用集群(Keepalived+VIP),并将请求反向代理到Java Gateway分布式集群,具备故障自动切换、节点健康检查、会话管理(可选)等能力,满足生产级高可用需求。
更多推荐
所有评论(0)