Nginx Proxy Manager高可用架构设计:双机热备与负载均衡配置

Nginx Proxy Manager高可用架构设计:双机热备与负载均衡配置

【免费下载链接】nginx-proxy-manager Docker container for managing Nginx proxy hosts with a simple, powerful interface 【免费下载链接】nginx-proxy-manager 项目地址: https://gitcode.com/GitHub_Trending/ng/nginx-proxy-manager

你还在为单点故障焦虑吗?7步构建企业级Nginx Proxy Manager集群

当业务依赖Nginx Proxy Manager(NPM)作为流量入口时,单点故障可能导致整个服务中断。本文将系统讲解如何通过双机热备负载均衡实现NPM高可用架构,解决99%企业面临的服务稳定性问题。完成配置后,你将获得:

  • 服务可用性从99.9%提升至99.99%
  • 自动故障转移(RTO<30秒)
  • 流量智能分发与过载保护
  • 数据实时同步与灾备能力

高可用架构设计原理

核心架构图

mermaid

关键技术指标

指标目标值实现方案
系统可用性99.99%双机热备+自动故障转移
故障检测时间<5秒四层TCP+应用层健康检查
故障转移时间<30秒Keepalived+VIP漂移
数据同步延迟<1秒inotify+rsync实时同步
负载均衡算法加权轮询Nginx upstream配置

环境准备与服务器规划

硬件配置建议

节点角色CPU内存存储网络操作系统
NPM节点x24核8GB100GB SSD双网卡Ubuntu 22.04 LTS
数据库节点4核16GB500GB SSD双网卡Ubuntu 22.04 LTS
负载均衡器2核4GB50GB SSD双网卡Ubuntu 22.04 LTS

网络规划表

网络类型子网NPM节点1NPM节点2负载均衡器
业务网192.168.1.0/24192.168.1.11192.168.1.12192.168.1.10(VIP:192.168.1.100)
管理网10.0.0.0/2410.0.0.1110.0.0.1210.0.0.10
数据库网172.16.0.0/24172.16.0.11172.16.0.12-

部署步骤

1. 基础环境配置(所有节点)

# 更新系统并安装依赖
apt update && apt upgrade -y
apt install -y docker.io docker-compose rsync inotify-tools keepalived

# 配置Docker开机自启
systemctl enable --now docker

# 关闭防火墙(生产环境需按需开放端口)
ufw disable

2. 数据库高可用配置

采用主从复制架构,确保NPM配置数据一致性:

# docker-compose.yml (数据库节点)
version: '3'
services:
  db:
    image: jc21/mariadb-aria:latest
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: 'npm_db_root'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm_user'
      MYSQL_PASSWORD: 'npm_pass'
      MARIADB_AUTO_UPGRADE: '1'
      MARIADB_REPLICATION_MODE: 'master'
      MARIADB_REPLICATION_USER: 'repl_user'
      MARIADB_REPLICATION_PASSWORD: 'repl_pass'
    volumes:
      - ./mysql:/var/lib/mysql
    ports:
      - "3306:3306"

3. NPM双节点部署

节点1配置:

# docker-compose.yml (NPM节点1)
version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '443:443'
      - '81:81'
    environment:
      DB_MYSQL_HOST: "172.16.0.10"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm_user"
      DB_MYSQL_PASSWORD: "npm_pass"
      DB_MYSQL_NAME: "npm"
      NODE_ID: "npm-node-1"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

节点2配置:

# docker-compose.yml (NPM节点2)
version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '443:443'
      - '81:81'
    environment:
      DB_MYSQL_HOST: "172.16.0.10"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm_user"
      DB_MYSQL_PASSWORD: "npm_pass"
      DB_MYSQL_NAME: "npm"
      NODE_ID: "npm-node-2"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

4. 数据实时同步配置

使用inotify+rsync实现证书与配置文件同步:

# 在节点1创建同步脚本 sync_npm_data.sh
#!/bin/bash
RSYNC_PASSWORD="sync_pass" /usr/bin/rsync -avz --delete \
  /data/nginx/conf.d/ \
  sync_user@192.168.1.12::npm_data/conf.d/
  
RSYNC_PASSWORD="sync_pass" /usr/bin/rsync -avz --delete \
  /etc/letsencrypt/ \
  sync_user@192.168.1.12::npm_data/letsencrypt/
# 设置inotify监控
inotifywait -m -r -e modify,create,delete /data/nginx/conf.d/ /etc/letsencrypt/ \
  --format '%w%f' | while read file; do
    /root/sync_npm_data.sh
  done

5. 负载均衡配置

创建L4层负载均衡器,实现TCP流量分发:

# /etc/nginx/nginx.conf
stream {
    upstream npm_cluster {
        server 192.168.1.11:80 weight=5 max_fails=3 fail_timeout=30s;
        server 192.168.1.12:80 weight=5 max_fails=3 fail_timeout=30s backup;
        
        # 健康检查配置
        health_check interval=2s timeout=1s rises=2 falls=2;
    }

    server {
        listen 80;
        proxy_pass npm_cluster;
        proxy_protocol on;  # 传递客户端真实IP
    }

    # HTTPS流量配置
    upstream npm_ssl_cluster {
        server 192.168.1.11:443 weight=5 max_fails=3 fail_timeout=30s;
        server 192.168.1.12:443 weight=5 max_fails=3 fail_timeout=30s backup;
        health_check interval=2s timeout=1s rises=2 falls=2;
    }

    server {
        listen 443;
        proxy_pass npm_ssl_cluster;
        proxy_protocol on;
    }
}

6. 双机热备配置(Keepalived)

主节点配置:

# /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        192.168.1.100/24 dev eth0 label eth0:0
    }

    # 健康检查脚本
    track_script {
        check_npm
    }
}

vrrp_script check_npm {
    script "/usr/bin/curl -s -o /dev/null http://localhost:81/health"
    interval 2
    weight -20
    fall 3
    rise 2
}

备节点配置:

# /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        192.168.1.100/24 dev eth0 label eth0:0
    }

    track_script {
        check_npm
    }
}

7. Nginx配置优化

利用NPM自定义配置功能,增强高可用能力:

# /data/nginx/custom/http_top.conf
# 启用上游服务器健康检查
upstream backend_servers {
    server 192.168.1.11:8080;
    server 192.168.1.12:8080 backup;
    
    keepalive 32;  # 连接复用
}

# 配置请求限流
limit_req_zone $binary_remote_addr zone=npm_limit:10m rate=10r/s;

故障模拟与恢复测试

测试场景1:主节点服务中断

# 在主节点执行
docker stop nginx-proxy-manager_app_1

# 预期结果:
# 1. Keepalived在5秒内检测到故障
# 2. VIP自动漂移至备节点
# 3. 负载均衡器将流量切换至备节点
# 4. 业务中断时间<30秒

测试场景2:数据库主库故障

# 在数据库主节点执行
docker stop mysql_db_1

# 预期结果:
# 1. 从库自动提升为主库
# 2. NPM节点自动重连新主库
# 3. 配置数据读写不受影响

监控与运维体系

关键监控指标

指标类别监控项阈值告警方式
系统指标CPU使用率>80%邮件+短信
系统指标内存使用率>85%邮件+短信
应用指标5xx错误率>1%电话+工单
应用指标响应时间>500ms邮件+工单
数据库指标主从延迟>30s邮件+短信

自动化运维脚本

#!/bin/bash
# 检查NPM服务状态
check_npm_status() {
    if ! curl -s "http://localhost:81/health" | grep -q "OK"; then
        systemctl restart nginx-proxy-manager
        if [ $? -ne 0 ]; then
            # 发送告警通知
            curl -X POST -H "Content-Type: application/json" \
              -d '{"status":"critical","service":"npm","message":"NPM服务启动失败"}' \
              https://monitoring.example.com/api/alerts
        fi
    fi
}

# 每2分钟执行一次检查
while true; do
    check_npm_status
    sleep 120
done

常见问题解决方案

1. 证书同步不一致

问题现象:主节点申请的SSL证书未同步到备节点
解决方案

# 检查rsync服务状态
systemctl status rsync

# 手动触发同步
rsync -avz /etc/letsencrypt/ sync_user@192.168.1.12:/etc/letsencrypt/

2. VIP漂移失败

问题现象:主节点故障后VIP未漂移
解决方案

# 检查Keepalived日志
journalctl -u keepalived -f

# 验证网络连通性
ping 192.168.1.12 -c 3

# 重启Keepalived服务
systemctl restart keepalived

3. 数据库连接数耗尽

问题现象:NPM报数据库连接错误
解决方案

# my.cnf配置优化
max_connections = 1000
wait_timeout = 60
interactive_timeout = 60

总结与架构演进建议

本文介绍的双机热备架构可满足中小规模企业需求,随着业务增长,可向以下方向演进:

  1. 集群扩展:从双节点扩展至N+M集群,支持横向扩展
  2. 多区域部署:跨机房/地域灾备,实现RPO=0
  3. 云原生改造:迁移至Kubernetes,利用StatefulSet管理状态
  4. 智能流量调度:引入服务网格(如Istio),实现基于AI的流量控制

通过本文方案,企业可构建稳定可靠的Nginx Proxy Manager高可用架构,将服务可用性提升至99.99%以上,同时降低运维复杂度与故障恢复时间。建议每季度进行一次完整的灾备演练,确保架构持续有效。

附录:配置文件清单

  1. NPM主节点docker-compose.yml
  2. NPM备节点docker-compose.yml
  3. 负载均衡器nginx.conf
  4. Keepalived配置文件
  5. 数据同步脚本sync_npm_data.sh
  6. 健康检查脚本check_npm_health.sh
  7. Nginx自定义配置文件

【免费下载链接】nginx-proxy-manager Docker container for managing Nginx proxy hosts with a simple, powerful interface 【免费下载链接】nginx-proxy-manager 项目地址: https://gitcode.com/GitHub_Trending/ng/nginx-proxy-manager

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值