部署Node.js的最佳方式是什么?
我有一个Dreamhost VPS(这就是他们所说的虚拟机),我已经能够安装Node.js并设置代理。只要我保持我开始节点时打开的SSH连接,这就工作得很好。
如果你有root权限,你最好设置一个守护进程,让它在后台安全运行。你可以在博客文章在Ubuntu上运行Node.js as a Service .js中阅读如何为Debian和Ubuntu这样做。
使用永远。它在单独的进程中运行Node.js程序,如果有任何死机,就重新启动它们。
用法:
forever start example.js
forever list
forever stop example.js
forever stop 0
永远将做到这一点。
@Kevin:你应该可以很好地杀死进程。我会再检查一下文件。如果你可以重现错误,这将是伟大的张贴它作为一个问题在GitHub上。
在你的情况下,你可以使用自命不凡的人守护进程。对于一个完整的部署解决方案,我建议使用capistrano。两个有用的指南是如何设置Node.js env .js env和如何通过capistrano + upstart部署。
我已经在这里写了我的部署方法:部署node.js应用
简而言之:
你可以使用monit, forever, upstart或systemd来启动你的服务器。
monit
forever
upstart
systemd
你可以使用Varnish或HAProxy来代替Nginx (Nginx不支持websockets)。
作为一个快速而肮脏的解决方案,你可以使用nohup node your_app.js &来防止你的应用程序终止于你的服务器,但forever, monit和其他建议的解决方案更好。
nohup node your_app.js &
我已经写了一个相当全面的部署Node.js的指南,并提供了示例文件:
< a href = " http://gun。 . io/blog/ Tutorial - Deploy -node-js-server- With -example/" rel="nofollow noreferrer">教程:如何部署Node.js应用程序,带示例
它涵盖了http-proxy, SSL和套接字。IO。
正如Box9所说,永远是生产代码的一个很好的选择。但是,即使客户端关闭了SSH连接,也可以让进程继续运行。
虽然对于生产环境来说不一定是一个好主意,但当处于长时间调试会话中间,或者遵循长时间进程的控制台输出,或者当断开SSH连接有用时,这非常方便,但要保持服务器中的终端处于活动状态,以便稍后重新连接(例如在家中启动Node.js应用程序,然后在工作时重新连接到控制台,以检查事情的进展)。
假设你的服务器是一个*nix盒子,你可以从shell中使用屏幕命令来保持进程运行,即使客户端SSH关闭。如果尚未安装,您可以从web上下载/安装屏幕(如果是Linux,请为您的发行版寻找软件包,如果是OS X,则使用MacPorts)。
其工作原理如下:
如果需要,可以像这样同时运行多个屏幕会话,并且可以从任何客户机连接到其中任何一个。请在线阅读文档以获得所有选项。
下面是一篇关于用systemd: http://savanne.be/articles/deploying-node-js-with-systemd/解决这个问题的较长文章
请记住以下几点:
有了系统,所有这些事情都很容易完成。
Forever是保持应用程序运行的一个好选择(而且它是npm可安装的模块,这很好)。
但对于更严肃的“部署”——比如远程管理部署、重新启动、运行命令等——我会使用capistrano和节点扩展。
https://github.com/loopj/capistrano-node-deploy
我做了一个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
自定义#########之前的所有内容,在/etc/init/your-service.conf中创建一个文件并粘贴到那里。
然后你可以:
start your-service stop your-service restart your-service status your-service
pm2做的技巧。
特性包括:监控、热代码重载、内置负载均衡器、自动启动脚本和恢复/转储进程。
试试这个:http://www.technology-ebay.de/the-teams/mobile-de/blog/deploying-node-applications-with-capistrano-github-nginx-and-upstart.html
关于使用Capistrano, Upstart和Nginx部署Node.js应用程序的一个伟大而详细的指南
node-deploy-server试试。它是一个复杂的工具集,用于将应用程序部署到您的私有服务器上。它是用Node.js编写的,并使用npm进行安装。
https://paastor.com是一个相对较新的服务,它为你部署到VPS或其他服务器。有一个CLI来推送代码。牧师有一个免费层,至少在发布这篇文章的时候。
2016的答案:几乎每个Linux发行版都带有systemd,这意味着永远,monit, PM2等不再需要-你的操作系统已经处理这些任务。
创建一个myapp.service文件(显然,将'myapp'替换为应用程序的名称):
myapp.service
[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=nogroup Environment=PATH=/usr/bin:/usr/local/bin Environment=NODE_ENV=production WorkingDirectory=/var/www/myapp [Install] WantedBy=multi-user.target
如果你是Unix新手,请注意: /var/www/myapp/app.js应该在第一行有#!/usr/bin/env node,并将可执行模式打开为chmod +x myapp.js。
/var/www/myapp/app.js
#!/usr/bin/env node
chmod +x myapp.js
将服务文件复制到/etc/systemd/system文件夹中。
/etc/systemd/system
用systemctl daemon-reload告诉systemd新服务。
systemctl daemon-reload
从systemctl start myapp开始。
systemctl start myapp
使用systemctl enable myapp使其在引导时运行。
systemctl enable myapp
查看带有journalctl -u myapp的日志
journalctl -u myapp
这来自我们如何在Linux上部署节点应用程序,2018版,其中还包括生成AWS/DigitalOcean/Azure CloudConfig以构建Linux/node服务器的命令(包括.service文件)。
.service