一、环境规划

节点IP角色软件版本(建议)安装路径
192.168.48.128Nginx+Keepalived(MASTER)Nginx 1.24.0、Keepalived 2.2.7/usr/allsoft/nginx、/usr/allsoft/keepalived
192.168.48.130Nginx+Keepalived(BACKUP1)同上同上
192.168.48.131Nginx+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_BACKUP2
  • priority 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切换到备节点

六、优化与注意事项

  1. 防火墙配置:开放80端口和VRRP协议(Keepalived心跳):
    ufw allow 80/tcp
    ufw allow proto vrrp from 192.168.48.0/24 # 仅允许集群内网VRRP通信
    ufw reload
    
  2. 日志轮转:配置logrotate避免日志过大(示例):
    cat > /etc/logrotate.d/nginx << EOF
    /usr/allsoft/nginx/logs/*.log {
        daily
        rotate 7
        compress
        delaycompress
        missingok
        notifempty
        create 0640 root root
    }
    EOF
    
  3. 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;
    }
    
  4. 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端口
    }
    
  5. 性能调优:根据服务器配置调整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分布式集群,具备故障自动切换、节点健康检查、会话管理(可选)等能力,满足生产级高可用需求。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐