三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Ubuntu 22.04部署Nacos:从环境配置到生产级安全加固实战指南

Ubuntu 22.04部署Nacos:从环境配置到生产级安全加固实战指南

1. 项目概述:为什么要在Ubuntu上部署Nacos?

如果你正在搭建微服务架构,或者准备学习Spring Cloud Alibaba,那么Nacos这个名字你肯定不陌生。作为一个集服务发现、配置管理于一体的核心组件,Nacos已经成为了很多团队技术栈中的标配。但很多教程都集中在Windows或Docker环境,对于生产环境更常见的Linux服务器,特别是Ubuntu这类发行版,详细的、一步一坑的部署指南反而没那么好找。

我自己在从开发转向兼顾运维部署的过程中,就曾在Ubuntu上安装Nacos时踩过不少坑。比如,照着某篇教程装好了,一启动就闪退,日志也看不出个所以然;又比如,配置了集群,节点之间死活无法通信。这些经历让我意识到,一个看似简单的“安装配置”过程,背后其实藏着很多环境依赖、路径规划和参数调优的门道。今天,我就结合这些实战经验,为你梳理一份在Ubuntu 22.04 LTS上从零开始安装、配置并启动Nacos的完整指南。这份指南不仅会告诉你每一步怎么做,更会重点解释“为什么这么做”,以及那些容易忽略但至关重要的细节。

我们的目标很明确:在Ubuntu 22.04系统上,部署一个可以稳定运行的单机版Nacos,并完成基础的服务发现与配置管理功能验证。整个过程会涉及JDK环境准备、MySQL数据库初始化、Nacos服务包部署、系统服务集成以及基础功能测试。无论你是要在本地虚拟机搭建测试环境,还是在云服务器上部署生产应用,这篇内容都能给你提供直接的参考。

2. 环境准备:构建稳固的基石

在下载Nacos安装包之前,我们必须先把它的“家”给安顿好。Nacos的运行依赖于两个核心环境:Java运行时和持久化数据库。这一步没做对,后面所有的操作都是空中楼阁。

2.1 安装与配置Java环境

Nacos 2.x版本要求JDK 1.8或更高版本,但为了更好的性能和兼容性,我强烈推荐使用JDK 11或JDK 17。Ubuntu 22.04的默认仓库里提供了OpenJDK,这是最方便、最稳妥的选择。

首先,更新系统包列表并安装OpenJDK 11:

sudo apt update sudo apt install openjdk-11-jdk -y

安装完成后,验证一下安装是否成功:

java -version

你应该能看到类似openjdk version "11.0.22"的输出。这里有个关键点:仅仅安装JDK还不够,我们需要确保JAVA_HOME环境变量被正确设置。很多后续的脚本(包括Nacos自己的启动脚本)都会依赖这个变量来定位Java的安装路径。

查找Java的安装路径:

sudo update-alternatives --config java

记下输出结果中的路径,例如/usr/lib/jvm/java-11-openjdk-amd64。然后,编辑用户的环境变量配置文件(如果你希望对所有用户生效,可以编辑/etc/environment):

nano ~/.bashrc

在文件末尾添加以下两行:

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH

保存退出后,执行source ~/.bashrc使配置立即生效,并再次验证:

echo $JAVA_HOME

这个步骤千万不能省。我见过太多“Nacos闪退”的问题,最后追查下来都是因为JAVA_HOME没有正确设置,导致启动脚本找不到Java命令,或者找到了错误版本的Java。

2.2 初始化MySQL数据库

Nacos默认使用内嵌的Apache Derby数据库,但这仅适用于单机测试。任何有持久化需求或未来可能扩展的场景,都必须使用外置数据库,MySQL是最常见的选择。Ubuntu 22.04安装MySQL 8.0非常方便:

sudo apt install mysql-server -y

安装完成后,运行安全初始化脚本,设置root密码并移除一些不安全配置:

sudo mysql_secure_installation

接下来,我们需要为Nacos创建一个专用的数据库和用户。以root身份登录MySQL:

sudo mysql

在MySQL命令行中,依次执行以下SQL语句:

-- 创建一个名为nacos的数据库,使用utf8mb4字符集和更通用的排序规则 CREATE DATABASE IF NOT EXISTS nacos CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 创建一个名为nacos的用户,并设置一个强密码,这里示例为'Nacos@123456' CREATE USER 'nacos'@'%' IDENTIFIED BY 'Nacos@123456'; -- 授予nacos用户对nacos数据库的所有权限 GRANT ALL PRIVILEGES ON nacos.* TO 'nacos'@'%'; -- 刷新权限使更改生效 FLUSH PRIVILEGES; -- 退出MySQL EXIT;

这里有两个经验性的细节需要注意。第一,关于用户主机%:在生产环境中,为了安全,你可能会限制为localhost或特定IP。但在初次安装测试时,使用%(允许任何主机连接)可以避免因网络问题导致的连接失败,待一切调通后再收紧安全策略。第二,密码强度:务必使用包含大小写字母、数字和特殊字符的强密码,不要使用123456这类简单密码。

数据库创建好后,需要将Nacos的表结构导入。首先,我们需要下载Nacos的安装包。

3. 部署与配置Nacos服务

环境就绪后,我们就可以开始部署Nacos本体了。这个过程包括获取软件包、初始化数据库表结构、修改核心配置文件,以及最重要的——将Nacos配置为系统服务。

3.1 下载Nacos并初始化数据库

访问Nacos的GitHub Release页面,找到最新稳定版的压缩包。我们通常选择以.tar.gz结尾的压缩包。在服务器上,我们使用wget命令直接下载(请将链接替换为当时最新的稳定版链接):

cd /opt sudo wget https://github.com/alibaba/nacos/releases/download/2.3.0/nacos-server-2.3.0.tar.gz

下载完成后解压:

sudo tar -zxvf nacos-server-2.3.0.tar.gz sudo mv nacos /usr/local/

现在,Nacos的主目录就在/usr/local/nacos了。接下来,找到数据库初始化脚本。它位于/usr/local/nacos/conf目录下,文件名是nacos-mysql.sql。我们将其导入到之前创建的数据库中:

mysql -u nacos -p nacos < /usr/local/nacos/conf/nacos-mysql.sql

系统会提示你输入密码(即之前设置的Nacos@123456)。执行成功后,可以登录MySQL验证表是否创建成功:

mysql -u nacos -p USE nacos; SHOW TABLES;

你应该能看到config_info,users等一堆表。这一步如果出错,最常见的原因是数据库连接信息(用户名、密码、主机权限)不对,请回头检查2.2节的步骤。

3.2 配置Nacos连接外部数据库

Nacos的配置文件集中在/usr/local/nacos/conf目录。我们需要修改application.properties文件,将数据库连接从内嵌的Derby切换到我们刚配置好的MySQL。

sudo nano /usr/local/nacos/conf/application.properties

找到文件中关于数据库配置的部分(通常被注释掉了),修改为以下内容:

# 启用数据库存储 spring.datasource.platform=mysql # 数据库实例数量,单机部署为1 db.num=1 # 第一个数据库的连接信息 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0=nacos db.password.0=Nacos@123456

这里有三个关键的配置项需要你根据实际情况调整:

  1. db.url.0中的127.0.0.1:3306:如果你的MySQL安装在另一台服务器,需要改为对应的IP和端口。
  2. useSSL=false:在内部网络或测试环境,可以禁用SSL以简化连接。在生产环境并跨公网访问时,务必设置为true并配置正确的证书
  3. serverTimezone=UTC:这里设置数据库连接的时区为UTC,确保时间戳处理一致。你也可以设置为Asia/Shanghai等,但要保证MySQL服务器和Nacos服务器的时区设置一致,否则在管理配置时可能会遇到时间显示问题。

3.3 创建系统服务实现开机自启

直接通过脚本启动Nacos不是长久之计,我们需要将其注册为systemd服务,实现开机自启、方便地启停和日志集中管理。

首先,创建一个systemd服务单元文件:

sudo nano /etc/systemd/system/nacos.service

将以下内容粘贴进去:

[Unit] Description=Nacos Server After=network.target mysql.service Wants=network.target mysql.service [Service] Type=forking # 设置环境变量,确保JAVA_HOME被识别 Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64" # 启动脚本路径 ExecStart=/usr/local/nacos/bin/startup.sh -m standalone ExecStop=/usr/local/nacos/bin/shutdown.sh # 如果服务失败,在10秒后重启 Restart=on-failure RestartSec=10 # 重要:指定运行用户和组,不要用root User=nobody Group=nogroup # 安全限制,防止服务占用过多资源 LimitNOFILE=65535 LimitNPROC=65535 [Install] WantedBy=multi-user.target

这个配置文件有几个设计点需要解释:

  • After=mysql.service:这确保了Nacos服务会在MySQL服务完全启动之后才启动,避免了因数据库未就绪而导致的启动失败。
  • Type=forking:因为Nacos的启动脚本(startup.sh)会启动一个后台进程然后自己退出,所以服务类型需要设为forking
  • User=nobodyGroup=nogroup:这是出于安全考虑,让Nacos以一个非特权用户运行。但这里有个大坑nobody用户默认可能没有对Nacos日志目录(/usr/local/nacos/logs)的写入权限,会导致启动失败。你有两个选择:1) 将目录权限授予nobody(sudo chown -R nobody:nogroup /usr/local/nacos/logs);2) 创建一个专用的系统用户来运行,例如sudo useradd -r -s /bin/false nacosuser,然后在配置文件中使用User=nacosuser。我推荐第二种,更清晰安全。
  • LimitNOFILE:提高进程可打开的文件描述符数量,对于高并发的服务发现场景很重要。

保存文件后,重新加载systemd配置,启动Nacos服务并设置开机自启:

sudo systemctl daemon-reload sudo systemctl start nacos.service sudo systemctl enable nacos.service

检查服务状态和日志,确认启动成功:

sudo systemctl status nacos.service sudo tail -f /usr/local/nacos/logs/start.out

如果状态显示active (running),并且日志中没有明显的错误信息,最后出现Nacos started successfully in stand alone mode,那么恭喜你,Nacos服务已经成功运行了!默认情况下,它监听在8848端口。你可以在服务器本机通过curl localhost:8848/nacos/测试,或者在浏览器访问http://你的服务器IP:8848/nacos

4. 基础功能验证与安全加固

服务跑起来只是第一步,我们还需要验证其核心功能是否正常,并对默认的安全设置进行加固,为后续的使用扫清障碍。

4.1 访问控制台与基础功能测试

在浏览器中输入http://<你的服务器IP>:8848/nacos,你应该能看到Nacos的登录页面。默认的用户名和密码都是nacos。这是一个非常重要的安全风险点,我们稍后就必须修改它。

登录后,你可以进行以下快速测试,确保服务发现和配置管理两大核心功能正常:

  1. 服务注册与发现测试

    • 进入“服务管理” -> “服务列表”。
    • 点击“注册服务”。你可以模拟注册一个服务,例如服务名填test-service,分组填DEFAULT_GROUP,临时实例的IP和端口可以随意填一个(如127.0.0.1:8080)。点击注册。
    • 在服务列表中,你应该能看到刚注册的test-service,并且健康状态为“健康”(虽然是我们模拟的)。这证明服务注册功能正常。
  2. 配置管理测试

    • 进入“配置管理” -> “配置列表”。
    • 点击“+”创建配置。Data ID 填test.properties,分组填DEFAULT_GROUP,配置格式选Properties。在配置内容里随便写点东西,比如server.port=8080
    • 点击“发布”。发布成功后,在配置列表中找到它,可以点击“详情”查看,或“编辑”修改。这证明配置的发布、存储和读取功能正常。

4.2 修改默认密码与增强安全

现在,我们必须立刻处理那个广为人知的默认密码。在Nacos控制台,点击右上角用户名,进入“权限控制” -> “用户管理”。找到nacos用户,点击“修改”。输入一个复杂的新密码并保存。

但是,仅仅修改控制台密码还不够。Nacos提供了一个服务端认证的插件机制。对于生产环境,我强烈建议开启服务端鉴权,这样客户端连接时也需要提供身份凭证。

编辑Nacos的配置文件:

sudo nano /usr/local/nacos/conf/application.properties

找到并修改以下配置:

# 开启鉴权 nacos.core.auth.enabled=true # 设置用于生成JWT Token的密钥,务必修改为一个复杂的随机字符串 nacos.core.auth.server.identity.key=your-custom-secret-key-here nacos.core.auth.server.identity.value=your-custom-secret-value-here # 设置Token过期时间(单位秒),默认18000(5小时) nacos.core.auth.plugin.nacos.token.expire.seconds=18000 # (可选)允许携带认证信息的用户列表,用于内部系统调用,按需配置 nacos.core.auth.enable.userAgentAuthWhite=false

修改完成后,重启Nacos服务使配置生效:

sudo systemctl restart nacos.service

重启后,客户端(如Spring Cloud应用)在连接Nacos时,就需要在配置文件中增加用户名和密码了:

spring.cloud.nacos.discovery.username=nacos spring.cloud.nacos.discovery.password=你的新密码 spring.cloud.nacos.config.username=nacos spring.cloud.nacos.config.password=你的新密码

这个步骤能有效防止未经授权的服务随意注册或拉取敏感配置,是生产部署的必备操作。

4.3 防火墙与网络访问控制

Ubuntu 22.04默认使用ufw作为防火墙管理工具。我们需要开放Nacos的访问端口(默认8848),同时限制访问来源以增强安全。

# 启用UFW(如果尚未启用) sudo ufw enable # 允许SSH端口(确保你不会把自己关在外面) sudo ufw allow 22/tcp # 允许特定IP段访问Nacos端口,例如只允许办公室IP 192.168.1.0/24 sudo ufw allow from 192.168.1.0/24 to any port 8848 # 或者,在测试阶段可以先允许所有IP访问(生产环境不推荐) # sudo ufw allow 8848/tcp # 查看规则 sudo ufw status numbered

通过限制访问来源IP,可以将Nacos控制台的暴露面降到最低。此外,如果Nacos部署在云服务器上,别忘了检查云服务商的安全组规则,也需要做相应的端口开放和IP限制。

5. 生产环境考量与常见故障排查

将Nacos用于开发测试和用于生产环境,关注点完全不同。单机模式无法保证高可用,任何故障都会导致整个微服务体系瘫痪。因此,生产部署必须考虑集群模式。

5.1 从单机迈向集群部署

Nacos集群部署的核心思想是让多个Nacos节点组成一个集群,共同对外提供服务,实现负载均衡和高可用。集群部署需要解决两个问题:数据一致性节点间状态同步。Nacos使用Raft协议来选举Leader处理写请求,确保数据一致性。

部署一个最小化的三节点集群,你需要:

  1. 准备至少三台服务器(或虚拟机),每台都重复上述单机安装的步骤,确保JDK、MySQL环境一致。
  2. 使用同一个MySQL数据库:所有Nacos节点应该连接至同一个MySQL数据库实例(或主从复制的集群),这样配置数据才能集中存储。切记不要每个节点用独立的数据库
  3. 配置集群节点信息:在每个节点的/usr/local/nacos/conf目录下,有一个cluster.conf.example文件。复制它并命名为cluster.conf
    cp cluster.conf.example cluster.conf nano cluster.conf
    在文件中,列出所有集群节点的IP和端口(端口默认是8848,但集群通信端口是偏移量后的7848,这里写应用端口即可):
    192.168.1.101:8848 192.168.1.102:8848 192.168.1.103:8848
    每个节点的这个文件内容必须完全一致。
  4. 修改启动模式:将每个节点systemd服务文件(nacos.service)中的启动命令,从-m standalone改为-m cluster
  5. 配置负载均衡:在客户端应用和Nacos集群之间,需要部署一个负载均衡器(如Nginx)。客户端的配置文件中,spring.cloud.nacos.config.server-addrspring.cloud.nacos.discovery.server-addr应指向这个负载均衡器的地址,例如lb.example.com:8848

集群部署的复杂度和维护成本远高于单机,但它带来的高可用性是生产系统不可或缺的。

5.2 实战中遇到的典型问题与解决方案

即便按照教程一步步操作,你也可能会遇到一些“坑”。下面是我总结的几个常见问题及其排查思路:

问题一:Nacos启动后立刻闪退,start.out日志文件为空或很小。

  • 排查思路
    1. 检查JAVA_HOME:这是最常见的原因。运行echo $JAVA_HOME,确保输出正确的路径,并且该路径下存在bin/java可执行文件。务必在systemd服务文件中也通过Environment指令显式设置JAVA_HOME
    2. 检查启动脚本权限:确保/usr/local/nacos/bin目录下的.sh脚本有执行权限 (chmod +x *.sh)。
    3. 查看更详细的日志:除了start.out,重点检查/usr/local/nacos/logs/nacos.log。闪退的根因通常记录在这里。
    4. 检查数据库连接:确认application.properties中的数据库连接信息(URL、用户名、密码)百分百正确,并且MySQL服务已启动,nacos用户有远程连接权限(如果IP不是127.0.0.1)。

问题二:客户端服务无法注册到Nacos,报连接超时或拒绝连接。

  • 排查思路
    1. 网络连通性:在客户端服务器上,使用telnet <nacos服务器IP> 8848测试端口是否通畅。如果不通,检查Nacos服务器防火墙(ufw)、云安全组规则。
    2. Nacos服务状态:在Nacos服务器上,用sudo systemctl status nacosnetstat -tlnp | grep 8848确认服务确实在运行并监听在正确端口。
    3. 客户端配置:检查客户端配置文件中的spring.cloud.nacos.discovery.server-addr的IP和端口是否正确。如果是集群,是否指向了负载均衡器地址。
    4. 鉴权问题:如果你开启了服务端鉴权 (nacos.core.auth.enabled=true),客户端配置中必须提供正确的usernamepassword

问题三:Nacos控制台可以登录,但页面加载缓慢或经常出错。

  • 排查思路
    1. 资源不足:检查服务器内存和CPU使用情况。Nacos单机至少需要1-2GB的堆内存。可以通过修改/usr/local/nacos/bin/startup.sh中的JVM参数来调整,例如将-Xms-Xmx从默认的1g改为2g。
    2. 数据库性能:如果配置项非常多,MySQL可能成为瓶颈。检查MySQL的慢查询日志,考虑对config_info等核心表进行索引优化。
    3. 前端资源加载:检查浏览器控制台(F12)是否有JS或CSS文件加载失败。可能是网络问题,也可能是Nacos版本的前端资源存在bug,尝试清除浏览器缓存或使用无痕模式。

问题四:修改配置后,客户端无法实时接收到配置更新(配置热更新失效)。

  • 排查思路
    1. 客户端长连接:Nacos配置热更新依赖于客户端与服务器保持的长轮询连接。检查客户端日志,看是否有关于“long-polling”的错误。
    2. 客户端配置:确保在Spring Boot客户端中,使用了@RefreshScope注解,并且依赖了spring-cloud-starter-alibaba-nacos-config
    3. 网络策略:某些严格的网络策略或代理可能会中断长连接。检查客户端与Nacos服务器之间的网络环境。
    4. Nacos服务器日志:查看Nacos服务器的nacos.log,确认配置发布事件是否被正常记录和推送。

把Nacos在Ubuntu上跑起来只是起点,让它稳定、高效、安全地支撑起你的微服务体系,才是真正的目标。这份指南里的每一个步骤和提醒,都来自实际运维中的经验教训。特别是环境变量、服务用户权限、默认密码修改和防火墙规则这几处,看似简单,却往往是拦路虎。建议你在完成基础部署后,花点时间按照“生产环境考量”部分的内容,至少把安全加固做完,并为未来的集群化留好扩展思路。

← 返回列表