Nacos 2.3.2 Docker 生产部署:MySQL持久化与鉴权全流程实战

在微服务架构中,服务发现和配置管理是两大核心组件。Nacos作为阿里巴巴开源的服务发现和配置管理平台,已经成为众多企业的首选方案。本文将详细介绍如何在生产环境中使用Docker Compose部署Nacos 2.3.2,并配置MySQL作为外部持久化存储,同时开启鉴权功能以确保系统安全。

1. 生产环境部署规划

在生产环境中部署Nacos需要考虑以下几个关键因素:

  • 数据持久化 :避免使用内置的Derby数据库,选择MySQL等成熟的关系型数据库
  • 安全性 :必须开启鉴权功能,防止未授权访问
  • 资源隔离 :合理配置JVM参数,避免内存溢出
  • 高可用 :虽然本文演示单机模式,但生产环境建议集群部署

1.1 系统要求

部署前请确保您的环境满足以下要求:

组件 最低要求 推荐配置
Docker 20.10.0+ 最新稳定版
Docker Compose 1.29.0+ 2.0.0+
MySQL 5.7+ 8.0+
内存 2GB 4GB+
CPU 2核 4核+

提示:Nacos 2.x版本新增了gRPC通信端口,确保防火墙开放8848(主端口)、9848(客户端gRPC端口)和9849(服务端gRPC端口)

2. MySQL数据库准备

2.1 创建数据库与用户

首先需要为Nacos准备MySQL数据库。执行以下SQL语句创建数据库和用户:

CREATE DATABASE nacos_config CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

CREATE USER 'nacos'@'%' IDENTIFIED BY 'Nacos@123456';
GRANT ALL PRIVILEGES ON nacos_config.* TO 'nacos'@'%';
FLUSH PRIVILEGES;

2.2 初始化Nacos数据库表结构

从Nacos官方GitHub仓库获取数据库初始化脚本,或者使用以下简化步骤:

# 下载Nacos官方提供的SQL文件
wget https://github.com/alibaba/nacos/blob/master/distribution/conf/mysql-schema.sql

# 导入到MySQL数据库
mysql -u root -p nacos_config < mysql-schema.sql

关键表结构说明:

  • config_info :存储所有配置信息
  • users :存储用户账号和密码(开启鉴权后使用)
  • roles :用户角色关联表
  • permissions :权限控制表

3. Docker Compose部署配置

下面提供完整的docker-compose.yml文件,包含了Nacos和MySQL的配置:

version: '3.8'

services:
  mysql:
    image: mysql:8.0.32
    container_name: nacos-mysql
    environment:
      MYSQL_ROOT_PASSWORD: Root@123456
      MYSQL_DATABASE: nacos_config
      MYSQL_USER: nacos
      MYSQL_PASSWORD: Nacos@123456
    volumes:
      - mysql_data:/var/lib/mysql
      - ./mysql/conf.d:/etc/mysql/conf.d
    ports:
      - "3306:3306"
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 5s
      timeout: 10s
      retries: 10
    networks:
      - nacos_network

  nacos:
    image: nacos/nacos-server:v2.3.2
    container_name: nacos-server
    depends_on:
      mysql:
        condition: service_healthy
    environment:
      - PREFER_HOST_MODE=hostname
      - MODE=standalone
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=mysql
      - MYSQL_SERVICE_PORT=3306
      - MYSQL_SERVICE_DB_NAME=nacos_config
      - MYSQL_SERVICE_USER=nacos
      - MYSQL_SERVICE_PASSWORD=Nacos@123456
      - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
      - NACOS_AUTH_ENABLE=true
      - NACOS_AUTH_TOKEN_EXPIRE_SECONDS=18000
      - NACOS_AUTH_TOKEN=bmFjb3NfdG9rZW5fc2VjcmV0X2tleV8xMjM0NTY3ODkw
      - NACOS_AUTH_CACHING_ENABLED=true
      - JVM_XMS=512m
      - JVM_XMX=512m
      - JVM_XMN=256m
    volumes:
      - ./nacos/logs:/home/nacos/logs
      - ./nacos/init.d:/home/nacos/init.d
    ports:
      - "8848:8848"
      - "9848:9848"
      - "9849:9849"
    networks:
      - nacos_network
    restart: always

networks:
  nacos_network:
    driver: bridge

volumes:
  mysql_data:

3.1 关键配置解析

MySQL连接配置

  • SPRING_DATASOURCE_PLATFORM=mysql :指定使用MySQL数据库
  • MYSQL_SERVICE_HOST :MySQL服务地址
  • MYSQL_SERVICE_DB_NAME :数据库名称
  • MYSQL_SERVICE_USER / MYSQL_SERVICE_PASSWORD :数据库账号密码

鉴权相关配置

  • NACOS_AUTH_ENABLE=true :开启鉴权
  • NACOS_AUTH_TOKEN :JWT令牌密钥,需Base64编码且长度≥32字符
  • NACOS_AUTH_TOKEN_EXPIRE_SECONDS :token过期时间

JVM参数配置

  • JVM_XMS / JVM_XMX :初始和最大堆内存
  • JVM_XMN :年轻代大小

4. 高级安全配置

4.1 自定义鉴权密钥

生产环境务必修改默认的鉴权密钥。可以通过以下步骤生成安全的密钥:

# 生成32位随机字符串
openssl rand -base64 32

# 输出示例:X5kD7pF2qR9wYtV3zU8xH6jM1nB4vC0lK9oP7iG2aN3mS5

将生成的字符串作为 NACOS_AUTH_TOKEN 环境变量的值。

4.2 修改默认管理员密码

部署完成后,第一时间修改默认的nacos/nacos账号密码:

  1. 访问Nacos控制台:http://localhost:8848/nacos
  2. 使用默认账号(nacos/nacos)登录
  3. 进入"权限控制"->"用户管理"
  4. 修改nacos用户的密码

也可以通过数据库直接修改:

UPDATE users SET password='$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu' WHERE username='nacos';

注意:数据库中的密码是BCrypt加密后的结果,不要直接存储明文密码

4.3 网络隔离建议

对于生产环境,建议采取以下网络隔离措施:

  1. 将Nacos和MySQL部署在同一内部网络中
  2. 只对外暴露Nacos的8848端口
  3. 配置IP白名单,限制访问来源
  4. 考虑使用VPN或专线访问生产环境

5. 验证与监控

5.1 服务健康检查

部署完成后,可以通过以下方式验证服务是否正常运行:

# 检查Nacos容器日志
docker logs -f nacos-server

# 检查健康状态
curl -X GET "http://localhost:8848/nacos/v1/ns/operator/metrics"

预期看到类似以下输出:

{
  "status": "UP",
  "mysql": {"status": "UP"},
  "disk": {"status": "UP"},
  "load": {"status": "UP"}
}

5.2 监控配置

建议配置以下监控指标:

  1. 系统级别

    • CPU/Memory/Disk使用率
    • 网络吞吐量
  2. Nacos特定指标

    • 注册服务数量
    • 配置项数量
    • 请求响应时间
    • 活跃连接数

可以通过Prometheus收集Nacos metrics:

# prometheus.yml 配置示例
scrape_configs:
  - job_name: 'nacos'
    metrics_path: '/nacos/actuator/prometheus'
    static_configs:
      - targets: ['nacos-server:8848']

6. 常见问题排查

6.1 数据库连接问题

症状 :Nacos启动失败,日志中出现数据库连接错误

解决方案

  1. 检查MySQL服务是否正常运行
  2. 验证数据库连接参数是否正确
  3. 检查网络连通性:
docker exec -it nacos-server ping mysql
  1. 手动测试数据库连接:
docker exec -it nacos-server \
  mysql -hmysql -unacos -pNacos@123456 nacos_config -e "SHOW TABLES;"

6.2 鉴权失效问题

症状 :即使开启了鉴权,仍然可以无需认证访问API

解决方案

  1. 确认环境变量 NACOS_AUTH_ENABLE=true 已正确设置
  2. 检查Nacos日志中是否有鉴权相关的错误
  3. 验证 application.properties 文件中鉴权配置是否生效:
docker exec -it nacos-server cat /home/nacos/conf/application.properties | grep auth
  1. 确保所有客户端都使用了正确的访问令牌

6.3 性能调优建议

当Nacos性能不佳时,可以考虑以下优化措施:

  1. 数据库优化

    • 为常用查询添加索引
    • 调整MySQL连接池参数
    • 定期清理历史数据
  2. JVM调优

    environment:
      - JVM_XMS=2g
      - JVM_XMX=2g
      - JVM_XMN=1g
      - JVM_MS=128m
      - JVM_MMS=320m
    
  3. Nacos参数调整

    • 调整配置项缓存大小
    • 优化心跳检测间隔

7. 备份与恢复策略

7.1 数据库备份

定期备份MySQL数据库至关重要:

# 备份命令示例
docker exec nacos-mysql \
  mysqldump -u root -pRoot@123456 nacos_config > nacos_backup_$(date +%Y%m%d).sql

# 恢复命令示例
docker exec -i nacos-mysql \
  mysql -u root -pRoot@123456 nacos_config < nacos_backup_20240101.sql

7.2 配置导出

Nacos提供了配置导出功能:

# 导出所有配置
curl -X GET "http://localhost:8848/nacos/v1/cs/configs?export=true" \
  -H "Authorization: Bearer $ACCESS_TOKEN" > nacos_config_export.zip

7.3 灾难恢复方案

建议制定完整的灾难恢复方案,包括:

  1. 定期全量备份+增量备份
  2. 备份验证机制
  3. 明确恢复流程和责任人
  4. 定期进行恢复演练

更多推荐