1. 项目概述与核心价值最近在搞微服务架构服务注册与发现、配置管理是绕不开的两座大山。Nacos作为阿里开源的一站式解决方案这两年势头很猛社区活跃文档也相对完善。很多朋友在本地Windows或者Docker里玩得挺溜但一到生产环境要在Linux服务器上从头部署就有点犯怵。特别是Ubuntu 22.04 LTS作为当前长期支持版本稳定性和生态都很好是很多团队的首选。今天我就结合自己多次在Ubuntu 22.04上部署Nacos的经验从零开始把安装、配置、启动、优化的全流程掰开揉碎了讲清楚。这不仅仅是把包下载下来、启动就完事了我会重点分享生产环境部署时那些容易踩坑的细节比如如何选择部署模式、如何配置持久化数据库、如何进行基础的安全加固以及如何让它作为一个系统服务稳定运行。无论你是刚接触微服务的新手还是正在为团队搭建基础架构的开发者这篇手把手的指南都能让你少走弯路快速在Ubuntu上搭建一个可靠可用的Nacos服务。2. 部署模式选择与环境准备2.1 单机模式 vs. 集群模式在动手之前首先要明确你的需求。Nacos支持两种部署模式单机模式和集群模式。这个选择直接决定了后续的配置复杂度和资源要求。单机模式顾名思义只运行一个Nacos服务进程。它内置了一个轻量级的Derby数据库开箱即用非常适合开发测试、个人学习或者对高可用性要求不高的内部小项目。它的优点是部署极其简单几乎零配置。但缺点也很明显数据存储在本地嵌入式数据库中一旦这个进程挂掉或者服务器重启所有服务注册信息和配置数据都可能丢失除非你做了数据备份和持久化配置这我们后面会讲。性能上它也无法应对大规模的服务实例和配置管理。集群模式由三个或三个以上推荐至少三个Nacos服务节点组成它们之间通过Raft协议进行数据同步共同对外提供服务。这是生产环境的标配。它能提供高可用性某个节点宕机不影响整体服务、数据持久化通常需要外接MySQL等数据库和更高的读写性能。当然部署和维护成本也相应提高。对于绝大多数初次在Ubuntu上部署用于学习和预生产环境的同学我建议先从单机模式入手但按照生产标准配置MySQL持久化。这样既能理解核心流程又能保证数据不丢失后续如果需要扩展为集群迁移路径也会非常清晰。本篇指南也将以这种“单机部署、外接数据库”的模式为主线进行讲解。2.2 服务器环境检查与依赖安装登录你的Ubuntu 22.04服务器我们首先进行基础环境检查。打开终端执行以下命令# 更新系统包列表确保获取最新的软件源信息 sudo apt update # 升级已安装的包到最新版本可选但建议在新服务器上执行 sudo apt upgrade -y接下来安装Nacos运行所必需的依赖Java。Nacos 2.x版本需要JDK 1.8或更高版本推荐使用OpenJDK 8或11它们在Ubuntu仓库中维护得很好。# 安装OpenJDK 11长期支持版本兼容性和性能都很好 sudo apt install openjdk-11-jdk -y安装完成后验证Java是否安装成功java -version你应该能看到类似openjdk version 11.0.22的输出。如果显示“command not found”请检查安装过程或尝试sudo apt install default-jdk -y。注意有些教程会建议从Oracle官网下载JDK但在生产环境的Linux服务器上我强烈推荐使用系统包管理器如apt安装OpenJDK。理由有三第一自动管理依赖和更新第二无需手动配置环境变量第三符合Linux系统软件管理的最佳实践避免后期维护的混乱。除了Java我们还需要一个数据库。前面提到为了数据持久化我们将使用MySQL。Ubuntu 22.04的默认仓库提供了MySQL 8.0。# 安装MySQL服务器 sudo apt install mysql-server -y安装完成后MySQL服务会自动启动。我们需要运行一个安全脚本并进行初始配置# 运行MySQL安全安装向导 sudo mysql_secure_installation这个脚本会引导你完成一系列设置询问是否设置“VALIDATE PASSWORD”插件用于密码强度校验。对于生产环境建议选择‘y’并设置一个强密码策略对于测试环境可以选择‘n’以简化。为root用户设置密码。移除匿名用户。禁止root用户远程登录生产环境强烈建议禁止。移除测试数据库。立即重新加载权限表。请根据你的环境谨慎选择。完成后登录MySQL为Nacos创建专用的数据库和用户# 以root身份登录MySQL如果上一步禁止了root远程登录这里用sudo直接连 sudo mysql在MySQL提示符下执行以下SQL语句-- 创建一个名为 nacos 的数据库字符集使用utf8mb4以支持完整的UTF-8如emoji CREATE DATABASE IF NOT EXISTS nacos CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 创建一个名为 nacos 的用户并设置密码请将 YourStrongPassword123! 替换成你自己的强密码 CREATE USER nacos% IDENTIFIED BY YourStrongPassword123!; -- 授予 nacos 用户对 nacos 数据库的所有权限 GRANT ALL PRIVILEGES ON nacos.* TO nacos%; -- 刷新权限使更改生效 FLUSH PRIVILEGES; -- 退出MySQL EXIT;实操心得这里用户授权使用了nacos%表示允许从任何主机连接。在生产内网环境中为了安全可以限制为特定的应用服务器IP例如nacos192.168.1.%。密码务必设置得足够复杂并妥善保管。3. Nacos服务器安装与核心配置3.1 获取与解压Nacos发行版目前获取Nacos最可靠的方式是从其GitHub的Release页面下载。我们将使用wget命令直接下载到服务器。首先选择一个合适的目录来存放Nacos。我习惯放在/opt或/usr/local下。这里以/opt为例# 切换到 /opt 目录 cd /opt # 从Github Release下载Nacos 2.3.2版本请检查官网是否有更新版本 # 如果服务器网络访问Github较慢可以先在本地下载然后通过scp等工具上传。 sudo wget https://github.com/alibaba/nacos/releases/download/2.3.2/nacos-server-2.3.2.tar.gz # 解压下载的压缩包 sudo tar -zxvf nacos-server-2.3.2.tar.gz # 解压后会生成一个 nacos 目录可以为其创建一个软链接方便使用可选 sudo ln -s /opt/nacos /usr/local/nacos现在Nacos的所有文件都在/opt/nacos目录下了。进入目录看看结构cd /opt/nacos ls -la关键目录说明bin/: 启动、停止脚本所在目录。conf/:配置文件目录这是我们接下来要重点操作的地方。logs/: 日志文件目录出问题时第一个要查看的地方。target/: 存放编译后的jar包。data/: 如果使用内置Derby数据库数据会存储在这里。3.2 配置MySQL数据源这是将Nacos从“玩具”变为“生产工具”的关键一步。我们需要修改配置文件告诉Nacos使用我们刚才创建的MySQL数据库而不是内置的Derby。首先Nacos已经为我们准备了MySQL的数据库初始化脚本。找到它并导入到我们创建的nacos数据库中# 导入MySQL数据库schema sudo mysql -u nacos -p nacos /opt/nacos/conf/mysql-schema.sql系统会提示你输入之前为nacos用户设置的密码。接下来编辑Nacos的核心配置文件application.properties# 使用vim或nano编辑配置文件建议先备份原文件 sudo cp /opt/nacos/conf/application.properties /opt/nacos/conf/application.properties.bak sudo vim /opt/nacos/conf/application.properties找到文件中关于数据库配置的部分通常靠后默认是被注释掉的Derby配置。我们需要将其修改为MySQL配置。请找到并修改或添加以下内容# 启用MySQL数据源将默认的 false 改为 true spring.datasource.platformmysql # 统计当前数据源数量我们只有一个MySQL所以是1 db.num1 # 配置第一个也是唯一一个数据源的连接信息 db.url.0jdbc:mysql://127.0.0.1:3306/nacos?characterEncodingutf8connectTimeout1000socketTimeout3000autoReconnecttrueuseUnicodetrueuseSSLfalseserverTimezoneUTC db.user.0nacos db.password.0YourStrongPassword123! # 替换为你的实际密码关键参数解析与避坑指南db.url.0连接字符串。127.0.0.1:3306是MySQL的地址和端口。useSSLfalse表示禁用SSL连接因为我们是内网通信简化配置。如果MySQL和Nacos不在同一台服务器请将127.0.0.1改为MySQL服务器的实际IP。serverTimezoneUTC设置数据库连接的时区为UTC避免因服务器时区不同导致的时间戳问题。characterEncodingutf8确保字符集正确防止中文乱码。autoReconnecttrue网络波动时自动重连提升稳定性。注意事项配置文件中的密码是明文存储的。在生产环境中这是一个安全风险。更安全的做法是使用JVM参数或外部密钥管理服务来传递密码但这涉及更复杂的运维知识。对于初级部署务必保证application.properties文件的权限设置为仅所有者可读chmod 600并严格控制服务器访问权限。3.3 网络与集群配置单机模式简化在application.properties中我们还需要关注几个与网络和运行模式相关的配置# 指定Nacos服务器的IP地址。如果服务器有多个网卡或者你需要客户端从外部网络访问必须显式设置。 # 例如你的服务器公网IP是 203.0.113.10内网IP是 192.168.1.100。 # 如果希望从公网访问则设置为公网IP。通常建议设置为内网IP并通过网关或负载均衡器暴露服务。 nacos.inetutils.ip-address192.168.1.100 # Nacos服务端口默认为8848。确保服务器防火墙如ufw开放了此端口。 server.port8848 # 单机模式运行。这是本次部署的关键确保其值为 standalone。 nacos.standalonetruenacos.inetutils.ip-address这个配置非常重要Nacos在注册服务时会向客户端返回这个IP作为服务实例的地址。如果设置错误或为空客户端可能会拿到一个无法访问的IP如127.0.1.1或172.17.0.1等Docker内部IP导致服务调用失败。务必设置为客户端能够正确访问到的IP。nacos.standalonetrue明确指定为单机模式。即使我们接了MySQL运行模式依然是单机只是数据存储外置了。配置完成后保存并退出编辑器。4. 启动Nacos与验证服务4.1 以控制台模式启动与测试一切就绪我们可以尝试启动Nacos了。Nacos提供了多种启动脚本。对于首次启动和调试强烈建议使用“前台启动”模式这样所有日志都会直接输出到控制台方便我们观察启动过程是否有报错。# 切换到Nacos的bin目录 cd /opt/nacos/bin # 前台启动NacosStandalone模式 sh startup.sh -m standalone如果一切配置正确你将看到大量日志滚动最后会出现类似“Nacos started successfully in stand alone mode. use embedded storage”或“Nacos started successfully in stand alone mode. use external storage”的提示后者表明它成功连接到了我们配置的外部MySQL。此时打开你的浏览器访问http://你的服务器IP:8848/nacos。例如http://192.168.1.100:8848/nacos。你应该能看到Nacos的登录页面。默认登录账号密码是nacos/nacos。成功登录后你就进入了Nacos的控制台。可以分别点击左侧菜单的“服务管理”和“配置管理”熟悉一下界面。现在还没有任何服务注册或配置所以列表是空的。在前台启动的控制台你可以按Ctrl C来停止Nacos服务。4.2 配置为系统服务Systemd让Nacos在前台运行不是长久之计。我们需要将其配置为一个系统服务使用Systemd这样它可以随系统启动、自动重启、方便地查看状态和日志。首先停止刚才前台运行的Nacos如果还在运行。然后为Nacos创建一个Systemd服务单元文件sudo vim /etc/systemd/system/nacos.service将以下内容粘贴进去请根据你的实际安装路径修改ExecStart和Environment中的路径[Unit] DescriptionNacos Server Afternetwork.target mysql.service # 表明在网络和MySQL服务启动后再启动Nacos Wantsnetwork.target mysql.service [Service] Typeforking # 使用forking类型因为startup.sh脚本会启动后台进程 # 设置环境变量JAVA_HOME必须正确指向你的JDK安装路径 EnvironmentJAVA_HOME/usr/lib/jvm/java-11-openjdk-amd64 # 设置MODE为standalone这是关键 EnvironmentMODEstandalone # 工作目录和启动命令 WorkingDirectory/opt/nacos/bin ExecStart/bin/bash /opt/nacos/bin/startup.sh -m standalone ExecStop/bin/bash /opt/nacos/bin/shutdown.sh # 服务崩溃后自动重启 Restarton-failure RestartSec10 # 进程相关安全设置 Usernobody # 建议创建一个专用用户如nacos这里先用nobody演示 Groupnogroup LimitNOFILE65535 # 提高文件描述符限制应对高并发 [Install] WantedBymulti-user.target关键配置详解EnvironmentMODEstandalone通过环境变量向启动脚本传递运行模式参数这与我们之前直接在脚本后加-m standalone效果一致。User和Group出于安全考虑不应该以root身份运行服务。最佳实践是创建一个名为nacos的专用系统用户和组并修改Nacos目录的归属。这里为了简化先使用nobody。LimitNOFILENacos作为服务端可能需要同时处理大量连接提高这个限制可以避免“Too many open files”错误。创建专用用户并授权推荐做法sudo useradd -r -s /bin/false nacos sudo chown -R nacos:nacos /opt/nacos然后将服务文件中的Usernobody和Groupnogroup改为Usernacos和Groupnacos。保存服务文件后重新加载Systemd配置然后启动Nacos服务# 重新加载systemd配置 sudo systemctl daemon-reload # 启动nacos服务 sudo systemctl start nacos.service # 设置开机自启 sudo systemctl enable nacos.service # 查看服务状态 sudo systemctl status nacos.service如果状态显示为active (running)并且日志用journalctl -u nacos -f查看没有报错说明服务启动成功。再次通过浏览器访问http://IP:8848/nacos确认。5. 生产环境进阶配置与优化5.1 安全加固基础操作默认安装的Nacos存在一些安全隐患必须进行处理。1. 修改默认密码登录控制台后第一时间在“权限控制” - “用户管理”中修改默认nacos用户的密码。点击用户列表右侧的“修改”按钮设置一个强密码。2. 启用鉴权可选但推荐Nacos默认不开启身份认证这意味着任何人只要知道地址就能访问控制台和API极其危险。我们需要开启它。 编辑application.properties文件添加或修改以下行# 开启鉴权 nacos.core.auth.enabledtrue # 设置用于生成JWT Token的密钥请务必修改为一个复杂的随机字符串 nacos.core.auth.default.token.secret.keyVGhpc0lzQVZlcnlTZWNyZXRTZWNyZXRLZXlBbmRNdXN0QmVMb25ntoken.secret.key是核心密钥用于签名令牌。必须修改并且长度要足够例如Base64编码的32位以上随机字符串。你可以用任何方式生成一个例如在Linux下运行openssl rand -base64 32。修改后重启Nacos服务sudo systemctl restart nacos。再次访问控制台就需要输入用户名密码了。同时你的微服务客户端在连接Nacos时也需要在配置中提供用户名和密码。3. 防火墙配置确保服务器防火墙如ufw只开放必要的端口。对于Nacos通常只需要开放8848Web和API端口。如果配置了集群节点间通信端口7848用于Raft选举和9848/9849用于gRPC通信也需要在内部网络开放。# 假设使用ufw sudo ufw allow 8848/tcp # 仅允许特定IP段访问增加安全性例如只允许办公网IP sudo ufw allow from 192.168.1.0/24 to any port 88485.2 日志管理与监控良好的日志管理是运维的基石。Nacos的日志默认在/opt/nacos/logs/目录下。nacos.log主日志文件记录大部分运行信息。access_log.xxxx.log访问日志。config-*.log/naming-*.log分别记录配置中心和命名中心的具体操作日志。我们可以配置日志的轮转和级别。编辑/opt/nacos/conf/nacos-logback.xml文件。例如可以修改某个日志文件的RollingFileAppender配置调整maxFileSize单个文件最大大小和maxHistory保留的历史文件个数防止日志占满磁盘。对于生产环境建议将日志接入ELKElasticsearch, Logstash, Kibana或类似的中枢日志系统便于集中查询和分析。基础健康检查Nacos提供了健康检查端点。你可以通过访问http://IP:8848/nacos/actuator/health来快速检查服务状态。返回{status:UP}表示健康。5.3 性能调优与JVM参数默认的JVM参数可能不适合生产环境。我们需要根据服务器内存大小调整Nacos的堆内存设置。 编辑Nacos的启动脚本/opt/nacos/bin/startup.sh找到设置JVM参数的地方搜索JAVA_OPT。对于单机模式通常修改standalone模式下的参数# 在startup.sh中找到类似下面的部分 if [[ ${MODE} standalone ]]; then JAVA_OPT${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m JAVA_OPT${JAVA_OPT} -Dnacos.standalonetrue else ... fi-Xms512m初始堆内存大小。-Xmx512m最大堆内存大小。-Xmn256m年轻代Young Generation大小。调优建议对于拥有2-4GB内存的服务器可以将-Xms和-Xmx设置为1g或2g。原则是避免堆内存设置过小导致频繁GC也避免设置过大超过物理内存一半导致系统Swap。可以添加GC日志参数以便后期排查性能问题-XX:PrintGCDetails -XX:PrintGCDateStamps -Xloggc:/opt/nacos/logs/nacos_gc.log修改后需要重启Nacos服务使配置生效。6. 常见问题排查与解决实录在实际部署中你几乎一定会遇到一些问题。下面是我总结的几个高频问题及其排查思路。6.1 服务启动失败类问题问题1启动时报java.lang.UnsupportedClassVersionError现象执行startup.sh后控制台快速报错退出日志中出现此类错误。原因Java版本不兼容。Nacos 2.x 需要JDK 1.8你可能安装了更老的JDK 7或者环境变量指向了错误的Java版本。解决运行java -version确认版本。运行update-alternatives --config java选择正确的Java 11版本。确保在startup.sh或nacos.service文件中设置的JAVA_HOME路径正确。问题2启动后无法访问Web页面 (Connection refused)现象systemctl status nacos显示服务是active (running)但浏览器无法访问IP:8848。排查步骤检查端口监听运行sudo netstat -tlnp | grep 8848。如果没有任何输出说明Nacos根本没监听8848端口。重点查看日志/opt/nacos/logs/start.out或nacos.log看是否有启动错误。检查防火墙运行sudo ufw status。如果防火墙是激活状态且没有放行8848端口则需要添加规则。检查IP绑定在application.properties中nacos.inetutils.ip-address是否设置了一个错误的、非本机IP或者服务器有多个IPNacos绑定到了另一个你无法访问的IP上可以尝试暂时注释掉这行让Nacos自动选择IP。检查服务真实状态有时systemctl status显示正常但进程可能已经僵死。尝试sudo systemctl restart nacos并再次查看日志。问题3启动日志报错db.num is null或No DataSource set现象日志中显示数据库连接失败服务不断重连或启动失败。原因MySQL数据源配置错误。解决仔细检查application.properties中的db.url.0,db.user.0,db.password.0是否正确。确认MySQL服务是否正常运行sudo systemctl status mysql。确认nacos用户是否有权访问nacos数据库。可以尝试用配置的用户名密码手动连接MySQLmysql -u nacos -p -h 127.0.0.1 nacos。检查MySQL是否只允许本地连接。如果Nacos和MySQL不在同一台机器需要修改MySQL的bind-address在/etc/mysql/mysql.conf.d/mysqld.cnf中将bind-address 127.0.0.1改为0.0.0.0或具体IP并重启MySQL。注意此操作有安全风险需配合防火墙规则。6.2 客户端连接与使用类问题问题4微服务客户端启动时报failed to req API:/nacos/v1/ns/instance after all servers([127.0.0.1:8848])现象客户端应用无法连接到Nacos服务器。原因这是最常见的问题之一。根本原因是客户端获取到的Nacos服务器地址不对或者网络不通。排查检查客户端配置确保在bootstrap.yml或application.yml中spring.cloud.nacos.discovery.server-addr配置的是Nacos服务器可被客户端访问的IP:端口例如192.168.1.100:8848而不是127.0.0.1:8848。检查Nacos服务器IP配置回到我们之前强调的nacos.inetutils.ip-address。Nacos在注册服务实例时会把这个IP返回给客户端。如果这里设错了客户端拿到的服务实例地址就是错的。在服务器上运行hostname -I查看所有IP选择一个正确的配置。网络连通性在客户端服务器上用telnet nacos-ip 8848或curl -v http://nacos-ip:8848/nacos/测试网络和端口是否可达。问题5配置中心的热更新不生效现象在Nacos控制台修改了配置但客户端应用没有实时获取到新值。原因通常不是Nacos服务器的问题而是客户端配置或代码写法问题。解决检查客户端依赖确保引入了spring-cloud-starter-alibaba-nacos-config依赖。检查配置文件确保bootstrap.yml中正确配置了spring.cloud.nacos.config.server-addr和spring.cloud.nacos.config.file-extension如yaml。检查注解在需要动态刷新的Bean上通常是Controller,Service,Component添加RefreshScope注解。检查配置Data ID和Group确保客户端spring.cloud.nacos.config.name或默认的spring.application.name与Nacos上创建的Data ID匹配Group也一致。查看客户端日志开启客户端debug日志级别搜索Refresh相关日志看是否有拉取或刷新配置的记录。6.3 系统与资源类问题问题6运行一段时间后Nacos响应变慢或内存占用过高现象服务器负载升高Nacos控制台操作卡顿。排查检查日志查看nacos.log是否有频繁的Full GC记录。监控JVM使用jstat -gc pid或jmap -heap pid查看堆内存使用情况和GC状态。如果老年代Old Generation占用持续很高且Full GC频繁说明可能存在内存泄漏或堆内存设置过小。调整JVM参数根据服务器内存情况适当增加-Xmx值并优化GC参数例如使用G1垃圾回收器-XX:UseG1GC。检查数据库性能如果服务或配置数量极大MySQL可能成为瓶颈。检查MySQL的CPU、内存、慢查询日志。考虑为Nacos的核心表如config_info,his_config_info,instances添加索引。清理历史数据Nacos会保存配置的历史版本和已注销的服务实例信息。可以定期清理Nacos有提供清理接口但需谨慎操作或设置合理的保留策略。问题7如何优雅地停止和升级Nacos操作停止使用sudo systemctl stop nacos。切勿直接kill -9这可能导致数据不一致。备份升级前务必备份两样东西① Nacos的配置文件目录/opt/nacos/conf/② MySQL中的nacos数据库使用mysqldump。升级下载新版本的发布包解压到新目录如/opt/nacos-2.3.3。将旧版本的conf目录和data如果用了Derby目录复制到新版本对应位置。然后修改Systemd服务文件中的路径指向新版本目录执行daemon-reload后重启服务。回滚如果升级失败将服务文件路径改回旧版本并恢复数据库备份即可。部署和维护Nacos就像照料一个花园初次播种安装配置需要细致日常养护监控调优则决定了它能否长久健康地运行。从单机模式起步理解每一个配置项背后的含义扎实地做好持久化和安全加固你的微服务基石就已经非常稳固了。当业务增长到需要集群时你会发现今天的每一步准备都让明天的扩展更加顺理成章。记住多看看日志那是服务最直接的“语言”。