Ubuntu 16下Node.js应用:基于forever与npm脚本实现开机自启及可控环境运行
一、先搞定从根目录通过npm脚本启动应用
你之前从根目录启动失败,核心是npm默认会找当前目录的package.json,所以我们需要明确告诉npm去应用目录执行脚本:
直接在根目录执行以下命令(替换
/path/to/your/node-app为你的实际应用路径):npm --prefix /path/to/your/node-app run <你的脚本名>比如你的
package.json里有"start": "node server.js",那命令就是:npm --prefix /path/to/your/node-app run start(可选简化)如果不想每次都敲长命令,可以在根目录的
~/.bashrc里加个别名:alias start-my-app='npm --prefix /path/to/your/node-app run start'执行
source ~/.bashrc生效后,直接在根目录敲start-my-app就能启动应用了。
二、用Forever实现应用常驻运行
首先确保全局安装了forever:
npm install -g forever
方式1:直接用Forever启动应用入口文件(推荐)
从根目录执行,指定应用入口文件路径,还能直接注入环境变量:
forever start -e /path/to/your/node-app/error.log -o /path/to/your/node-app/output.log -c "NODE_ENV=production node" /path/to/your/node-app/server.js
参数说明:
-e:指定错误日志存储路径-o:指定正常输出日志存储路径-c:自定义执行命令,这里直接把环境变量写在命令里
停止应用的命令:
forever stop /path/to/your/node-app/server.js
方式2:让Forever调用npm脚本
如果你想复用package.json里的现有脚本逻辑,也可以让forever执行npm命令:
forever start -c "npm --prefix /path/to/your/node-app run start" /path/to/your/node-app
这种方式适合脚本里有复杂逻辑(比如构建+启动)的场景。
三、配置开机自启(Ubuntu 16用Systemd)
Ubuntu 16默认用systemd管理系统服务,我们可以创建一个服务文件,让系统开机时自动拉起forever和你的应用:
创建服务配置文件:
sudo nano /etc/systemd/system/my-node-app.service粘贴以下内容(替换所有
/path/to/your/node-app为实际应用路径,your-user为服务器登录用户名):[Unit] Description=My Node.js App Managed by Forever After=network.target [Service] User=your-user WorkingDirectory=/path/to/your/node-app ExecStart=/usr/local/bin/forever start -c "NODE_ENV=production node" /path/to/your/node-app/server.js ExecStop=/usr/local/bin/forever stop /path/to/your/node-app/server.js Restart=always [Install] WantedBy=multi-user.target注意:
/usr/local/bin/forever是forever的全局安装路径,不确定的话可以用which forever命令确认。启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable my-node-app.service sudo systemctl start my-node-app.service验证服务状态:
sudo systemctl status my-node-app.service如果显示
active (running)就说明配置成功了,重启服务器测试下应用是否会自动启动。
四、环境变量的便捷处理
如果你的应用依赖大量环境变量,不想在命令行里逐个写,可以用dotenv包统一管理:
在应用目录安装dotenv:
cd /path/to/your/node-app npm install dotenv --save在应用入口文件(比如
server.js)的最顶部添加:require('dotenv').config()在应用目录创建
.env文件,写入所有环境变量:NODE_ENV=production DB_HOST=localhost DB_PORT=3306 API_KEY=your-secret-key这样启动应用时,forever会自动加载这些环境变量,不用再在命令行里手动指定。
内容的提问来源于stack exchange,提问作者Mike Gorski

