注册nacos为服务使用systemctl进行管理

背景:

每次启动NACOS服务,都需要进到目录,然后执行启动脚本,关闭也是,查看服务需要ps,服务器重启后,还的手动起服务,管理起来比较麻烦。之前已经将es,logstash,已经通过服务管理起来了,的确方便很多。

思路:

1. 创建 systemd 服务文件

2. 编辑服务文件内容

3. 创建专用用户(可选但推荐)

4. 重载 systemd 并启动服务

5. 验证服务

操作:

1. 创建 systemd 服务文件

/etc/systemd/system/ 目录下创建一个服务文件,例如 nacos.service

bash 复制代码
sudo vim /etc/systemd/system/nacos.service

2. 编辑服务文件内容

将以下内容粘贴到文件中。请注意修改 UserGroupExecStartEnvironment 中的路径,使其与你的实际安装路径和用户匹配。

bash 复制代码
[Unit]
Description=Nacos Server
After=network.target

[Service]
Type=forking

# 设置执行 Nacos 的用户和组(建议不要使用 root 运行)
User=root
Group=root

# 设置环境变量,指向 JDK 安装目录
#Environment="JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk"
# 如果你的 Nacos 单机模式,添加此变量;集群模式则不需要或移除
#Environment="MODE=standalone"

# Nacos 的启动脚本路径
ExecStart=/usr/local/nacos/bin/startup.sh
ExecStop=//usr/local/nacos/bin/shutdown.sh
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=300s

[Install]
WantedBy=multi-user.target

关键配置说明:

  • User/Group : 为了安全起见,建议创建一个专门的 nacos 用户来运行服务。
  • JAVA_HOME: 必须显式指定,因为 systemd 环境下默认可能无法读取用户 profile 中的环境变量。
  • ExecStart : 指向 startup.sh 脚本。加上 -m standalone 是为了强制单机模式启动(如果配置文件里没改的话)。如果是集群模式,请去掉该参数。
  • ExecStop : 指向 shutdown.sh 脚本。

3. 创建专用用户(可选但推荐)

如果你还没有 nacos 用户,建议创建一个:

bash 复制代码
# 创建用户(不允许登录)
sudo useradd -r -s /bin/false nacos

# 将 Nacos 目录的所有权赋予该用户
sudo chown -R nacos:nacos /opt/nacos

4. 重载 systemd 并启动服务

完成上述配置后,执行以下命令:

bash 复制代码
# 1. 重新加载 systemd 配置,使其识别新服务
sudo systemctl daemon-reload

# 2. 设置 Nacos 开机自启
sudo systemctl enable nacos

# 3. 启动 Nacos 服务
sudo systemctl start nacos

# 4. 查看 Nacos 服务状态
sudo systemctl status nacos

# 5. 取消开机自启
sudo systemctl disable nacos

5. 验证服务

执行 status 命令后,你应该看到类似 Active: active (running) 的绿色字样。如果启动失败,可以使用以下命令查看详细日志:

bash 复制代码
# 查看 systemd 日志
journalctl -u nacos -f

# 或者查看 Nacos 自身的日志(默认位置在 nacos 目录下的 logs/start.log)
tail -f /usr/local/nacos/logs/start.out

常见问题排查

  1. JAVA_HOME not found :

    如果报错提示找不到 JAVA_HOME,请确保在 nacos.service 文件中正确配置了 Environment="JAVA_HOME=...",并且路径指向正确的 JDK 目录。

  2. Permission denied :

    确保 nacos 用户对 Nacos 的安装目录(尤其是 bin/*.shlogs/ 目录)有执行和写入权限。

  3. 服务启动后立刻退出 :

    这通常是因为 Nacos 启动脚本 startup.sh 在后台运行后,systemd 认为进程退出了。

    • 确保服务文件中设置了 Type=forking
    • 检查 Nacos 的 logs/start.out 看是否有 Java 报错(如内存不足、端口被占用)。
  4. -bash: ./shutdown.sh: /bin/bash^M: bad interpreter: No such file or directory

这是一个非常经典的错误,通常发生在 Windows 系统上编辑过脚本文件,然后上传到 Linux 系统运行 时。

错误原因

Windows 和 Linux 对"换行符"的定义不同:

  • Windows : 使用 CRLF(即 \r\n)。
  • Linux : 使用 LF(即 \n)。

错误提示中的 ^M 实际上就是 Windows 的 \r 字符。Linux 的解释器(/bin/bash)把 \r 当作了文件名的一部分,因此找不到 /bin/bash^M 这个文件,导致报错。

解决方法

你需要将脚本的格式转换为 Unix 格式

bash 复制代码
sed -i 's/\r$//' shutdown.sh
sed -i 's/\r$//' startup.sh

通过以上步骤,就可以像管理其他系统服务(如 Nginx, MySQL)一样,使用 systemctl start nacossystemctl stop nacossystemctl restart nacos 来管理 Nacos 了。