一、Nacos 2.2.3 生产级部署指南Docker版本(单机 + MySQL + 鉴权)
·
一、部署背景
Nacos 作为主流的配置中心和服务注册中心,2.3.2 版本存在鉴权模块与 MySQL 兼容的致命 bug,因此生产环境优先选择 2.2.3 稳定版。本文实现 Nacos 2.2.3 单机部署,集成 MySQL 持久化存储,并开启鉴权(登录验证),满足生产环境安全与稳定性要求。
二、部署架构
- 核心组件:Nacos 2.2.3 + MySQL 8.0.36
- 部署模式:Docker Compose 单机部署
- 核心特性:MySQL 数据持久化、鉴权登录、JVM 生产级调优、日志轮转、健康检查
三、前置准备
1. 环境要求
- 服务器:Linux 系统(CentOS 7+/Ubuntu 20.04+)
- 软件:Docker、Docker Compose
- 网络:服务器开放 8848/9848/9849 端口(或仅对内网开放)
- 存储
四、部署步骤
步骤 1:编写 Docker Compose 配置文件
创建
:MySQL 提前创建docker-compose.yml,内容如下(生产级配置,含资源限制、健康检查):nacos_config数据库
version: "3.8"
# 第一步:定义两个网络(外部访问网 + 内部服务网)
networks:
public-net: # 外部访问网:只让webgateway加入,对外暴露
driver: bridge
internal-net: # 内部服务网:所有服务内部通信,不对外暴露
driver: bridge
services: # 服务
#######################################
# Redis 服务(缓存/会话存储)
#######################################
redis:
image: redis:6.2.0
container_name: redis6
restart: always
ports:
- "6379:6379"
volumes:
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf:ro
- ./redis/data:/data:rw
- ./redis/logs:/var/log/redis:rw
environment:
- TZ=Asia/Shanghai # 设置时区
command: ["redis-server", "/usr/local/etc/redis/redis.conf"] # 加载自定义配置
healthcheck: # 健康检查
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 3
networks:
- internal-net
#######################################
# RabbitMQ 服务(消息队列)
#######################################
rabbitmq:
image: rabbitmq:3.13-management
container_name: rabbitmq
restart: always
hostname: rabbitmq
environment:
- RABBITMQ_DEFAULT_VHOST=my_vhost
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=shhy123#
volumes:
- ./rabbitmq/data:/var/lib/rabbitmq:rw
- ./rabbitmq/logs:/var/log/rabbitmq:rw
ports:
- "4369:4369"
- "5672:5672"
- "15672:15672"
- "25672:25672"
cap_add:
- CAP_SYS_NICE # 允许调整线程优先级
networks:
- internal-net
healthcheck:
test: ["CMD", "rabbitmq-diagnostics", "ping"]
interval: 10s
timeout: 5s
retries: 3
#######################################
# MySQL 服务(关系型数据库)
#######################################
mysql:
image: mysql:8.4.0
container_name: mysql840
restart: always
hostname: mysql
environment:
- MYSQL_ROOT_PASSWORD=shhy123#
- TZ=Asia/Shanghai
volumes:
- ./mysql/conf/my.cnf:/etc/my.cnf:ro
- ./mysql/data:/var/lib/mysql:rw
- ./mysql/logs:/var/log/mysql:rw
command:
# - --default-authentication-plugin=mysql_native_password
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_general_ci
- --explicit_defaults_for_timestamp=true
- --default-time-zone=+8:00
- --lower_case_table_names=1
ports:
- "3306:3306" # 【重要】原3307:3307已改3307:3306(容器内MySQL默认监听3306)
cap_add:
- CAP_SYS_NICE # 允许调整线程优先级
networks:
- internal-net
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-p$$MYSQL_ROOT_PASSWORD"]
interval: 10s
timeout: 5s
retries: 3
#######################################
# Elasticsearch 服务(日志/数据检索)
#######################################
es:
image: elasticsearch:8.17.2
container_name: es
restart: always
hostname: es
environment:
- "ES_JAVA_OPTS=-Xms2048m -Xmx2048m" # 【可选】内存不足可改1024m
- "discovery.type=single-node"
- "cluster.name=elasticsearch-spc"
- "ELASTIC_PASSWORD=shhy123#"
- "TAKE_FILE_OWNERSHIP=true"
- TZ=Asia/Shanghai
volumes:
- ./es-kibana/es/master/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro
- ./es-kibana/es/master/data:/usr/share/elasticsearch/data:rw
- ./es-kibana/es/master/logs:/usr/share/elasticsearch/logs:rw
- ./es-kibana/es/master/plugins:/usr/share/elasticsearch/plugins:rw
ports:
- "9200:9200"
- "9300:9300"
networks:
- internal-net
healthcheck:
test: ["CMD", "curl", "-s", "-u", "elastic:$$ELASTIC_PASSWORD", "http://localhost:9200/_cluster/health"]
interval: 15s
timeout: 10s
retries: 3
#######################################
# Kibana 服务(ES可视化界面)
#######################################
kibana:
image: kibana:8.17.2
container_name: kibana
restart: always
hostname: kibana
environment:
- TZ=Asia/Shanghai
- "elasticsearch.hosts=http://es:9200"
- "elasticsearch.username=kibana_system"
- "elasticsearch.password=shhy123#"
- "NODE_OPTIONS=--openssl-legacy-provider=false" # 禁用旧版 OpenSSL 提供商
volumes:
- ./es-kibana/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml:ro
ports:
- "5601:5601"
networks:
- internal-net
depends_on:
- es
healthcheck:
test: ["CMD", "curl", "-s", "http://localhost:5601/api/status"]
interval: 15s
timeout: 10s
retries: 3
#######################################
# MongoDB 服务(文档型数据库)
#######################################
mongodb:
image: mongo:8.0.3 # 选择稳定版本(6.0/7.0均可,根据需求调整)
container_name: mongodb
restart: always # 服务异常时自动重启
hostname: mongodb
environment:
- TZ=Asia/Shanghai # 时区与其他服务保持一致
- MONGO_INITDB_ROOT_USERNAME=admin # 初始化根用户名
- MONGO_INITDB_ROOT_PASSWORD=shhy123# # 根用户密码(建议与其他服务密码策略一致)
volumes:
- ./mongodb/data:/data/db:rw # 数据持久化目录(核心,避免容器删除后数据丢失)
- ./mongodb/logs:/var/log/mongodb:rw # 日志目录挂载
# 可选:挂载自定义配置文件(如需修改MongoDB默认配置,如端口、权限等)
# - ./mongodb/conf/mongod.conf:/etc/mongod.conf:ro
ports:
- "27017:27017" # MongoDB默认端口(如需外部访问保留,仅内部访问可删除)
networks:
- internal-net # 加入内部服务网,与其他服务(如后端)通信
healthcheck: # 健康检查(验证数据库是否可用)
test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')", "-u", "admin", "-p", "shhy123#", "--authenticationDatabase", "admin"]
interval: 10s # 每10秒检查一次
timeout: 5s # 检查超时时间
retries: 3 # 连续3次失败视为不健康
#######################################
# InfluxDB 服务(时序数据库)
#######################################
influxdb:
image: influxdb:2.7.10 # 稳定版,支持UI管理
container_name: influxdb
restart: always
hostname: influxdb
environment:
- TZ=Asia/Shanghai
# 首次启动初始化配置
- DOCKER_INFLUXDB_INIT_MODE=setup
- DOCKER_INFLUXDB_INIT_USERNAME=admin
- DOCKER_INFLUXDB_INIT_PASSWORD=shhy123#
- DOCKER_INFLUXDB_INIT_ORG=my_org
- DOCKER_INFLUXDB_INIT_BUCKET=default_bucket
- DOCKER_INFLUXDB_INIT_RETENTION=30d # 数据保留30天,可改为infinite永久
- DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=my_secret_token_123 # 建议自定义复杂令牌
volumes:
- ./influxdb/data:/var/lib/influxdb2:rw # 数据持久化
- ./influxdb/config:/etc/influxdb2:rw # 配置文件
- ./influxdb/logs:/var/log/influxdb2:rw # 日志
ports:
- "8086:8086" # HTTP API + UI端口
networks:
- internal-net # 仅内部服务访问
healthcheck:
test: ["CMD", "curl", "-s", "-o", "/dev/null", "http://localhost:8086/health"]
interval: 10s
timeout: 5s
retries: 3
#######################################
# EMQX 服务(MQTT 消息服务器)- 适配5.8.8最终版
#######################################
emqx:
image: emqx/emqx:5.8.8 # 匹配你本地拉取的镜像名称
container_name: emqx
restart: always
hostname: emqx
environment:
# 基础配置(保留核心,移除无效变量)
- TZ=Asia/Shanghai # 统一时区
- EMQX_NODE_NAME=emqx@127.0.0.1 # 节点名,和hostname一致
- EMQX_CLUSTER__DISCOVERY_STRATEGY=static # 单机模式(集群需调整)
# MQTT 基础配置(5.8.8 兼容格式)
- EMQX_LISTENER_TCP_DEFAULT_BIND=0.0.0.0:1883 # 替换原双下划线格式
- EMQX_LISTENER_WS_DEFAULT_BIND=0.0.0.0:8083 # 替换原双下划线格式
# 日志配置(5.8.8 支持的变量格式,消除unknown警告)
- EMQX_LOG_LEVEL=info # 替换原 EMQX_LOG__LEVEL
- EMQX_LOG_CONSOLE_ENABLE=true # 替换原 EMQX_LOG__CONSOLE__ENABLE
# 资源限制(可选,根据服务器配置调整)
- EMQX_NODE_PROCESS_LIMIT=2097152 # 替换原双下划线格式
- EMQX_NODE_MAX_PORTS=1048576 # 替换原双下划线格式
# 可选:添加Erlang Cookie(消除集群警告,单机也可配置)
- EMQX_NODE_COOKIE=emqx_secret_cookie_123 # 自定义复杂值即可
volumes:
# 持久化目录(必须挂载,避免数据丢失)
- ./emqx/data:/opt/emqx/data:rw # 数据持久化
- ./emqx/log:/opt/emqx/log:rw # 日志持久化
#- ./emqx/etc:/opt/emqx/etc:rw # 自定义配置文件(注释避免覆盖默认)
- /etc/localtime:/etc/localtime:ro # 同步宿主机时间
ports:
# 核心端口(根据需要开放,仅内部访问可注释)
- "1883:1883" # MQTT TCP 端口
- "8083:8083" # MQTT WebSocket 端口
- "8084:8084" # MQTT WebSocket SSL 端口
- "8883:8883" # MQTT TCP SSL 端口
- "18083:18083" # EMQX Dashboard UI 端口(核心,用于管理)
networks:
- internal-net # 加入内部服务网,和其他服务互通
# 健康检查(适配5.8.8,稳定生效)
healthcheck:
test: ["CMD", "/opt/emqx/bin/emqx", "ctl", "status"] # 官方完整命令路径
interval: 20s # 检查间隔(覆盖启动初期未就绪)
timeout: 25s # 超时时间(和官方集群配置对齐)
retries: 10 # 重试次数(20*10=200秒,足够EMQX启动)
start_period: 60s # 启动后60秒再开始检查(3.4+支持,兜底)
# 资源限制(根据服务器配置调整)
deploy:
resources:
limits:
cpus: '1'
memory: 1G
reservations:
cpus: '0.5'
memory: 512M
#######################################
# Nacos 服务(配置中心/注册中心)【生产版】
#######################################
nacos:
image: nacos/nacos-server:v2.2.3 # 本地镜像,无需远程拉取
container_name: nacos
restart: always
hostname: nacos
privileged: true
pull_policy: never # 禁用远程拉取,仅用本地镜像
environment:
- TZ=Asia/Shanghai
# MySQL连接配置(仅基础连接,鉴权配置移到文件)
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=mysql
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_USER=root
- MYSQL_SERVICE_PASSWORD=shhy123#
- MYSQL_SERVICE_DB_NAME=nacos_config
# Nacos基础配置
- NACOS_SERVER_PORT=8848
- PREFER_HOST_MODE=hostname
- MODE=standalone # 单机模式(集群需另行配置)
# JVM生产级调优
- JVM_XMS=1024m
- JVM_XMX=1024m
- JVM_XMN=512m
- JVM_MS=128m
- JVM_MMS=320m
# 日志配置
- NACOS_LOG_BASE_DIR=/home/nacos/logs
- NACOS_LOG_ROLLING_CONFIG=30
- NACOS_LOG_MAX_FILE_SIZE=100MB
- NACOS_WEB_CONTEXT=/nacos
- NACOS_DEBUG_MODE=false
volumes:
# 核心!挂载自定义配置文件(鉴权配置在这里)
- ./nacos/conf/application.properties:/home/nacos/conf/application.properties:ro
# 其他持久化挂载
- ./nacos/logs:/home/nacos/logs:rw
- ./nacos/data:/home/nacos/data:rw
- /etc/localtime:/etc/localtime:ro # 同步宿主机时间
ports:
- "8848:8848" # 主端口(配置中心/控制台)
- "9848:9848" # gRPC服务发现端口
- "9849:9849" # gRPC配置中心端口
networks:
- internal-net # 仅内部服务访问
# 依赖MySQL健康后启动
depends_on:
mysql:
condition: service_healthy
# 生产级资源限制
deploy:
resources:
limits:
cpus: '1'
memory: 2G
reservations:
cpus: '0.5'
memory: 1G
# 健康检查(及时发现服务异常)
healthcheck:
test: ["CMD", "curl", "-s", "-u", "nacos:nacos", "http://localhost:8848/nacos/v1/ns/instance?serviceName=nacos-prod-health"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
配置文件注释
#######################################
# Nacos 服务(配置中心/注册中心)【生产版】
# 适用场景:生产环境单机部署的 Nacos 服务,集成 MySQL 持久化,包含生产级调优和健康检查
#######################################
nacos:
# 指定使用的镜像及版本,v2.2.3 为稳定生产版本
image: nacos/nacos-server:v2.2.3 # 本地镜像,无需远程拉取
# 容器名称,便于识别和管理
container_name: nacos
# 重启策略:容器退出时总是重启,保证服务高可用
restart: always
# 容器内主机名,与 PREFER_HOST_MODE=hostname 配合使用,避免IP依赖
hostname: nacos
# 赋予容器特权模式,解决部分系统下文件权限、端口占用等问题
privileged: true
# 镜像拉取策略:禁用远程拉取,仅使用本地已存在的镜像,提升启动速度并避免网络问题
pull_policy: never # 禁用远程拉取,仅用本地镜像
# 环境变量配置(核心配置项)
environment:
# 设置容器时区为上海,避免日志、定时任务等时间偏移
- TZ=Asia/Shanghai
# ===================== MySQL 持久化配置 =====================
# 指定数据源平台为 MySQL,Nacos 默认使用嵌入式 Derby,生产环境必须替换为 MySQL 保证数据持久化
- SPRING_DATASOURCE_PLATFORM=mysql
# MySQL 服务地址(容器名,需确保 mysql 容器在同一网络内)
- MYSQL_SERVICE_HOST=mysql
# MySQL 端口
- MYSQL_SERVICE_PORT=3306
# MySQL 用户名
- MYSQL_SERVICE_USER=root
# MySQL 密码(生产环境建议通过密钥管理工具注入,此处为示例)
- MYSQL_SERVICE_PASSWORD=shhy123
# Nacos 持久化使用的数据库名(需提前在 MySQL 中创建并执行 Nacos 初始化脚本)
- MYSQL_SERVICE_DB_NAME=nacos_config
# ===================== Nacos 基础配置 =====================
# Nacos 服务端口(控制台/API 访问端口)
- NACOS_SERVER_PORT=8848
# 优先使用主机名模式注册,而非 IP 模式,提升服务注册稳定性
- PREFER_HOST_MODE=hostname
# 运行模式:standalone 单机模式(集群模式需配置 MODE=cluster 及集群节点信息)
- MODE=standalone # 单机模式(集群需另行配置)
# ===================== JVM 生产级调优 =====================
# JVM 堆初始内存,与堆最大内存设为相同值,避免运行时内存扩容性能损耗
- JVM_XMS=1024m
# JVM 堆最大内存,根据服务器配置调整,生产环境建议至少 1G
- JVM_XMX=1024m
# 新生代内存大小,设为堆内存的 1/2,平衡新生代和老年代内存分配
- JVM_XMN=512m
# 元空间初始大小,存储类元数据,避免频繁扩容
- JVM_MS=128m
# 元空间最大大小,限制元空间占用,防止内存溢出
- JVM_MMS=320m
# ===================== 日志配置 =====================
# 日志根目录(已挂载到宿主机,便于日志持久化和查看)
- NACOS_LOG_BASE_DIR=/home/nacos/logs
# 日志滚动保留天数,保留 30 天日志,避免日志文件过大
- NACOS_LOG_ROLLING_CONFIG=30
# 单个日志文件最大大小,达到 100MB 时自动切割
- NACOS_LOG_MAX_FILE_SIZE=100MB
# Nacos 控制台上下文路径,访问地址为 http://IP:8848/nacos
- NACOS_WEB_CONTEXT=/nacos
# 禁用调试模式,生产环境关闭调试以提升性能和安全性
- NACOS_DEBUG_MODE=false
# 数据卷挂载(持久化和自定义配置)
volumes:
# 核心:挂载自定义 application.properties,覆盖容器默认配置(如鉴权、高级配置)
- ./nacos/conf/application.properties:/home/nacos/conf/application.properties:ro
# 挂载 Nacos 配置目录(读写权限),持久化自定义配置文件
- ./nacos/conf:/home/nacos/conf:rw
# 挂载日志目录,持久化日志文件,便于问题排查
- ./nacos/logs:/home/nacos/logs:rw
# 挂载数据目录,持久化 Nacos 运行时数据(如服务注册信息缓存)
- ./nacos/data:/home/nacos/data:rw
# 同步宿主机时区,确保容器内时间与宿主机一致
- /etc/localtime:/etc/localtime:ro # 同步宿主机时间
# 端口映射(Nacos 核心端口)
ports:
- "8848:8848" # 主端口(配置中心/控制台 Web 访问、OpenAPI 调用)
- "9848:9848" # gRPC 服务发现端口(Nacos 2.x 新增,服务注册/发现底层通信)
- "9849:9849" # gRPC 配置中心端口(Nacos 2.x 新增,配置推送底层通信)
# 网络配置:加入自定义 internal-net 网络,与其他服务(如 MySQL)互通
networks:
internal-net:
# 启动依赖:等待 mysql 服务健康检查通过后再启动 Nacos,避免启动时连接数据库失败
depends_on:
mysql:
condition: service_healthy
# 生产级资源限制(避免容器占用过多服务器资源)
deploy:
resources:
# 资源上限:限制容器最多使用 1 核 CPU、2G 内存
limits:
cpus: '1'
memory: 2G
# 资源预留:保证容器至少分配 0.5 核 CPU、1G 内存,确保基础运行性能
reservations:
cpus: '0.5'
memory: 1G
# 健康检查(及时发现服务异常,Docker 可自动重启故障容器)
healthcheck:
# 检查命令:通过 curl 调用 Nacos 健康检查接口,验证服务是否可用
test: ["CMD", "curl", "-s", "-u", "nacos:nacos", "http://localhost:8848/nacos/v1/ns/instance?serviceName=nacos-prod-health"]
interval: 10s # 检查间隔:每 10 秒检查一次
timeout: 5s # 超时时间:5 秒内无响应则判定为失败
retries: 5 # 重试次数:连续 5 次失败则判定服务不健康
start_period: 30s # 启动等待时间:容器启动后 30 秒再开始检查,避免启动中误判
步骤 2:编写 Nacos 核心配置文件(开启鉴权)
创建 ./nacos/conf/application.properties,内容如下(含完整鉴权配置):
# 基础单机配置
nacos.standalone=true
server.port=8848
# MySQL连接配置
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://mysql:3306/nacos_config?characterEncoding=utf8&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=shhy123#
# ========== 核心:开启鉴权(适配Nacos 2.2.3,可直接登录) ==========
# 1. 启用鉴权(核心开关)
nacos.core.auth.enabled=true
# 2. 启用默认鉴权插件(2.2.3必需)
nacos.core.auth.plugin.enabled=true
# 3. 鉴权密钥(必须32位及以上,64位最佳)
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
# 4. 服务端身份标识(解决403/鉴权校验问题,必需)
nacos.core.auth.server.identity.key=custom-auth-key
nacos.core.auth.server.identity.value=custom-auth-value
# 5. 客户端身份标识(与服务端对应,可选但建议配置)
nacos.core.auth.identity.key=custom-auth-key
nacos.core.auth.identity.value=custom-auth-value
# 6. 关闭默认用户免密(生产必配,强制登录)
nacos.core.auth.enable.userAgentAuthWhite=false
# 7. 兜底:关闭空token访问(增强鉴权)
nacos.core.auth.plugin.nacos.token.empty.access=false
创建 ./nacos/conf/nacos-logback.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright 1999-2018 Alibaba Group Holding Ltd.
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<configuration scan="true" scanPeriod="10 seconds">
<springProperty scope="context" name="logPath" source="nacos.logs.path" defaultValue="${nacos.home}/logs"/>
<property name="LOG_HOME" value="${logPath}"/>
<appender name="cmdb-main"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${nacos.home}/logs/cmdb-main.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${nacos.home}/logs/cmdb-main.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>2GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>7GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="naming-server"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/naming-server.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/naming-server.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>1GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>7GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="async-naming-server" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>1024</queueSize>
<neverBlock>true</neverBlock>
<appender-ref ref="naming-server"/>
</appender>
<appender name="naming-raft"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/naming-raft.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/naming-raft.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>1GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="async-naming-raft" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>1024</queueSize>
<neverBlock>true</neverBlock>
<appender-ref ref="naming-raft"/>
</appender>
<appender name="naming-distro"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/naming-distro.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/naming-distro.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>1GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="async-naming-distro" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>1024</queueSize>
<neverBlock>true</neverBlock>
<appender-ref ref="naming-distro"/>
</appender>
<appender name="naming-event"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/naming-event.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/naming-event.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>1GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="async-naming-event" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>1024</queueSize>
<neverBlock>true</neverBlock>
<appender-ref ref="naming-event"/>
</appender>
<appender name="naming-push"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/naming-push.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/naming-push.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>1GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="naming-rt"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/naming-rt.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/naming-rt.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>1GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%msg%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="naming-performance"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/naming-performance.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/naming-performance.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>1GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--config module logback config-->
<appender name="dumpFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/config-dump.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/config-dump.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>2GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>7GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="pullFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/config-pull.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/config-pull.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>20MB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>128MB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="fatalFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/config-fatal.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/config-fatal.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>20MB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>128MB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="memoryFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/config-memory.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/config-memory.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>20MB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>128MB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="pullCheckFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/config-pull-check.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/config-pull-check.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>1GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%msg%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="clientLog"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/config-client-request.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/config-client-request.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>2GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>7GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date|%msg%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="traceLog"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/config-trace.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/config-trace.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>2GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>7GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date|%msg%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="notifyLog"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/config-notify.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/config-notify.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>1GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="startLog"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/config-server.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/config-server.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>512MB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="rootFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/nacos.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/nacos.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>512MB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="nacos-address"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/nacos-address.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/nacos-address.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>2GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>7GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="istio-main"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/istio-main.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/istio-main.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>2GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>7GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="core-auth"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/core-auth.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/core-auth.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>2GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>7GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="protocol-raft"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/protocol-raft.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/protocol-raft.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>2GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>7GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="protocol-distro"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/protocol-distro.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/protocol-distro.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>2GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>7GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="nacos-cluster"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/nacos-cluster.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/nacos-cluster.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>2GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>7GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="alipay-jraft"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/alipay-jraft.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/alipay-jraft.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>2GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>7GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--TPS control -->
<appender name="tps-control"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/tps-control.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/tps-control.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>2GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>7GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="tps-control-digest"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/tps-control-digest.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/tps-control-digest.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>2GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>7GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="tps-control-detail"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/tps-control-detail.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/tps-control-detail.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>2GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>7GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="remote"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/remote.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/remote.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>2GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>7GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="remote-digest"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/remote-digest.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/remote-digest.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>2GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>7GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="remote-push"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/remote-push.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/remote-push.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>2GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>7GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<logger name="com.alibaba.nacos.address.main" additivity="false">
<level value="INFO"/>
<appender-ref ref="nacos-address"/>
</logger>
<logger name="com.alibaba.nacos.cmdb.main" additivity="false">
<level value="INFO"/>
<appender-ref ref="cmdb-main"/>
</logger>
<logger name="com.alibaba.nacos.core.remote" additivity="false">
<level value="DEBUG"/>
<appender-ref ref="remote"/>
</logger>
<logger name="com.alibaba.nacos.core.remote.push" additivity="false">
<level value="DEBUG"/>
<appender-ref ref="remote-push"/>
</logger>
<logger name="com.alibaba.nacos.core.remote.digest" additivity="false">
<level value="DEBUG"/>
<appender-ref ref="remote-digest"/>
</logger>
<!-- TPS Control-->
<logger name="com.alibaba.nacos.core.remote.control.digest" additivity="false">
<level value="DEBUG"/>
<appender-ref ref="tps-control-digest"/>
</logger>
<logger name="com.alibaba.nacos.core.remote.control.detail" additivity="false">
<level value="DEBUG"/>
<appender-ref ref="tps-control-detail"/>
</logger>
<logger name="com.alibaba.nacos.core.remote.control" additivity="false">
<level value="DEBUG"/>
<appender-ref ref="tps-control"/>
</logger>
<logger name="com.alibaba.nacos.naming.main" additivity="false">
<level value="INFO"/>
<appender-ref ref="async-naming-server"/>
</logger>
<logger name="com.alibaba.nacos.naming.raft" additivity="false">
<level value="INFO"/>
<appender-ref ref="async-naming-raft"/>
</logger>
<logger name="com.alibaba.nacos.naming.distro" additivity="false">
<level value="INFO"/>
<appender-ref ref="async-naming-distro"/>
</logger>
<logger name="com.alibaba.nacos.naming.event" additivity="false">
<level value="INFO"/>
<appender-ref ref="async-naming-event"/>
</logger>
<logger name="com.alibaba.nacos.naming.push" additivity="false">
<level value="INFO"/>
<appender-ref ref="naming-push"/>
</logger>
<logger name="com.alibaba.nacos.naming.rt" additivity="false">
<level value="INFO"/>
<appender-ref ref="naming-rt"/>
</logger>
<logger name="com.alibaba.nacos.naming.performance" additivity="false">
<level value="INFO"/>
<appender-ref ref="naming-performance"/>
</logger>
<logger name="com.alibaba.nacos.config.dumpLog" additivity="false">
<level value="INFO"/>
<appender-ref ref="dumpFile"/>
</logger>
<logger name="com.alibaba.nacos.config.pullLog" additivity="false">
<level value="INFO"/>
<appender-ref ref="pullFile"/>
</logger>
<logger name="com.alibaba.nacos.config.pullCheckLog" additivity="false">
<level value="INFO"/>
<appender-ref ref="pullCheckFile"/>
</logger>
<logger name="com.alibaba.nacos.config.fatal" additivity="false">
<level value="INFO"/>
<appender-ref ref="fatalFile"/>
</logger>
<logger name="com.alibaba.nacos.config.monitorLog" additivity="false">
<level value="INFO"/>
<appender-ref ref="memoryFile"/>
</logger>
<logger name="com.alibaba.nacos.config.clientLog" additivity="false">
<level value="info"/>
<appender-ref ref="clientLog"/>
</logger>
<logger name="com.alibaba.nacos.config.notifyLog" additivity="false">
<level value="INFO"/>
<appender-ref ref="notifyLog"/>
</logger>
<logger name="com.alibaba.nacos.config.traceLog" additivity="false">
<level value="info"/>
<appender-ref ref="traceLog"/>
</logger>
<logger name="com.alibaba.nacos.config.startLog" additivity="false">
<level value="INFO"/>
<appender-ref ref="startLog"/>
</logger>
<logger name="com.alibaba.nacos.istio.main" additivity="false">
<level value="DEBUG"/>
<appender-ref ref="istio-main"/>
</logger>
<logger name="com.alibaba.nacos.core.auth" additivity="false">
<level value="DEBUG"/>
<appender-ref ref="core-auth"/>
</logger>
<logger name="com.alibaba.nacos.core.protocol.raft" additivity="false">
<level value="INFO"/>
<appender-ref ref="protocol-raft"/>
</logger>
<logger name="com.alipay.sofa.jraft" additivity="false">
<level value="INFO"/>
<appender-ref ref="alipay-jraft"/>
</logger>
<logger name="com.alibaba.nacos.core.protocol.distro" additivity="false">
<level value="INFO"/>
<appender-ref ref="protocol-distro"/>
</logger>
<logger name="com.alibaba.nacos.core.cluster" additivity="false">
<level value="INFO"/>
<appender-ref ref="nacos-cluster"/>
</logger>
<springProfile name="standalone">
<logger name="org.springframework">
<appender-ref ref="CONSOLE"/>
<level value="INFO"/>
</logger>
<logger name="org.apache.catalina.startup.DigesterFactory">
<appender-ref ref="CONSOLE"/>
<level value="INFO"/>
</logger>
<logger name="org.apache.catalina.util.LifecycleBase">
<appender-ref ref="CONSOLE"/>
<level value="ERROR"/>
</logger>
<logger name="org.apache.coyote.http11.Http11NioProtocol">
<appender-ref ref="CONSOLE"/>
<level value="WARN"/>
</logger>
<logger name="org.apache.tomcat.util.net.NioSelectorPool">
<appender-ref ref="CONSOLE"/>
<level value="WARN"/>
</logger>
</springProfile>
<logger name="com.alibaba.nacos.core.listener.StartingApplicationListener">
<appender-ref ref="CONSOLE"/>
<level value="INFO"/>
</logger>
<logger name="com.alibaba.nacos.common.notify.NotifyCenter">
<appender-ref ref="CONSOLE"/>
<level value="INFO"/>
</logger>
<logger name="com.alibaba.nacos.sys.file.WatchFileCenter">
<appender-ref ref="CONSOLE"/>
<level value="INFO"/>
</logger>
<logger name="com.alibaba.nacos.common.executor.ThreadPoolManager">
<appender-ref ref="CONSOLE"/>
<level value="INFO"/>
</logger>
<root>
<level value="INFO"/>
<appender-ref ref="rootFile"/>
</root>
</configuration>
步骤 3:初始化 MySQL 鉴权表
创建 ./mysql/init/nacos-mysql.sql,写入以下 SQL(创建 Nacos 鉴权所需的用户 / 角色表):
/*
* Copyright 1999-2018 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info */
/******************************************/
CREATE TABLE `config_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) DEFAULT NULL,
`content` longtext NOT NULL COMMENT 'content',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
`app_name` varchar(128) DEFAULT NULL,
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
`c_desc` varchar(256) DEFAULT NULL,
`c_use` varchar(64) DEFAULT NULL,
`effect` varchar(64) DEFAULT NULL,
`type` varchar(64) DEFAULT NULL,
`c_schema` text,
`encrypted_data_key` text NOT NULL COMMENT '秘钥',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info_aggr */
/******************************************/
CREATE TABLE `config_info_aggr` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
`content` longtext NOT NULL COMMENT '内容',
`gmt_modified` datetime NOT NULL COMMENT '修改时间',
`app_name` varchar(128) DEFAULT NULL,
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info_beta */
/******************************************/
CREATE TABLE `config_info_beta` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`content` longtext NOT NULL COMMENT 'content',
`beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
`encrypted_data_key` text NOT NULL COMMENT '秘钥',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info_tag */
/******************************************/
CREATE TABLE `config_info_tag` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
`tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`content` longtext NOT NULL COMMENT 'content',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_tags_relation */
/******************************************/
CREATE TABLE `config_tags_relation` (
`id` bigint(20) NOT NULL COMMENT 'id',
`tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
`tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
`nid` bigint(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`nid`),
UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = group_capacity */
/******************************************/
CREATE TABLE `group_capacity` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = his_config_info */
/******************************************/
CREATE TABLE `his_config_info` (
`id` bigint(20) unsigned NOT NULL,
`nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`data_id` varchar(255) NOT NULL,
`group_id` varchar(128) NOT NULL,
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`content` longtext NOT NULL,
`md5` varchar(32) DEFAULT NULL,
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`src_user` text,
`src_ip` varchar(50) DEFAULT NULL,
`op_type` char(10) DEFAULT NULL,
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
`encrypted_data_key` text NOT NULL COMMENT '秘钥',
PRIMARY KEY (`nid`),
KEY `idx_gmt_create` (`gmt_create`),
KEY `idx_gmt_modified` (`gmt_modified`),
KEY `idx_did` (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = tenant_capacity */
/******************************************/
CREATE TABLE `tenant_capacity` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';
CREATE TABLE `tenant_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`kp` varchar(128) NOT NULL COMMENT 'kp',
`tenant_id` varchar(128) default '' COMMENT 'tenant_id',
`tenant_name` varchar(128) default '' COMMENT 'tenant_name',
`tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
`create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
`gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
`gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';
CREATE TABLE `users` (
`username` varchar(50) NOT NULL PRIMARY KEY,
`password` varchar(500) NOT NULL,
`enabled` boolean NOT NULL
);
CREATE TABLE `roles` (
`username` varchar(50) NOT NULL,
`role` varchar(50) NOT NULL,
UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
);
CREATE TABLE `permissions` (
`role` varchar(50) NOT NULL,
`resource` varchar(255) NOT NULL,
`action` varchar(8) NOT NULL,
UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);
INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);
INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');
配置说明:
{
"Nacos": {
// 【配置中心监听配置】- 监听Nacos配置中心的指定配置集,项目启动后自动拉取该配置
"Listeners": [
{
// 是否为可选监听:false=强制监听,配置拉取失败会影响项目启动;true=可选监听,拉取失败不影响
"Optional": false,
// 要监听的配置集DataId(唯一标识,和Nacos控制台配置一致)
"DataId": "PlantDataService",
// 要监听的配置集分组(默认DEFAULT_GROUP,和Nacos控制台配置一致)
"Group": "DEFAULT_GROUP"
}
],
// 【Nacos服务端地址】- 配置中心+注册中心的服务端地址,多个地址用数组形式["ip1:port1", "ip2:port2"]
"ServerAddresses": [ "http://172.16.34.40:8848/" ],
// 【Nacos登录账号】- Nacos控制台配置的用户名(若未开启鉴权可留空,开启后必须填)
"UserName": "nacos",
// 【Nacos登录密码】- Nacos控制台配置的密码(若未开启鉴权可留空,开启后必须填)
"Password": "nacos",
// 【Nacos命名空间ID】- 隔离不同环境的配置/服务,留空=默认命名空间(public),填控制台的命名空间ID(非名称)
"Namespace": "",
// 【服务注册分组】- 当前服务注册到Nacos的分组,默认DEFAULT_GROUP,可用于环境隔离(如DEV/PROD)
"GroupName": "DEFAULT_GROUP",
// 【服务集群名称】- 当前服务所属集群,默认DEFAULT,多集群部署时填写(如SH/BEIJING)
"ClusterName": "DEFAULT",
// 【服务名称】- 注册到Nacos的服务唯一标识,网关/其他服务通过该名称发现当前服务,不可重复
"ServiceName": "PlantDataService",
// 【Nacos请求默认超时时间】- 调用Nacos服务端接口(注册/拉取配置)的默认超时时间,单位毫秒
"DefaultTimeOut": 15000,
// 【Nacos心跳监听间隔】- 服务注册后,Nacos客户端监听服务端心跳的间隔时间,单位毫秒
"ListenInterval": 1000,
// 【配置中心是否使用RPC协议】- 1.3.10版本建议false,使用HTTP协议,兼容Nacos2.x服务端
"ConfigUseRpc": false,
// 【注册中心是否使用RPC协议】- 1.3.10版本建议false,使用HTTP协议,兼容Nacos2.x服务端
"NamingUseRpc": false,
// 【是否启用配置中心缓存】- 开启后拉取的配置会缓存到本地,避免Nacos服务端不可用时项目启动失败
"EnableRemoteConfigCache": true,
// 【配置中心自动刷新间隔】- 客户端主动拉取Nacos配置中心最新配置的间隔时间,单位毫秒
"RefreshInterval": 5000,
// 【服务注册IP】- 1.3.10版本核心配置,直接根节点(源码可读取),填宿主机IP(供其他服务调用)
"Ip": "172.16.34.40",
// 【服务注册端口】- 1.3.10版本核心配置,直接根节点(源码可读取),填宿主机映射端口,和docker-compose的端口映射一致
"Port": 55002,
// 【是否启用服务注册】- true=启动时自动注册到Nacos,false=仅订阅服务,不注册自身
"RegisterEnabled": true,
// 【实例是否启用】- true=实例可用,接受网关/其他服务的调用;false=实例不可用,会被Nacos剔除
"InstanceEnabled": true,
// 【服务实例权重】- 负载均衡时的权重,值越大被调用概率越高,默认100.0,范围0-1000
"Weight": 100.0,
// 【是否为临时实例】- true=临时实例,服务下线后Nacos会自动剔除;false=持久化实例,需手动注销
"Ephemeral": true,
// 【是否为HTTPS服务】- true=当前服务是HTTPS协议,false=HTTP协议,影响其他服务调用的协议
"Secure": false,
// 【首选网卡IP匹配前缀】- 1.3.10版本留空即可,避免UriTool自动探测网卡IP覆盖配置的Ip,多个前缀用逗号分隔(如192.168.,172.16.)
"PreferredNetworks": "",
// 【服务实例元数据】- 自定义键值对,可传递服务额外信息(如健康检查地址、版本号),Nacos控制台可查看
"Metadata": {
// 健康检查地址 - Nacos服务端根据该地址检测实例是否健康,需和项目健康检查接口一致
"health-check-url": "/Health",
// 实例状态 - 自定义状态标识,供其他服务做业务判断(可删,不影响核心功能)
"status": "UP"
}
}
}
验证部署结果
1. 控制台访问
访问 http://服务器IP:8848/nacos,会出现 Nacos 登录页,输入默认账号:nacos,密码:nacos,可正常登录控制台。
2. 核心功能验证
- 配置管理:新增 / 修改 / 删除配置,数据会持久化到 MySQL 的
config_info表; - 服务注册:通过 API/SDK 注册服务,可在「服务列表」查看,数据持久化到 MySQL;
- 鉴权验证:退出登录后再次访问控制台,需重新输入账号密码(无免密访问);
- 健康检查:执行
docker-compose ps,Nacos/MySQL 状态均为healthy。
更多推荐




所有评论(0)