服务器部署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工具,更为放心一些。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,612评论 5 471
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,345评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,625评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,022评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,974评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,227评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,688评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,358评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,490评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,402评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,446评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,721评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,802评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,013评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,504评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,080评论 2 341

推荐阅读更多精彩内容