由于这篇文章在过去几年里受到了很多关注,所以我在文章的底部列出了每个平台的最佳解决方案。
原来的帖子:
我希望我的node.js服务器在后台运行,即:当我关闭我的终端时,我希望我的服务器继续运行。我在谷歌上搜索过这个,并提出了这个教程,但它并不像预期的那样工作。因此,我没有使用这个守护进程脚本,我认为我只是使用了输出重定向(2>&1 >>文件部分),但这也不退出-我在终端中得到一个空行,就像它在等待输出/错误一样。
我也尝试过把进程放在后台,但是只要我关闭终端,进程就会被杀死。
那么,当我关闭本地计算机时,如何让它继续运行呢?
高级解决方案:
Systemd (Linux)
Launchd (Mac)
node-windows (Windows)
PM2 (node . js)
复制我自己的答案从我如何运行一个Node.js应用程序作为它自己的进程?
2015年的答案:几乎每个Linux发行版都带有systemd,这意味着forever、monit、PM2等不再需要——你的操作系统已经处理这些任务了。
制作一个myapp。服务文件(替换'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=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节点,并将可执行模式打开chmod +x app.js。
将服务文件复制到/etc/systemd/system. conf文件中。
用systemctl Start myapp启动它。
使用systemctl Enable myapp启用它在引导时运行。
使用journalctl -u myapp查看日志
这摘自我们如何在Linux上部署节点应用程序,2018年版,其中还包括生成AWS/DigitalOcean/Azure CloudConfig来构建Linux/节点服务器的命令(包括.service文件)。
2017年6月更新:
Linux解决方案:(Red hat)。之前的评论对我不起作用。
这适用于我的亚马逊网络服务-红帽7。希望这对外面的人有用。
A. Create the service file
sudo vi /etc/systemd/system/myapp.service
[Unit]
Description=Your app
After=network.target
[Service]
ExecStart=/home/ec2-user/meantodos/start.sh
WorkingDirectory=/home/ec2-user/meantodos/
[Install]
WantedBy=multi-user.target
B. Create a shell file
/home/ec2-root/meantodos/start.sh
#!/bin/sh -
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080
npm start
then:
chmod +rx /home/ec2-root/meantodos/start.sh
(to make this file executable)
C. Execute the Following
sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl status myapp
(If there are no errors, execute below. Autorun after server restarted.)
chkconfig myapp -add
由于我在提供的答案列表中缺少这个选项,我想在2020年添加一个合格的选项:docker或任何等效的容器平台。除了确保您的应用程序在稳定的环境中工作外,还有额外的安全性好处以及改进的可移植性。
docker支持Windows, macOS和大多数/主要的Linux发行版。在一个受支持的平台上安装docker相当简单,并且有良好的文档。设置Node.js应用程序非常简单,只需将其放入容器中并运行该容器,同时确保在关闭后重新启动。
创建容器镜像
假设你的应用程序在服务器上的/home/me/my-app中可用,在/home/me文件夹中创建一个文本文件Dockerfile,内容类似于下面这个:
FROM node:lts-alpine
COPY /my-app/ /app/
RUN cd /app && npm ci
CMD ["/app/server.js"]
它为在Alpine Linux下运行LTS版本的Node.js创建了一个映像,将应用程序的文件复制到映像中,并运行npm ci以确保依赖项与运行时上下文匹配。
在相同的文件夹中创建另一个文件。dockerignore
**/node_modules
这将防止宿主系统的现有依赖项被注入到容器中,因为它们可能在那里不起作用。Dockerfile中的RUN命令将修复这个问题。
使用如下命令创建图像:
docker build -t myapp-as-a-service /home/me
-t选项选择构建的容器映像的“名称”。这将用于下面运行的容器。
注意:最后一个参数是选择包含Dockerfile的文件夹,而不是Dockerfile本身。你可以使用选项-f选择一个不同的选项。
启动容器
使用此命令启动容器:
docker run -d --restart always -p 80:3000 myapp-as-a-service
这个命令假设你的应用程序正在监听端口3000,而你想让它暴露在主机的端口80上。
当然,这是一个非常有限的例子,但它是一个很好的起点。