服务器部署Node程序

服务器部署Node程序

我们在本地调试Node程序,可以通过npm run startnode app.js等方式来启动并进行调试等操作,但是如果把程序部署到服务器上,这样做就会出现很多问题。比方说,

  1. 不能将程序切换到后台运行
  2. 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工具,更为放心一些。

你可能感兴趣的:(服务器部署Node程序)