Linux|服务器|二进制部署nacos(不是集群,单实例)(2025了,不允许还有人不会部署nacos)

发布于:2025-07-14 ⋅ 阅读:(13) ⋅ 点赞:(0)

一、

前言

naocs是一个服务治理软件,如果没有记错的话,该软件是阿里出品的,后面该软件开源在了apache社区

那么,现在市面上有N多的服务治理,服务管理软件,本文不打算讨论什么consul,etcd,Eureka,zookeeper等等软件和nacos的性能差异,本文只强调一点,nacos可以作为 Spring Cloud Alibaba 的组件,提供动态服务注册与发现功能,支持服务实例的心跳监测和清单更新,帮助实现服务治理的自动化

nacos的软件架构是由java语言编写的j一个jar包,也就是说一个jar包打天下

nacos的部署方式非常多,docker,podman,二进制,源码,rpm等等方式都是支持的,不过需要明确的是,主流部署方式就docker,二进制;源码部署需要很多的条件,难度较高,因此一般不采用的

nacos由于是带有web管理界面的,因此,该软件需要做数据持久化,也就是微服务的版本控制管理功能需要数据持久化,通俗说需要外部数据源

nacos的数据持久化比较特殊,主要是三种方式

第一种是内嵌数据库,也就是derby嵌入式数据库,德比(Apache Derby)是一个开源的关系型数据库管理系统,基于Java语言开发,支持嵌入式数据库应用场景,适用于轻量级数据存储需求。该系统采用嵌入式架构模式,无需独立服务器即可运行,支持标准SQL语法及ACID事务特性。这里需要明确一点,nacos的单节点启动方式才适用使用derby嵌入式数据库,单节点启动也可以使用外部数据源;集群启动方式必须使用下面的两种方式,也就是必须使用外部数据源做数据持久化

如下图所示,Nacos started successfully in stand alone mode. use embedded storage ,这个时候单实例启动才是使用的内嵌德比数据库

第二种是MySQL数据库,nacos从2.2版本包括此版本之后都支持MySQL数据库,无需任何改造,原生支持

如下图,这个时候是单实例启动的nacos,可以使用外部数据源,也就是external storage

第三种是pg数据库,Oracle数据库以及高斯等等其它数据库,nacos从2.2版本包括此版本之后都支持,需要源码改造,二进制部署方式无法使用,改造难度比较高

下面将就如何在Linux下使用二进制nacos部署单实例nacos以及使用二进制nacos部署集群nacos(外部数据源使用MySQL数据库)

二、

naocs的架构

[root@centos14 ~]# ls -alh nacos-server-2.2.3.zip 
-rw-r--r-- 1 root root 143M Jul  3 21:43 nacos-server-2.2.3.zip
[root@centos14 ~]# cd nacos
[root@centos14 nacos]# ll
total 28
drwxr-xr-x 4 root root   123 Jul  6 13:31 bin
drwxr-xr-x 4 root root   296 Jul  5 13:41 conf
drwxr-xr-x 5 root root    54 Jul  3 22:21 data
-rw-r--r-- 1 root root 16583 Mar  6  2023 LICENSE
drwxr-xr-x 2 root root  4096 Jul  3 22:44 logs
-rw-r--r-- 1 root root  1305 May 14  2020 NOTICE
drwxr-xr-x 4 root root    36 Jul  3 22:21 plugins
drwxr-xr-x 2 root root    30 Jul  6 13:30 target

一般下载下来的nacos二进制解压后,大概如上图所示(没有plugins这个目录,这个目录我后面创建的),target目录下就是该软件最主要的部分,一个名为nacos-server.jar的jar包,打开jar包后,就可以知道该软件是哪个版本了:

其它目录比如bin目录,只是启动脚本(Windows下的和Linux下的);conf目录,是jar包运行时候的配置文件以及用于配置集群的文件以及内嵌tomcat用于web管理界面;logs目录当然就是服务运行时的存放目录;整体结构比较简单明了

在启动脚本内,可以看到需要jdk版本为8或者以上

nacos的下载地址如下:

发布历史 | Nacos 官网

三、

nacos二进制安装步骤

1、

jdk环境

验证是否具备jdk环境

jdk环境部署就不在这里过多废话了,太基础的东西,一般安装jdk8就可以了

环境变量如下:

JAVA_HOME=/usr/local/jdk
PATH=.$PATH:$JAVA_HOME/bin
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export CLASSPATH PATH JAVA_HOME

2、

MySQL数据库

这个也没什么好说的,数据库部署完毕后,可以navicat正常连接就可以了,本次案例使用的服务器IP是192.168.123.14,数据库版本是MySQL-7.43,数据库部署完毕后需要测试远程连接是否正常

需要数据库创建名为nacos的库

3、

修改nacos的配置文件

主要是nacos服务端口放开,开启鉴权,写入MySQL数据库的连接地址

#*************** Spring Boot Related Configurations ***************#
### Default web context path:
server.servlet.contextPath=/nacos
### Include message field
server.error.include-message=ALWAYS
### Default web server port:
server.port=18848

#*************** Network Related Configurations ***************#
### If prefer hostname over ip for Nacos server addresses in cluster.conf:
# nacos.inetutils.prefer-hostname-over-ip=false

### Specify local server's IP:
# nacos.inetutils.ip-address=


#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
#spring.datasource.platform=mysql
#spring.sql.init.platform=mysql

### Count of DB:
#db.num=1

### Connect URL of DB:
#db.url.0=jdbc:mysql://192.168.123.14:13306/mysql?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
#db.user.0=root
#db.password.0=密码

### Connection pool configuration: hikariCP
db.pool.config.connectionTimeout=30000
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2

下面这一部分注释掉就表示采用内嵌数据库,否则表示使用MySQL数据库,总计是六行:

#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
#spring.datasource.platform=mysql
#spring.sql.init.platform=mysql

### Count of DB:
#db.num=1

### Connect URL of DB:
#db.url.0=jdbc:mysql://192.168.123.14:13306/mysql?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
#db.user.0=root
#db.password.0=密码

MySQL数据库用的脚本通常在conf目录下,放到MySQL服务器下,执行一下即可,我这里没有新建数据库,并且使用的是root用户,当然了,你可以自己创建数据库以及新用户

鉴权(不管是使用内嵌德比数据库还是MySQL等其它数据库,建议鉴权都配置好):

### If turn on auth system:
nacos.core.auth.enabled=true

### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=true

### Since 1.4.1, Turn on/off white auth for user-agent: nacos-server, only for upgrade from old version.
nacos.core.auth.enable.userAgentAuthWhite=false

### Since 1.4.1, worked when nacos.core.auth.enabled=true and nacos.core.auth.enable.userAgentAuthWhite=false.
### The two properties is the white list for auth and used by identity the request from other server.
nacos.core.auth.server.identity.key=nacos
nacos.core.auth.server.identity.value=DxeUFmDd4IyWOaFWGozMvQLspivCEmE/d53ADz299dw=

### worked when nacos.core.auth.system.type=nacos
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.cache.enable=false
nacos.core.auth.plugin.nacos.token.expire.seconds=18000
### The default token (Base64 String):
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789

nacos.core.auth.plugin.nacos.token.secret.key= 的值是32位随机数,本文的这个最好不要用,nacos.core.auth.enabled=true是鉴权开关,除了nacos自身鉴权,也可以使用ldap,这里就不展开讲了

4、

postgresql数据库初始化脚本(pg数据库我现在一次没有成功过,这里大家参考就行,不需要仔细看)

cat /var/lib/pgsql/pg_schema.sql 
/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info   */
/******************************************/
CREATE TABLE config_info (
    id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    data_id varchar(255) NOT NULL,
    group_id varchar(128) DEFAULT NULL,
    content text NOT NULL,
    md5 varchar(32) DEFAULT NULL,
    gmt_create timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    gmt_modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    src_user varchar(128) DEFAULT NULL,
    src_ip varchar(50) DEFAULT NULL,
    app_name varchar(128) DEFAULT NULL,
    tenant_id varchar(128) DEFAULT '',
    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 DEFAULT NULL,
    UNIQUE (data_id, group_id, tenant_id)
);

CREATE INDEX configinfo_dataid_key ON config_info(data_id);
CREATE INDEX configinfo_groupid_key ON config_info(group_id);
CREATE INDEX configinfo_md5_key ON config_info(md5);

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_aggr   */
/******************************************/
CREATE TABLE config_info_aggr (
    id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    data_id varchar(255) NOT NULL,
    group_id varchar(128) NOT NULL,
    datum_id varchar(255) NOT NULL,
    content text NOT NULL,
    gmt_modified timestamp NOT NULL,
    app_name varchar(128) DEFAULT NULL,
    tenant_id varchar(128) DEFAULT '',
    UNIQUE (data_id, group_id, tenant_id, datum_id)
);

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_beta   */
/******************************************/
CREATE TABLE config_info_beta (
    id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    data_id varchar(255) NOT NULL,
    group_id varchar(128) NOT NULL,
    app_name varchar(128) DEFAULT NULL,
    content text NOT NULL,
    beta_ips varchar(1024) DEFAULT NULL,
    md5 varchar(32) DEFAULT NULL,
    gmt_create timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    gmt_modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    src_user varchar(128) DEFAULT NULL,
    src_ip varchar(50) DEFAULT NULL,
    tenant_id varchar(128) DEFAULT '',
    UNIQUE (data_id, group_id, tenant_id)
);

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_tag   */
/******************************************/
CREATE TABLE config_info_tag (
    id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    data_id varchar(255) NOT NULL,
    group_id varchar(128) NOT NULL,
    tenant_id varchar(128) DEFAULT '',
    tag_id varchar(128) NOT NULL,
    app_name varchar(128) DEFAULT NULL,
    content text NOT NULL,
    md5 varchar(32) DEFAULT NULL,
    gmt_create timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    gmt_modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    src_user varchar(128) DEFAULT NULL,
    src_ip varchar(50) DEFAULT NULL,
    UNIQUE (data_id, group_id, tenant_id, tag_id)
);

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_tags_relation   */
/******************************************/
CREATE TABLE config_tags_relation (
    id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    tag_name varchar(128) NOT NULL,
    tag_type varchar(64) DEFAULT NULL,
    data_id varchar(255) NOT NULL,
    group_id varchar(128) NOT NULL,
    tenant_id varchar(128) DEFAULT ''
);

CREATE INDEX config_tags_relation_dataid_idx ON config_tags_relation(data_id);

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = group_capacity   */
/******************************************/
CREATE TABLE group_capacity (
    id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    group_id varchar(128) NOT NULL DEFAULT '',
    quota int NOT NULL DEFAULT 0,
    usage int NOT NULL DEFAULT 0,
    max_size int NOT NULL DEFAULT 0,
    max_aggr_count int NOT NULL DEFAULT 0,
    max_aggr_size int NOT NULL DEFAULT 0,
    max_history_count int NOT NULL DEFAULT 0,
    gmt_create timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    gmt_modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    UNIQUE (group_id)
);

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = his_config_info   */
/******************************************/
CREATE TABLE his_config_info (
    id bigint NOT NULL,
    nid bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    data_id varchar(255) NOT NULL,
    group_id varchar(128) NOT NULL,
    app_name varchar(128) DEFAULT NULL,
    content text NOT NULL,
    md5 varchar(32) DEFAULT NULL,
    gmt_create timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    gmt_modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    src_user varchar(128) DEFAULT NULL,
    src_ip varchar(50) DEFAULT NULL,
    op_type char(10) DEFAULT NULL,
    tenant_id varchar(128) DEFAULT ''
);

CREATE INDEX his_config_info_dataid_key ON his_config_info(data_id);
CREATE INDEX his_config_info_groupid_key ON his_config_info(group_id);

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = tenant_capacity   */
/******************************************/
CREATE TABLE tenant_capacity (
    id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    tenant_id varchar(128) NOT NULL DEFAULT '',
    quota int NOT NULL DEFAULT 0,
    usage int NOT NULL DEFAULT 0,
    max_size int NOT NULL DEFAULT 0,
    max_aggr_count int NOT NULL DEFAULT 0,
    max_aggr_size int NOT NULL DEFAULT 0,
    max_history_count int NOT NULL DEFAULT 0,
    gmt_create timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    gmt_modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    UNIQUE (tenant_id)
);

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = tenant_info   */
/******************************************/
CREATE TABLE tenant_info (
    id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    kp varchar(128) NOT NULL,
    tenant_id varchar(128) DEFAULT '',
    tenant_name varchar(128) DEFAULT '',
    tenant_desc varchar(256) DEFAULT NULL,
    create_source varchar(32) DEFAULT NULL,
    gmt_create bigint NOT NULL,
    gmt_modified bigint NOT NULL,
    UNIQUE (kp, tenant_id)
);

CREATE INDEX tenant_info_tenantid_idx ON tenant_info(tenant_id);

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = users   */
/******************************************/
CREATE TABLE users (
    username varchar(64) NOT NULL PRIMARY KEY,
    password varchar(256) NOT NULL,
    enabled boolean NOT NULL DEFAULT true
);

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = roles   */
/******************************************/
CREATE TABLE roles (
    username varchar(64) NOT NULL,
    role varchar(64) NOT NULL,
    PRIMARY KEY (username, role)
);

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = permissions   */
/******************************************/
CREATE TABLE permissions (
    role varchar(64) NOT NULL,
    resource varchar(64) NOT NULL,
    action varchar(8) NOT NULL,
    PRIMARY KEY (role, resource, action)
);

-- 初始化用户数据 (用户名: nacos, 密码: nacos)
INSERT INTO users (username, password) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu');
INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');

5、

集群设置

cluster.conf 文件内写入集群所有节点和开放的web端口就可以了,nacos集群没有什么启动顺序

[root@centos14 ~]# cat nacos/conf/cluster.conf 
#2025-07-13T17:53:01.822
192.168.123.14:18848
192.168.123.15:18848
192.168.123.16:18848

6、

启动nacos服务以单实例方式运行

[root@centos14 bin]# ./startup.sh -m standalone
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.x86_64/jre/bin/java -Djava.ext.dirs=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.x86_64/jre/jre/lib/ext:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.x86_64/jre/lib/ext  -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/root/nacos/logs/java_heapdump.hprof -XX:-UseLargePages -Dnacos.member.list= -Xloggc:/root/nacos/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -Dloader.path=/root/nacos/plugins,/root/nacos/plugins/health,/root/nacos/plugins/cmdb,/root/nacos/plugins/selector -Dnacos.home=/root/nacos -jar /root/nacos/target/nacos-server.jar  --spring.config.additional-location=file:/root/nacos/conf/ --logging.config=/root/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288
nacos is starting with cluster
nacos is starting,you can check the /root/nacos/logs/start.out

7、启动naocs服务以集群方式运行:

[root@centos14 ~]# nacos/bin/startup.sh -m cluster
/usr/local/jdk/bin/java -Djava.ext.dirs=/usr/local/jdk/jre/lib/ext:/usr/local/jdk/lib/ext  -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/root/nacos/logs/java_heapdump.hprof -XX:-UseLargePages -Dnacos.member.list= -Xloggc:/root/nacos/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -Dloader.path=/root/nacos/plugins,/root/nacos/plugins/health,/root/nacos/plugins/cmdb,/root/nacos/plugins/selector -Dnacos.home=/root/nacos -jar /root/nacos/target/nacos-server.jar  --spring.config.additional-location=file:/root/nacos/conf/ --logging.config=/root/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288
nacos is starting with cluster
nacos is starting,you can check the /root/nacos/logs/start.out
[root@centos14 ~]# vim /root/nacos/logs/start.out 

看到successfully字样表示nacos服务启动正常,否则需要排查;nacos就两种启动方式,一个是不带参数的集群启动,一个是单实例模式,也就是./startup.sh -m standalone,如果集群没有设置或者启动节点不足,那么,都会导致nacos启动失败

web管理的登陆界面如下(IP:端口/nacos):


由于nacos是一个非常重要的服务,因此,尽量不要把这个服务暴露到公网上,并且使用nacos/nacos 登陆进去后,尽快修改一个复杂密码

四、

二进制部署的nacos服务的优化

优化工作主要是在启动脚本那里做,也就是jvm那一块:

#===========================================================================================
# JVM Configuration
#===========================================================================================
if [[ "${MODE}" == "standalone" ]]; then
    JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
    JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true"
else
    if [[ "${EMBEDDED_STORAGE}" == "embedded" ]]; then
        JAVA_OPT="${JAVA_OPT} -DembeddedStorage=true"
    fi
    JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
    JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof"
    JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"

fi

if [[ "${FUNCTION_MODE}" == "config" ]]; then
    JAVA_OPT="${JAVA_OPT} -Dnacos.functionMode=config"
elif [[ "${FUNCTION_MODE}" == "naming" ]]; then
    JAVA_OPT="${JAVA_OPT} -Dnacos.functionMode=naming"
fi

以上的内存数值按自己的服务器的实际情况修改即可,修改完毕后,重启nacos服务就算完事了

五、

nacos的数据库设置

-- 创建专属用户(禁止超级用户权限)
CREATE USER nacos_app WITH PASSWORD 'Rtg8$kL!9qW#mZ2pYvE*';
GRANT CONNECT ON DATABASE nacos TO nacos_app;

-- 仅赋予必要表权限
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO nacos_app;
REVOKE CREATE, DROP, ALTER ON DATABASE nacos FROM nacos_app;

nacos使用pg数据库作为外部数据源以后在说,现在总是失败


网站公告

今日签到

点亮在社区的每一天
去签到