如何在aws上的Amazon Linux AMI中自动启动node.js应用程序?

use*_*594 40 linux amazon-ec2 amazon-web-services node.js

有没有简要的指南来解释在实例启动和运行时如何启动应用程序?如果它是通过yum那时安装的服务之一,我想我可以/sbin/chkconfig用来将它添加到服务中.(为了确定,这是正确的吗?)

但是,我只想运行未安装的程序yum.要运行node.js程序,sudo node app.js只要系统启动,我就必须在主目录下运行脚本.

我不习惯使用Amazon Linux AMI,所以我很难找到一种在每次启动时自动运行某些脚本的"正确"方法.

有一种优雅的方式来做到这一点?

mvb*_*fst 21

一种方法是创建一个新贵工作.这样你的应用程序将在Linux加载后启动,如果崩溃将自动重启,你可以通过sudo start yourapp/ sudo stop yourapp/ 启动/停止/重启它sudo restart yourapp.

这是开始的步骤:

1)安装upstart实用程序(如果使用标准的Amazon Linux AMI,可以预先安装):

sudo yum install upstart
Run Code Online (Sandbox Code Playgroud)

对于Ubuntu:

sudo apt-get install upstart
Run Code Online (Sandbox Code Playgroud)

2)为您的节点应用程序创建upstart脚本:

在使用以下代码行/etc/init添加文件yourappname.conf:

#!upstart
description "your app name"

start on started mountall
stop on shutdown

# Automatically Respawn:
respawn
respawn limit 99 5

env NODE_ENV=development

# Warning: this runs node as root user, which is a security risk
# in many scenarios, but upstart-ing a process as a non-root user
# is outside the scope of this question
exec node /path_to_your_app/app.js >> /var/log/yourappname.log 2>&1
Run Code Online (Sandbox Code Playgroud)

3)启动你的应用程序 sudo start yourappname

  • 据我所知,在亚马逊上运行的Linux是RedHat派生的,而不是Ubuntu派生的,因此我认为upstart不可用. (12认同)
  • 在AWS上:sudo yum install upstart (5认同)
  • “暴发户”已被删除:( (2认同)

arv*_*rva 9

您可以使用forever-service将节点脚本配置为服务,并在引导期间自动启动.以下命令将做必要的,

npm install -g forever-service
forever-service install test
Run Code Online (Sandbox Code Playgroud)

这将永久地将当前目录中的app.js作为服务提供.每次重新启动系统时,该服务都将自动重新启动.此外,当停止时,它将尝试优雅停止.此脚本也提供了logrotate脚本.

Github网址:https://github.com/zapty/forever-service

截至目前,ever-service支持亚马逊Linux,CentOS,Redhat支持其他Linux发行版,Mac和Windows正在开发中.

注意:我是永远服务的作者.

  • 这不起作用让“永远服务必须以root身份运行”尝试“sudo永远服务安装测试”并且亚马逊Linux响应“sudo:forever-service:未找到命令” (2认同)

Unk*_*own 7

快速解决方案就是从你的应用程序开始/etc/rc.local; 只需在那里添加命令.

但是如果你想要优雅的方式,你必须将你的应用程序打包到一个rpm文件,有一个启动脚本进入,/etc/rc.d以便你可以chkconfig在你的应用程序上使用,然后在你的实例上安装rpm.

也许这个这个帮助.(或只是谷歌"创建rpm包")

  • 无需创建RPM文件 - 您可以使用init脚本和chkconfig而无需创建RPM. (3认同)

bvd*_*vdb 7

我的 Amazon Linux 实例在 Ubuntu 上运行,我使用 systemd 来设置它。

\n

首先您需要创建一个<servicename>.service文件。(就我而言cloudyleela.service

\n
sudo nano /lib/systemd/system/cloudyleela.service\n
Run Code Online (Sandbox Code Playgroud)\n

在此文件中键入以下内容:

\n
[Unit]\nDescription=cloudy leela\nDocumentation=http://documentation.domain.com\nAfter=network.target\n\n[Service]\nType=simple\nTimeoutSec=0\nUser=ubuntu\nExecStart=/usr/bin/node /home/ubuntu/server.js\nRestart=on-failure\n\n[Install]\nWantedBy=multi-user.target\n
Run Code Online (Sandbox Code Playgroud)\n

在此应用程序中,node应用程序已启动。您将需要此处的完整路径。我配置为如果出现问题,应用程序应该重新启动。默认情况下,Amazon 使用的实例没有用户密码。

\n

从磁盘重新加载文件,然后您就可以启动服务了。您需要启用它才能将其作为服务激活,并在启动时自动启动。

\n
ubuntu@ip-172-31-21-195:~$ sudo systemctl daemon-reload\nubuntu@ip-172-31-21-195:~$ sudo systemctl start cloudyleela\nubuntu@ip-172-31-21-195:~$ sudo systemctl enable cloudyleela\nCreated symlink /etc/systemd/system/multi-user.target.wants/cloudyleela.service \xe2\x86\x92 /lib/systemd/system/cloudyleela.service.\nubuntu@ip-172-31-21-195:~$\n
Run Code Online (Sandbox Code Playgroud)\n

此处提供了一个很棒的适用于 Node.js 的 systemd 教程。

\n

如果您运行网络服务器:

\n

在端口 80 上运行 Web 服务器时可能会遇到一些问题。最简单的解决方案实际上是在不同的端口(例如 4200)上运行 Web 服务器,然后将该端口重定向到端口 80。您可以使用以下命令来完成此操作:

\n
sudo iptables -t nat -A PREROUTING -i -p tcp --dport 80 -j REDIRECT --to-port 4200\n
Run Code Online (Sandbox Code Playgroud)\n

不幸的是,这不是持久的,因此每当服务器重新启动时您都必须重复它。更好的方法是将此命令也包含在我们的服务脚本中:

\n
    \n
  1. ExecStartPre添加端口转发
  2. \n
  3. ExecStopPost删除端口转发
  4. \n
  5. PermissionStartOnly使用 sudo 电源执行此操作
  6. \n
\n

所以,像这样:

\n
[Service]\n...\nPermissionsStartOnly=true\nExecStartPre=/sbin/iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 4200\nExecStopPost=/sbin/iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 4200\n
Run Code Online (Sandbox Code Playgroud)\n

不要忘记重新加载并重新启动您的服务:

\n
[ec2-user@ip-172-31-39-212 system]$ sudo systemctl daemon-reload\n[ec2-user@ip-172-31-39-212 system]$ sudo systemctl stop cloudyleela\n[ec2-user@ip-172-31-39-212 system]$ sudo systemctl start cloudyleela\n[ec2-user@ip-172-31-39-212 system]$\n
Run Code Online (Sandbox Code Playgroud)\n

对于微服务(2020 年 12 月更新)

\n

前面提到的解决方案提供了很大的灵活性,但设置它确实需要一些时间。对于每一个额外的申请,您都需要再次经历整个过程。当您安装第五个节点应用程序时,您肯定会开始想:“必须有一个快捷方式”

\n

PM2 的优点是只需安装 1 个服务。接下来是 PM2 管理实际的应用程序。

\n

即使 PM2 的初始设置也很简单,因为它会自动为您安装 pm2 服务。

\n
npm install pm2 -g\n
Run Code Online (Sandbox Code Playgroud)\n

添加新服务更加容易:

\n
pm2 start index.js --name "foo"`. \n
Run Code Online (Sandbox Code Playgroud)\n

当一切正常运行后,您可以保存设置,使其在重新启动时自动启动。

\n
pm2 save\n
Run Code Online (Sandbox Code Playgroud)\n

如果您想了解所有正在运行的节点应用程序的概述,\n您可以运行pm2 list

\n

PM2 还提供在线(基于网络)仪表板来远程监控您的应用程序。不过,您可能需要许可证才能访问某些仪表板功能(恕我直言,这价格有点高)。

\n


Tom*_*omG 5

您可以创建一个脚本,可以启动和停止您的应用程序并将其放在/etc/init.d中; 使脚本遵循chkconfig的约定(如下),然后使用chkconfig将其设置为在启动其他服务时启动.

您可以从/etc/init.d中选择一个现有脚本作为示例; 本文介绍了这些要求,基本上是:

  • 标识所需shell的可执行脚本(即#!/ bin/bash)
  • 表单#chkconfig的注释:where通常为345,startprio表示服务启动顺序的位置,stopprio表示服务停止的顺序.我通常会选择一个已经存在的类似服务,并将其用作这些值的指南(即,如果您有与Web相关的服务,请从与httpd相同的级别开始,具有类似的开始和停止优先级).

设置脚本后,即可使用

 chkconfig --add yourscript 
 chkconfig yourscript on 
Run Code Online (Sandbox Code Playgroud)

你应该好好去.(某些发行版可能要求您手动将脚本符号链接到/etc/init.d/rc.d,但我相信您的AWS发行版会在您启用脚本时为您执行此操作.