服务器部署Node程序
我们在本地调试Node程序,可以通过npm run start
、node app.js
等方式来启动并进行调试等操作,但是如果把程序部署到服务器上,这样做就会出现很多问题。比方说,
- 不能将程序切换到后台运行
- Node程序崩溃,无法自动重启
为了解决问题,下面介绍几种方法:
1. nohup
nohup 是 Linux服务器命令,作用是不挂断的运行命令,配合 &
(在后台运行)一起使用,可以实现需求。
语法:
nohup Command [ Arg … ] [ & ]
示例:
nohup node app.js
无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。
当然你可以将日志输出到其他位置
nohup node app.js >> /usr/local/node/output.log 2>&1 &
强大的NPM也提供的两个很好用的工具—— forever 和 pm2,来维护Node程序的持久话。forever已经很长时间没有维护了,pm2还在持续维护中。
2. forever
forever 较pm2相比,适合轻量级Node程序。命令语法参照下方:
npm install forever -g #安装
forever start app.js #启动应用
forever stop app.js #关闭应用
forever restartall #重启所有应用
#输出日志和错误
forever start -l forever.log -o out.log -e err.log app.js
# 指定forever信息输出文件,当然,默认它会放到~/.forever/forever.log
forever start -l forever.log app.js
# 指定app.js中的日志信息和错误日志输出文件,
# -o 就是console.log输出的信息,-e 就是console.error输出的信息
forever start -o out.log -e err.log app.js
# 追加日志,forever默认是不能覆盖上次的启动日志,
# 所以如果第二次启动不加-a,则会不让运行
forever start -l forever.log -a app.js
# 监听当前文件夹下的所有文件改动(不太建议这样)
forever start -w app.js
# 显示所有运行的服务
forever list
######停止操作
# 停止所有运行的node App
forever stopall
# 停止其中一个node App
forever stop app.js
# 当然还可以这样
# forever list 找到对应的id,然后:
forever stop [id]
# 开发环境下
NODE_ENV=development forever start -l forever.log -e err.log -a app.js
# 线上环境下
NODE_ENV=production forever start -l ~/.forever/forever.log -e ~/.forever/err.log -w -a app.js
3. pm2
pm2 提供了较forever更丰富的功能,先看一下基础命令:
pm2 start app.js # 启动app.js应用程序
pm2 start app.js -i 4 # cluster mode 模式启动4个app.js的应用实例
# 4个应用程序会自动进行负载均衡
pm2 start app.js --name="api" # 启动应用程序并命名为 "api"
pm2 start app.js --watch # 当文件变化时自动重启应用
pm2 start script.sh # 启动 bash 脚本
pm2 list # 列表 PM2 启动的所有的应用程序
pm2 monit # 显示每个应用程序的CPU和内存占用情况
pm2 show [app-name] # 显示应用程序的所有信息
pm2 logs # 显示所有应用程序的日志
pm2 logs [app-name] # 显示指定应用程序的日志
pm2 flush # 清除所有Log日志
pm2 stop all # 停止所有的应用程序
pm2 stop 0 # 停止 id为 0的指定应用程序
pm2 restart all # 重启所有应用
pm2 reload all # 重启 cluster mode下的所有应用
pm2 gracefulReload all # Graceful reload all apps in cluster mode
pm2 delete all # 关闭并删除所有应用
pm2 delete 0 # 删除指定应用 id 0
pm2 scale api 10 # 把名字叫api的应用扩展到10个实例
pm2 reset [app-name] # 重置重启数量
pm2 startup # 创建开机自启动命令
pm2 save # 保存当前应用列表
pm2 resurrect # 重新加载保存的应用列表
pm2 update # Save processes, kill PM2 and restore processes
pm2 generate # Generate a sample json configuration file
pm2 deploy app.json prod setup # Setup "prod" remote server
pm2 deploy app.json prod # Update "prod" remote server
pm2 deploy app.json prod revert 2 # Revert "prod" remote server by 2
pm2 module:generate [name] # Generate sample module with name [name]
pm2 install pm2-logrotate # Install module (here a log rotation system)
pm2 uninstall pm2-logrotate # Uninstall module
pm2 publish # Increment version, git push and npm publish
pm2 提供了monit,能实时的显示每个应用程序的CPU和内存占用情况,可以作为差错工具来用。同时提供Web版查看服务器及Node程序状态的工具PM2 Plus Features。
4. 服务器Service服务
在/etc/systemd/system
创建一个service服务脚本,保存为mail-koa.service,文件名可以自己命名。
[Unit]
Description=mail-koa // 项目名称
[Service]
ExecStart=/usr/bin/node /data/openapi/mail-koa/app.js // 程序运行的服务命令
Restart=always
User=root
Group=root
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production // 环境
WorkingDirectory=/data/openapi/mail-koa // 工作目录
[Install]
WantedBy=multi-user.target
Service服务基础命令
systemctl start mail-koa.service // 开启服务
systemctl stop mail-koa.service // 暂停服务
systemctl status mail-koa.service // 查看服务状态
我是比较喜欢第四种方案,用服务器的命令比用别人写的node工具,更为放心一些。