CentOS搭建:Nacos
一、环境依赖
| 软件/环境 | 版本 | 包名 | 方式 | 备注 |
|---|---|---|---|---|
| Linux | CentOS 7.x | 需确保系统网络正常、权限充足 | ||
| JDK | 1.8+ | Nacos运行核心依赖 | ||
| MySQL | 5.7+ 或 8.0+ | 存储Nacos配置数据 | ||
| Nacos | 1.2.1 | nacos-server-1.2.1.tar.gz | 官网下载 | |
| 2.4.3 | nacos-server-2.4.3.tar.gz | gRPC端口配置需适配 |
二、Nacos单机搭建
1. 解压缩安装包
# 假设安装包存放在/soft目录下,解压并命名为指定版本目录
sudo tar -zxvf /soft/nacos-server-1.2.1.tar.gz -C /soft/
sudo mv /soft/nacos /soft/nacos-server-1.2.12. 初始化数据库
Nacos单机需依赖MySQL存储配置,需先创建数据库并执行初始化脚本:
# 登录退出MySQL
mysql -u root -p
# 创建nacos_config数据库(支持utf8mb4编码)
CREATE DATABASE IF NOT EXISTS `nacos_config` DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;
# 查看数据库
show databases;
# 切换至nacos_config数据库
use nacos_config;
# 执行Nacos自带的初始化脚本(路径需替换为实际解压路径)
source /soft/nacos/nacos-server-1.2.1/conf/nacos-mysql.sql;
# 退出MySQL
exit;3. 修改数据库配置
# 查看配置文件
ll -a /soft/nacos/nacos-server-1.2.1/conf |grep properties
# 备份(避免误改丢失原配置)
sudo cp /soft/nacos/nacos-server-1.2.1/conf/application.properties /soft/nacos/nacos-server-1.2.1/conf/application.properties.bak20240801# 编辑配置文件
sudo vi /soft/nacos/nacos-server-1.2.1/conf/appliation.properties在配置文件中添加/修改以下内容(配置MySQL连接信息,需替换IP、端口、密码为实际MySQL信息):
#*************** Config Module Related Configurations ***************#
### If user MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://IP:端口/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=密码(root)4. 新增用户并赋权
创建专用nacos用户(非交互用户,仅用于运行服务),避免使用root权限:
# 强制创建nacos用户组(-f:已存在则不报错)
sudo groupadd -f nacos
# 创建nacos用户,归属nacos组,禁止交互登录
sudo useradd -g nacos nacos -s /sbin/nologin
# 验证用户创建结果
id nacos
getent passwd nacos
getent passwd nacos | cut -d: -f7-s /sbin/nologin:设置用户为非标准方式登录到系统,用户只用于运行服务,而不需要直接的交互。
# 授权nacos用户为目录属主(递归授权所有子文件)
sudo chown -R nacos:nacos /soft/nacos-server-1.2.1/
# 查看目录的属主
ll -a /soft |grep nacos# 给bin目录下所有脚本添加执行权限(关键:确保启动/停止脚本可运行)
sudo chmod +x /soft/nacos-server-1.2.1/bin/*5. 配置systemd服务管理
通过systemd实现服务启停、开机自启:
ll -a /etc/systemd/system |grep nacos
# 编辑nacos服务配置文件
sudo vi /etc/systemd/system/nacos.service添加以下内容(替换JAVA_HOME和Nacos路径为实际值):
[Unit]
Description=nacos
After=network.target
[Service]
Type=forking
# 使用的用户和组
User=nacos
Group=nacos
# 配置JDK环境变量(替换为实际JAVA_HOME路径)
Environment="JAVA_HOME=/soft/jdk/jdk1.8.0_411"
# 单机启动命令(-m standalone指定单机模式)
ExecStart=/soft/nacos-server-1.2.1/bin/startup.sh -m standalone
# 停止命令
ExecStop=/soft/nacos-server-1.2.1/bin/shutdown.sh
# 重载命令(先停止再启动,确保配置生效)
ExecReload=/soft/nacos-server-1.2.1/bin/shutdown.sh && /soft/nacos-server-1.2.1/bin/startup.sh -m standalone
#
PrivateTmp=true
# 服务异常时自动重启
Restart=on-failure
[Install]
WantedBy=multi-user.target6. 启动服务并配置开机自启
# 重新加载systemd配置(识别新创建的nacos服务)
sudo systemctl daemon-reload
# 查看服务状态
sudo systemctl status nacos.service
# 启动服务
sudo systemctl start nacos.service
# 设置开机自启
sudo systemctl enable nacos.service
# 验证开机自启配置
sudo systemctl is-enabled nacos.service7. 防火墙端口开放
Nacos单机需开放以下端口:
# 8848:Nacos核心端口(HTTP访问、服务注册发现)
firewall-cmd --add-port=8848/tcp --permanent
# 9848:客户端gRPC请求端口(客户端与服务端通信)
firewall-cmd --add-port=9848/tcp --permanent
# 重新加载防火墙规则(使配置生效)
firewall-cmd --reload
# 查看已开放端口
firewall-cmd --list-ports8. 访问验证
- 默认访问地址:http://服务器IP:8848/nacos
- 默认账号/密码:nacos/nacos(首次登录建议修改密码)
三、Nacos集群搭建
1. 环境准备
- 至少3台CentOS 7.x服务器(推荐配置:2核4G以上)
- 所有节点已安装JDK 1.8+、MySQL 5.7+(MySQL建议主从复制,确保高可用)
- 所有节点网络互通(关闭防火墙或开放相关端口)
- 统一Nacos版本(以1.2.1为例)
2. 解压缩安装包(所有节点执行)
# 创建Nacos安装目录
sudo mkdir -p /opt/nacos
# 上传安装包至/opt/nacos目录,解压
sudo tar -zxvf /opt/nacos/nacos-server-1.2.1.tar.gz -C /opt/nacos/
# 进入解压后的目录
cd /opt/nacos/nacos3. 修改集群配置(所有节点执行)
# 复制集群配置模板
cd /opt/nacos/nacos/conf/
sudo cp cluster.conf.example cluster.conf
# 编辑集群配置(添加所有节点的IP:端口,默认端口8848)
sudo vim cluster.conf- 添加集群节点信息(替换为实际服务器IP),示例如下:
10.237.198.132
10.237.198.58
10.237.198.574. 修改数据库配置(所有节点执行)
集群共享同一MySQL数据库(需确保所有节点能访问MySQL服务):
- 初始化数据库
# 登录退出MySQL
mysql -u root -p
# 创建nacos_config数据库(支持utf8mb4编码)
CREATE DATABASE IF NOT EXISTS `nacos_config` DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;
# 查看数据库
show databases;
# 切换至nacos_config数据库
use nacos_config;
# 执行Nacos自带的初始化脚本(路径需替换为实际解压路径)
source /soft/nacos/nacos-server-1.2.1/conf/nacos-mysql.sql;
# 退出MySQL
exit;- 修改数据库配置
# 备份配置文件
sudo cp /opt/nacos/nacos/conf/application.properties /opt/nacos/nacos/conf/application.properties.bak20240801
# 编辑配置文件
sudo vim /opt/nacos/nacos/conf/application.properties添加以下内容(替换为实际MySQL集群地址和密码):
#*************** Config Module Related Configurations ***************#
### If user MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://10.237.198.58:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=mLEh:*#gu6ok5. 权限配置(所有节点执行)
# 创建nacos用户组和用户
sudo groupadd -f nacos
sudo useradd -g nacos nacos -s /sbin/nologin
# 授权目录属主
sudo chown -R nacos:nacos /opt/nacos/
# 给bin目录脚本添加执行权限
sudo chmod +x /opt/nacos/nacos/bin/*6. 启动集群(所有节点执行)
# 进入bin目录
cd /opt/nacos/nacos/bin/
# 停止已有服务(若存在)
sudo ./shutdown.sh
# 启动集群(默认cluster模式,无需加-m参数)
sudo ./startup.sh
# 查看启动日志(验证是否启动成功)
tail -500f /opt/nacos/nacos/logs/start.out启动成功标志:日志中显示Nacos cluster is starting successfully in cluster mode.
7. 防火墙配置(所有节点执行)
# 开放核心端口
firewall-cmd --add-port=8848/tcp --permanent # 核心HTTP端口
firewall-cmd --add-port=9848/tcp --permanent # 客户端gRPC端口
firewall-cmd --add-port=9858/tcp --permanent # 服务端gRPC端口
firewall-cmd --reload四、Nginx反向代理Nacos指南(含适配gRPC端口适配)
Nginx反向代理Nacos的核心差异源于Nacos 2.0+版本新增的gRPC通信机制,需针对1.X和2.X版本分别配置。
环境要求
| 组件 | 版本要求 | 说明 |
|---|---|---|
| Nginx | 1.9.0+(2.X代理必需) | 1.9.0及以上支持stream模块,用于TCP转发(适配gRPC);1.X代理可使用低版本,但建议同步升级 |
| Nacos | 1.X/2.X | 需明确集群节点的IP和端口(单机/集群均适用) |
| 网络 | 端口开放 | 确保Nginx可访问Nacos节点,客户端可访问Nginx代理端口 |
核心端口说明
- Nacos 1.X端口(无gRPC)
| 端口 | 用途 | 代理方式 |
|---|---|---|
| 8848(默认) | HTTP协议端口(配置/服务发现/控制台) | HTTP反向代理 |
- Nacos 2.X端口(新增gRPC)
Nacos 2.X在主端口(默认8848)基础上通过偏移量生成gRPC端口,无需手动配置,但需代理对应端口:
| 端口 | 与主端口偏移量 | 用途 | 代理方式 | 暴露范围 |
|---|---|---|---|---|
| 8848(默认) | - | HTTP协议端口(兼容1.X) | HTTP反向代理 | 客户端+控制台 |
| 9848 | +1000 | 客户端→服务端gRPC通信 | TCP转发 | 客户端 |
| 9849 | +1001 | 服务端→服务端gRPC同步 | 无需代理(内部通信) | 禁止暴露到外部 |
| 7848 | -1000 | Jraft集群通信 | 无需代理(内部通信) | 禁止暴露到外部 |
注意:若Nacos主端口非默认(如8850),则gRPC端口自动计算(8850+1000=9850),需同步代理对应端口。
1. 分版本代理配置步骤
场景1:代理Nacos 1.X(单机/集群)
Nacos 1.X仅依赖HTTP协议,配置简单的HTTP反向代理即可。
Nginx配置(nginx.conf)
http {
# 其他原有配置(如mime.types、log_format等)保持不变
upstream nacos-http {
# 集群节点配置:IP:主端口,多个节点用空格分隔
server 192.168.1.100:8848 weight=1;
server 192.168.1.101:8848 weight=1;
server 192.168.1.102:8848 weight=1;
# 单机配置:仅保留一个节点
# server 192.168.1.100:8848;
}
server {
listen 8080; # Nginx代理端口(客户端/控制台访问此端口)
server_name localhost; # 可改为实际域名(如nacos.example.com)
location /nacos/ {
proxy_pass http://nacos-http/nacos/; # 末尾/必须保留,避免路径错乱
# 请求头配置
proxy_set_header Host $host; # 传递客户端请求的主机名(容错性强,无 Host 头时回退到 server_name)
proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实 IP(直接与 Nginx 连接的 IP)
proxy_set_header X-Real-Port $remote_port; # 传递客户端真实访问端口(补充端口信息,便于后端统计)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递代理链路 IP 列表(格式:客户端IP, 一级代理IP, 二级...)
proxy_set_header X-Forwarded-Proto $scheme; # 传递真实协议(http/https,解决代理后后端无法识别协议的问题)
proxy_set_header X-Forwarded-Path $request_uri; # 传递客户端请求的完整路径(含参数)
}
}
}配置验证
- 访问
http://nginx-ip:8080/nacos/,能正常登录Nacos控制台即说明HTTP代理生效。 - 客户端配置
server-addr: nginx-ip:8080,测试服务注册/配置拉取,无报错即成功。
场景2:代理Nacos 2.X(单机/集群)
Nacos 2.X需同时代理HTTP端口(8848)和客户端gRPC端口(9848),且gRPC需用TCP转发(stream模块)。
前提:启用Nginx stream模块
- 若Nginx未安装stream模块(低版本默认不包含),需重新安装或添加模块:
- CentOS/RHEL:
yum install -y nginx-mod-stream(自动启用模块) - 源码编译:编译时添加
--with-stream参数
- CentOS/RHEL:
Nginx配置(nginx.conf)
stream模块与http模块同级,需同时配置TCP转发(gRPC)和HTTP代理(兼容旧版+控制台):
# 1. TCP转发配置(适配gRPC)
stream {
upstream nacos-grpc {
# 集群节点:IP:gRPC端口(主端口+1000),多个节点用空格分隔
server 192.168.1.100:9848 weight=1;
server 192.168.1.101:9848 weight=1;
server 192.168.1.102:9848 weight=1;
# 单机配置:仅保留一个节点
# server 192.168.1.100:9848;
}
server {
listen 9090; # Nginx代理gRPC端口(客户端需访问此端口,与HTTP代理端口独立)
proxy_pass nacos-grpc;
proxy_timeout 300s; # gRPC长连接超时,建议设置为300s+
proxy_connect_timeout 5s; # 连接超时时间
}
}
# 2. HTTP代理配置(兼容1.X客户端+控制台)
http {
# 其他原有配置保持不变
upstream nacos-http {
server 192.168.1.100:8848 weight=1;
server 192.168.1.101:8848 weight=1;
server 192.168.1.102:8848 weight=1;
}
server {
listen 8080; # Nginx代理HTTP端口(控制台/1.X客户端访问)
server_name localhost;
location /nacos/ {
proxy_pass http://nacos-http/nacos/;
# 请求头配置
proxy_set_header Host $host; # 传递客户端请求的主机名(容错性强,无 Host 头时回退到 server_name)
proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实 IP(直接与 Nginx 连接的 IP)
proxy_set_header X-Real-Port $remote_port; # 传递客户端真实访问端口(补充端口信息,便于后端统计)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递代理链路 IP 列表(格式:客户端IP, 一级代理IP, 二级...)
proxy_set_header X-Forwarded-Proto $scheme; # 传递真实协议(http/https,解决代理后后端无法识别协议的问题)
proxy_set_header X-Forwarded-Path $request_uri; # 传递客户端请求的完整路径(含参数)
}
}
}客户端配置适配
Nacos 2.X客户端默认通过主端口+偏移量(1000)计算gRPC端口,需根据代理场景调整:
场景A:客户端仅配置HTTP代理端口(推荐)
客户端配置server-addr: nginx-ip:8080,自动通过偏移量计算gRPC代理端口(8080+1000=9090),无需额外配置。要求:Nginx的gRPC代理端口必须等于HTTP代理端口+1000(如HTTP=8080→gRPC=9090)。
场景B:自定义gRPC代理端口(非偏移量)
若需修改gRPC代理端口(如HTTP=8080,gRPC=9191),需通过JVM参数指定偏移量:
客户端启动时添加参数:-Dnacos.server.grpc.port.offset=1110(8080+1110=9191)。1.X客户端兼容:直接配置
server-addr: nginx-ip:8080,无需修改(2.X服务端兼容1.X客户端)。
配置验证
- 控制台验证:访问
http://nginx-ip:8080/nacos/,正常登录即HTTP代理生效。 - gRPC验证:客户端启动后无
Client not connected, current status:STARTING报错,服务注册/配置拉取正常即TCP转发生效。
2. 关键注意事项
端口暴露安全
- 仅暴露Nginx代理端口(如8080、9090),禁止将Nacos节点的9849、7848端口暴露到外部网络(仅服务端内部通信)。
- 生产环境建议通过防火墙限制访问来源(如仅允许应用服务器访问Nginx代理端口)。
Nginx配置禁忌
- 2.X代理时,gRPC端口必须用TCP转发(stream模块),不可用HTTP/HTTP2转发,否则Nginx会断开长连接。
- location路径末尾必须加
/(如/nacos/),避免代理后路径拼接错误(如/nacosv1/变成/nacosv1nacos/)。 - 集群配置时,upstream中所有Nacos节点的主端口和gRPC端口需对应一致(如主端口8848→gRPC 9848,主端口8850→gRPC 9850)。
版本兼容性
- 2.X客户端无法连接1.X服务端,若代理1.X服务端,客户端需使用1.X版本。
- 1.X客户端可连接2.X服务端(通过HTTP代理端口),无需修改配置。
生产环境优化建议
- 启用Nginx健康检查:在upstream中添加
max_fails=3 fail_timeout=30s,自动剔除故障节点。 - 配置SSL:为Nginx代理端口启用HTTPS(避免明文传输),gRPC端口可配合SSL配置(需Nginx 1.15+)。
- 日志配置:开启Nginx的access.log和error.log,便于排查代理层面的问题。
- 负载均衡算法:默认使用轮询,可根据需求改为
ip_hash(会话保持)或least_conn(最小连接数)。
3. 常见问题排查
问题1:客户端报错Client not connected, current status:STARTING
- 原因:gRPC端口未代理或代理方式错误(用了HTTP而非TCP)。
- 排查步骤:
- 检查Nginx是否配置stream模块,且gRPC代理端口与客户端计算的端口一致。
- 用
telnet nginx-ip:9090测试端口连通性,不通则检查防火墙/安全组。 - 确认Nacos节点的gRPC端口(如9848)已正常监听(
netstat -tuln | grep 9848)。
问题2:控制台可访问,但服务注册失败
- 原因:仅配置了HTTP代理,未配置gRPC端口代理(2.X场景)。
- 解决:按场景2补充stream模块配置,确保gRPC端口转发生效。
问题3:Nacos集群选主失败(报错server is DOWN now)
- 原因:Nacos 1.4+用Jraft选主,重启后IP变动导致数据不一致。
- 解决:删除Nacos节点的
data目录,或启动时添加参数-Dnacos.server.ip=固定IP,并在cluster.conf中配置固定IP+端口。
问题4:自定义Nacos主端口后,gRPC代理失效
- 原因:gRPC端口未按新主端口计算(如主端口8850→gRPC 9850,但代理仍指向9848)。
- 解决:upstream中gRPC节点的端口改为“新主端口+1000”(如8850→9850)。
参考资料
致谢
- centos7部署Nacos(超详细)
- CentOS 7 安装 Nacos(单例模式)
- Nacos官方文档 - 集群部署
- Nacos 2.0.0 兼容性文档
- Client not connected, current status:STARTING
- 服务注册不到Nginx代理的Nacos集群上的问题(已解决)
- 记录nacos2.0+使用nginx代理出现的问题
- 如何设置nacos客户端连接服务端时使用的grpc端口的默认偏移量
- nacos2.x默认端口为8848、9848、9849,客户端连接时只能配置管理端访问端口8848,我想要配置其他两个端口,该怎么做
- 彻底绕开9848冲突:3种自定义Nacos gRPC端口的权威配置方式【待验证】