如何将Node.js应用程序作为自己的进程运行?

res*_*ode 192 deployment service daemon node.js

部署Node.js的最佳方法是什么?

我有一个Dreamhost VPS(他们称之为VM),我已经能够安装Node.js并设置代理.只要我保持打开节点的SSH连接,这就很好用.

Dav*_*ang 100

永远使用.它在单独的进程中运行Node.js程序,如果有任何死亡,则重新启动它们.

用法:

  • forever start example.js 开始一个过程.
  • forever list 查看永远启动的所有进程的列表
  • forever stop example.js停止进程,或forever stop 0使用索引0停止进程(如图所示forever list).


mik*_*ana 100

2016答案:几乎每个Linux发行版都附带systemd,这意味着永远,monit等不再需要 - 您的操作系统已经处理了这些任务.

创建一个myapp.service文件(显然用你的应用程序名称替换'myapp'):

[Unit]
Description=My app

[Service]
ExecStart=/var/www/myapp/app.js
Restart=always
User=nobody
# Note Debian/Ubuntu uses 'nogroup', RHEL/Fedora uses 'nobody'
Group=nobody
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/var/www/myapp

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

请注意,如果您是Unix新手: /var/www/myapp/app.js应该#!/usr/bin/env node在第一行.

将您的服务文件复制到该/etc/systemd/system文件夹中.

告诉systemd有关新服务的信息systemctl daemon-reload.

启动它systemctl start myapp.

启用它以在启动时运行systemctl enable myapp.

查看日志 journalctl -u myapp

这取自我们如何在Linux 2018版上部署节点应用程序,其中还包括生成AWS/DigitalOcean/Azure CloudConfig以构建Linux /节点服务器(包括.service文件)的命令.

  • 无需将服务文件复制到/ etc / systemd / system中,只需使用systemctl enable /full/path/to/myapp.service即可为您在/ etc / systemd / system中创建符号链接。 (2认同)

小智 41

我在这里写了关于我的部署方法:部署node.js应用程序

简而言之:

  • 使用git post-receive hook
  • 杰克为构建工具
  • Upstart作为节点的服务包装器
  • Monit用于监视和重启应用程序
  • nginx将请求路由到同一服务器上的不同应用程序

  • 这个链接似乎被打破了 (3认同)
  • 我修复了链接 (3认同)
  • 如果我的服务器上总是有一个Node站点,我可以安全地抛弃Nginx吗? (2认同)

nic*_*fly 16

pm2做了招数.

功能包括:监控,热代码重新加载,内置负载均衡器,自动启动脚本和恢复/转储过程.


npo*_*cop 9

您可以使用monit,forever,upstartsystemd来启动服务器.

您可以使用Varnish或HAProxy而不是Nginx(已知Nginx不能与websockets一起使用).

作为一种快速而肮脏的解决方案,您可以使用它nohup node your_app.js &来阻止您的应用程序终止于您的服务器,但是forever,monit其他建议的解决方案更好.

  • 用户"Sergey Yarotskiy"试图编辑你的帖子说Nginx现在支持WebSockets(从版本1.3开始).我拒绝了编辑,因为我认为它应该作为评论发布.(否则你在同一篇文章中会有两个相互矛盾的句子,这会令人困惑.) (2认同)

Cap*_*apy 7

我制作了一个目前用于我的应用程序的Upstart脚本:

description "YOUR APP NAME"
author "Capy - http://ecapy.com"

env LOG_FILE=/var/log/node/miapp.log
env APP_DIR=/var/node/miapp
env APP=app.js
env PID_NAME=miapp.pid
env USER=www-data
env GROUP=www-data
env POST_START_MESSAGE_TO_LOG="miapp HAS BEEN STARTED."
env NODE_BIN=/usr/local/bin/node
env PID_PATH=/var/opt/node/run
env SERVER_ENV="production"

######################################################

start on runlevel [2345]
stop on runlevel [016]

respawn
respawn limit 99 5

pre-start script
    mkdir -p $PID_PATH
    mkdir -p /var/log/node
end script

script
    export NODE_ENV=$SERVER_ENV
    exec start-stop-daemon --start --chuid $USER:$GROUP --make-pidfile --pidfile $PID_PATH/$PID_NAME --chdir $APP_DIR --exec $NODE_BIN -- $APP >> $LOG_FILE 2>&1
end script

post-start script
    echo $POST_START_MESSAGE_TO_LOG >> $LOG_FILE
end script
Run Code Online (Sandbox Code Playgroud)

在#########之前自定义所有内容,在/etc/init/your-service.conf中创建一个文件并将其粘贴到那里.

然后你可以:

start your-service
stop your-service
restart your-service
status your-service
Run Code Online (Sandbox Code Playgroud)


Ric*_*nes 6

我已经编写了一个非常全面的部署Node.js的指南,其中包含示例文件:

教程:如何使用示例部署Node.js应用程序

它涵盖了http-proxy,SSLSocket.IO等内容.


Sel*_*aek 5

如果您具有root访问权限,则最好设置一个守护程序,以便它在后台运行安全可靠.您可以在Ubuntu上的博客文章Run Node.js as a Service中阅读如何为DebianUbuntu做到这一点.


Rub*_*sch 5

以下是关于使用systemd解决此问题的更长篇文章:http://savanne.be/articles/deploying-node-js-with-systemd/

要注意的一些事项:

  • 谁将开始您的过程监控?Forever是一个很棒的工具,但它需要一个监控工具来保持自身运行.这有点傻,为什么不只是使用你的init系统?
  • 你能充分监控你的流程吗?
  • 你在运行多个后端吗?如果是这样,您是否有规定防止任何人在资源使用方面摧毁其他人?
  • 是否会一直需要这项服务?如果没有,请考虑套接字激活(请参阅文章).

所有这些都可以通过systemd轻松完成.