作为阿里巴巴开源的动态服务发现、配置和服务管理平台,Nacos在微服务架构中扮演着重要角色。在Linux服务器上部署Nacos是生产环境的常见选择,主要基于以下几个考量:
我在多个微服务项目中部署过Nacos,实测在CentOS和Ubuntu系统上运行最为稳定。下面将分享从环境准备到成功启动的完整流程,包含你可能遇到的各种"坑"及解决方案。
在开始安装前,请确保你的Linux系统满足以下最低要求:
| 组件 | 最低要求 | 推荐配置 |
|---|---|---|
| OS | CentOS 7+/Ubuntu 16.04+ | CentOS 8/Ubuntu 20.04 |
| CPU | 2核 | 4核及以上 |
| 内存 | 2GB | 8GB(生产环境) |
| 磁盘 | 10GB | SSD存储更佳 |
| JDK | 1.8+ | OpenJDK 11 |
注意:Nacos 2.0+版本对JDK有更高要求,建议直接使用JDK 11以避免兼容性问题
Nacos基于Java开发,必须先安装JDK。以下是OpenJDK 11的安装步骤:
bash复制# Ubuntu/Debian系统
sudo apt update
sudo apt install -y openjdk-11-jdk
# CentOS/RHEL系统
sudo yum install -y java-11-openjdk-devel
验证安装是否成功:
bash复制java -version
# 应输出类似:openjdk version "11.0.12" 2023-10-17
如果系统已安装多个JDK版本,需要设置默认版本:
bash复制sudo update-alternatives --config java
Nacos默认使用8848端口,需要确保防火墙放行:
bash复制# 查看防火墙状态
sudo systemctl status firewalld
# 开放8848端口
sudo firewall-cmd --zone=public --add-port=8848/tcp --permanent
sudo firewall-cmd --reload
# 对于Ubuntu使用ufw
sudo ufw allow 8848/tcp
sudo ufw reload
官方推荐从GitHub Release页面下载稳定版本:
bash复制# 创建安装目录
mkdir -p /opt/nacos && cd /opt/nacos
# 下载最新稳定版(以2.2.3为例)
wget https://github.com/alibaba/nacos/releases/download/2.2.3/nacos-server-2.2.3.tar.gz
# 解压安装包
tar -zxvf nacos-server-2.2.3.tar.gz
国内用户如果下载缓慢,可以使用国内镜像:
bash复制wget https://mirrors.aliyun.com/nacos-server/nacos-server-2.2.3.tar.gz
解压后的nacos目录包含以下重要内容:
code复制nacos
├── bin # 启动脚本
├── conf # 配置文件
│ ├── application.properties # 主配置
│ └── nacos-mysql.sql # MySQL初始化脚本
├── target # 核心jar包
└── logs # 日志目录
对于开发和测试环境,单机模式是最简单的部署方式。编辑配置文件:
bash复制vim conf/application.properties
关键配置项说明:
properties复制# 服务端口(默认8848)
server.port=8848
# 单机模式运行
nacos.standalone=true
# 数据存储方式(默认嵌入式Derby数据库)
spring.datasource.platform=derby
# 开启鉴权(生产环境必开)
nacos.core.auth.enabled=true
nacos.core.auth.system.type=nacos
nacos.core.auth.server.identity.key=yourKey
nacos.core.auth.server.identity.value=yourValue
重要提示:生产环境务必修改默认密钥(yourKey/yourValue)并妥善保管
如果需要使用MySQL作为存储后端(推荐生产环境使用):
sql复制CREATE DATABASE nacos_config CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'nacos'@'%' IDENTIFIED BY 'secure_password';
GRANT ALL PRIVILEGES ON nacos_config.* TO 'nacos'@'%';
FLUSH PRIVILEGES;
bash复制mysql -u root -p nacos_config < conf/nacos-mysql.sql
properties复制spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos
db.password=secure_password
使用内置脚本启动:
bash复制# 前台启动(调试用)
sh bin/startup.sh -m standalone
# 后台启动(生产用)
sh bin/startup.sh -m standalone &
检查启动日志:
bash复制tail -f logs/start.out
# 看到"Nacos started successfully"表示启动成功
在浏览器访问:
code复制http://服务器IP:8848/nacos
默认登录凭证:
安全提示:首次登录后立即修改默认密码!
通过API检查服务状态:
bash复制curl -X GET "http://127.0.0.1:8848/nacos/v1/ns/service/list?pageNo=1&pageSize=10"
正常应返回类似:
json复制{"count":0,"doms":[],"list":false}
编辑bin/startup.sh,找到JAVA_OPT配置:
bash复制JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
根据服务器配置调整:
生产环境建议至少3节点集群:
bash复制cp conf/cluster.conf.example conf/cluster.conf
vim conf/cluster.conf
添加节点IP(每行一个):
code复制192.168.1.101:8848
192.168.1.102:8848
192.168.1.103:8848
nginx复制upstream nacos-cluster {
server 192.168.1.101:8848;
server 192.168.1.102:8848;
server 192.168.1.103:8848;
}
server {
listen 8848;
server_name nacos.example.com;
location / {
proxy_pass http://nacos-cluster;
}
}
定期备份Nacos数据:
bash复制# Derby数据库备份
cp -r /opt/nacos/data/derby-data /backup/nacos-derby-$(date +%Y%m%d)
# MySQL数据库备份
mysqldump -u nacos -p nacos_config > /backup/nacos-mysql-$(date +%Y%m%d).sql
建议设置cron定时任务,每周全量备份一次。
错误现象:
code复制Address already in use: bind
解决方案:
bash复制# 查找占用8848端口的进程
netstat -tunlp | grep 8848
# 终止冲突进程或修改Nacos端口
vim conf/application.properties
server.port=8849
错误日志:
code复制Could not get JDBC Connection; nested exception is java.sql.SQLException
检查要点:
错误现象:
code复制java.lang.OutOfMemoryError: Java heap space
解决方案:
排查步骤:
ps -ef | grep nacossudo firewall-cmd --list-portstail -f logs/nacos.logcurl http://localhost:8848/nacos/创建systemd服务(推荐生产环境使用):
bash复制sudo vim /etc/systemd/system/nacos.service
内容示例:
code复制[Unit]
Description=Nacos Server
After=network.target
[Service]
Type=forking
ExecStart=/opt/nacos/bin/startup.sh -m standalone
ExecStop=/opt/nacos/bin/shutdown.sh
Restart=on-failure
User=root
Group=root
[Install]
WantedBy=multi-user.target
启用服务:
bash复制sudo systemctl daemon-reload
sudo systemctl enable nacos
sudo systemctl start nacos
调整日志级别和滚动策略:
bash复制vim conf/nacos-logback.xml
关键配置项:
xml复制<!-- 控制台输出日志级别 -->
<root level="info">
<appender-ref ref="console" />
</root>
<!-- 文件日志滚动策略 -->
<appender name="nacos" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/nacos-server.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>1GB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
</appender>
集成Prometheus监控:
properties复制management.endpoints.web.exposure.include=*
management.metrics.export.prometheus.enabled=true
yaml复制scrape_configs:
- job_name: 'nacos'
metrics_path: '/nacos/actuator/prometheus'
static_configs:
- targets: ['nacos-server:8848']
bash复制curl -X PUT 'http://127.0.0.1:8848/nacos/v1/auth/users?username=nacos&newPassword=NewSecurePassword123!'
properties复制server.ssl.enabled=true
server.ssl.key-store-type=PKCS12
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=yourPassword
nginx复制server {
listen 443 ssl;
server_name nacos.example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://nacos-cluster;
}
}
通过Nginx限制访问IP:
nginx复制location / {
allow 192.168.1.0/24;
allow 10.0.0.1;
deny all;
proxy_pass http://nacos-cluster;
}
或者使用Nacos自身的鉴权系统,为不同团队分配不同权限的账号。
bash复制# Derby数据库
cp -r data/derby-data /backup/nacos-derby-before-upgrade
# MySQL数据库
mysqldump -u nacos -p nacos_config > /backup/nacos-mysql-before-upgrade.sql
bash复制sh bin/shutdown.sh
bash复制wget https://github.com/alibaba/nacos/releases/download/2.2.3/nacos-server-2.2.3.tar.gz
tar -zxvf nacos-server-2.2.3.tar.gz
bash复制cp -r old-nacos/conf/* new-nacos/conf/
cp -r old-nacos/data/* new-nacos/data/
bash复制sh bin/startup.sh -m standalone
如果升级后出现问题:
对于MySQL后端:
properties复制db.pool.config.maxActive=50
db.pool.config.maxIdle=20
db.pool.config.minIdle=10
sql复制ALTER TABLE config_info ADD INDEX idx_data_id (data_id);
ALTER TABLE config_info ADD INDEX idx_group (group_id);
sql复制OPTIMIZE TABLE config_info;
修改application.properties:
properties复制# 配置缓存项
nacos.config.cache.enabled=true
nacos.config.cache.max-size=100000
nacos.config.cache.expire-seconds=60
# 服务发现缓存
nacos.naming.cache.enabled=true
nacos.naming.cache.max-size=100000
nacos.naming.cache.expire-seconds=30
调整Linux内核参数:
bash复制# 增加最大文件描述符
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
# TCP参数优化
echo "net.ipv4.tcp_max_syn_backlog = 8192" >> /etc/sysctl.conf
echo "net.core.somaxconn = 8192" >> /etc/sysctl.conf
sysctl -p
在Nacos配置中调整网络参数:
properties复制server.tomcat.max-threads=1000
server.tomcat.accept-count=1000
server.tomcat.max-connections=10000
application.yml示例:
yaml复制spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: dev
group: DEFAULT_GROUP
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
refresh-enabled: true
bash复制# 创建命名空间
curl -X POST 'http://127.0.0.1:8848/nacos/v1/console/namespaces' \
-d 'customNamespaceId=dev&namespaceName=开发环境&namespaceDesc=开发环境配置'
properties复制spring.cloud.nacos.discovery.namespace=dev
spring.cloud.nacos.config.namespace=dev
配置客户端重试策略:
yaml复制spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
fail-fast: true
retry:
max-attempts: 5
initial-interval: 2000
multiplier: 1.5
max-interval: 10000
java复制public class CustomAuthPlugin extends AbstractAuthPlugin {
@Override
public boolean login(String username, String password) {
// 自定义认证逻辑
return checkWithLDAP(username, password);
}
}
properties复制nacos.core.auth.system.type=custom
java复制public class OracleDataSource implements DataSource {
// 实现Oracle特定操作
}
properties复制spring.datasource.platform=oracle
集成自定义监控指标:
java复制@RestController
@RequestMapping("/monitor")
public class CustomMonitor {
@Autowired
private MeterRegistry registry;
@GetMapping("/custom")
public String customMetric() {
registry.counter("custom.metric").increment();
return "OK";
}
}
bash复制#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR="/backup/nacos-$DATE"
mkdir -p $BACKUP_DIR
cp -r /opt/nacos/conf $BACKUP_DIR
cp -r /opt/nacos/data $BACKUP_DIR
# MySQL备份
mysqldump -u nacos -p nacos_config > $BACKUP_DIR/nacos-mysql.sql
# 打包压缩
tar -zcvf $BACKUP_DIR.tar.gz $BACKUP_DIR
bash复制0 2 * * * /bin/bash /backup/nacos-backup.sh
恢复步骤:
rm -rf /opt/nacos/data/*bash复制tar -zxvf nacos-backup-20230601.tar.gz
cp -r backup/nacos-20230601/data/* /opt/nacos/data/
mysql -u nacos -p nacos_config < backup/nacos-20230601/nacos-mysql.sql
通过Nacos API管理配置历史:
bash复制# 获取历史版本
curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/history?dataId=example&group=DEFAULT_GROUP"
# 回滚到特定版本
curl -X PUT "http://127.0.0.1:8848/nacos/v1/cs/history" \
-d "dataId=example&group=DEFAULT_GROUP&version=123456789"
官方镜像使用:
bash复制docker run --name nacos-standalone \
-e MODE=standalone \
-p 8848:8848 \
-d nacos/nacos-server:latest
自定义Dockerfile示例:
dockerfile复制FROM nacos/nacos-server:latest
COPY custom-plugin.jar /home/nacos/plugins/
COPY application.properties /home/nacos/conf/
StatefulSet示例:
yaml复制apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nacos
spec:
serviceName: nacos
replicas: 3
template:
spec:
containers:
- name: nacos
image: nacos/nacos-server:latest
env:
- name: MODE
value: cluster
- name: NACOS_SERVERS
value: "nacos-0.nacos:8848 nacos-1.nacos:8848 nacos-2.nacos:8848"
Kubernetes探针配置:
yaml复制livenessProbe:
httpGet:
path: /nacos/actuator/health
port: 8848
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /nacos/actuator/health
port: 8848
initialDelaySeconds: 30
periodSeconds: 10
配置集群间同步:
properties复制nacos.remote.server.grpc.port=9848
nacos.core.cluster.server.list=192.168.1.101:8848,192.168.2.101:8848
检查同步状态:
bash复制curl -X GET "http://127.0.0.1:8848/nacos/v1/core/cluster/nodes?withHealth=false"
通过DNS或负载均衡实现:
使用JMeter进行压力测试:
监控以下指标:
测试场景示例:
启用详细访问日志:
properties复制server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.directory=logs
server.tomcat.accesslog.prefix=access_log
关键审计项:
检查清单:
配置metrics端点:
properties复制management.endpoints.web.exposure.include=*
management.metrics.export.prometheus.enabled=true
Logstash配置示例:
ruby复制input {
file {
path => "/opt/nacos/logs/*.log"
}
}
导入Nacos官方仪表板模板:
| Nacos Server | Spring Cloud Alibaba | 备注 |
|---|---|---|
| 2.2.x | 2022.0.x | 推荐 |
| 2.1.x | 2021.0.x | |
| 1.4.x | 2.2.x | 旧版 |
检查清单:
测试步骤:
现象:客户端频繁重连
排查:
优化方案:
配置建议:
properties复制nacos.naming.clean.initialDelay=300
nacos.naming.clean.period=120
nacos.naming.expireInstance=true