我目前有一个服务器,其中包含一个 NextJS 项目,在端口 4000 上运行。
package.json 文件的scripts
部分内容如下:
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start -p 4000"
},
当我npm run start
在 SSH 会话中运行时,项目工作正常,但自然我必须将 Node 作为服务运行,以便在我关闭 SSH 会话后项目继续工作。
我遵循了托管服务提供商的官方文档,该文档提供了以下单元文件示例
[Unit]
Description={Service name} # 此处输入服务名称。这是强制性的,但对功能没有影响
[Service]
Restart=always
Environment=NODE_VERSION={the desired version} # 在此处指定要使用的Node版本。确保它已经预先安装了 "nvm install {the desired version}"
WorkingDirectory=%h/
ExecStart=/bin/bash -c "exec $HOME/.nvm/nvm-exec {command to launch the node script}" # This命令取决于项目。例如,“npm run start”、“npm run serve”甚至“node server.js”正在运行
[Install]
WantedBy=default.target
我以一个node.service
包含以下内容的文件结束:
[Unit]
Description=node
[Service]
Restart=always
Environment=NODE_VERSION=16.15.1 NODE_ENV=production PORT=4000
WorkingDirectory=$HOME/sites/croockys.ch
ExecStart=/bin/bash -c "exec $HOME/.nvm/nvm-exec npm run start"
[Install]
WantedBy=default.target
我的项目位于$HOME/sites/croockys.ch
我按顺序运行了以下命令:
systemctl --user daemon-reload
systemctl --user 启用节点
systemctl --user 启动节点
并没有遇到任何错误,但网站无法正常工作,我得到了503 Service Unavailable
.
我想我的单元文件有问题。
我愿意接受这是一个愚蠢的问题,但 $HOME/sites/croockys.ch 实际上是一个目录吗?.ch 看起来应该是文件扩展名,而不是在我看来应该位于 $HOME/sites 中的实际目录。还要记住,运行它的用户可能不会是你正在创建它的同一个开发用户 - 可能更好地将 $HOME 扩展到它真正应该作为完整路径的内容:/opt/home/place/where /code/site 或任何需要的路径才能正确启动该过程。