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

如何在aws上的Amazon Linux AMI中自动启动node.js应用程序?,linux,node.js,amazon-ec2,amazon-web-services,Linux,Node.js,Amazon Ec2,Amazon Web Services,是否有一个简短的指南来解释如何在实例启动和运行时启动应用程序?如果它是通过yum安装的服务之一,那么我想我可以使用/sbin/chkconfig将其添加到服务中。(为了确保它是正确的吗?) 但是,我只想运行未通过yum安装的程序。要运行node.js程序,每当系统启动时,我必须在主目录下运行scriptsudo node app.js 我不习惯AmazonLinuxAMI,所以我很难找到一种“正确”的方法在每次启动时自动运行一些脚本 有没有一种优雅的方法可以做到这一点?快速解决方案是从/etc/

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

但是,我只想运行未通过
yum安装的程序。要运行node.js程序,每当系统启动时,我必须在主目录下运行script
sudo node app.js

我不习惯AmazonLinuxAMI,所以我很难找到一种“正确”的方法在每次启动时自动运行一些脚本


有没有一种优雅的方法可以做到这一点?

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

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

也许你需要帮助。(或者只是谷歌的“创建rpm软件包”)

已经在AWS上使用,它做得很好。使用安装

 [sudo] npm install forever -g
要添加应用程序,请使用

 forever start path_to_application
 forever stop path_to_application
并停止应用程序的使用

 forever start path_to_application
 forever stop path_to_application

是一篇有用的文章,帮助我设置了它。

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

以下是开始步骤:

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

对于Ubuntu:

sudo apt-get install upstart
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

3) 通过
sudo start yourappname启动应用程序

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

您可以从/etc/init.d中选择一个现有脚本作为示例;描述了需求,基本上是:

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

 chkconfig --add yourscript 
 chkconfig yourscript on 

你应该可以走了。(一些发行版可能要求您手动将脚本符号链接到/etc/init.d/rc.d,但我相信您的AWS发行版会在启用脚本时为您这样做。

您可以使用forever service将节点脚本作为服务进行配置,并在引导过程中自动启动。以下命令将完成必要的操作

npm install -g forever-service
forever-service install test
这将通过forever将当前目录中的app.js设置为服务。每次系统重新启动时,该服务将自动重新启动。停止时,它将尝试正常停止。此脚本也将设置脚本

Github url:

到目前为止,forever服务支持Amazon Linux、CentOS、Redhat对其他Linux发行版、Mac和Windows的支持正在进行中


注意:我是永久服务的作者。

您可以使用
屏幕
。运行
crontab-e
并添加以下行:

@reboot  screen -d -m bash -c "cd /home/user/yourapp/; node app"
使用Elastic Beanstalk:)提供对自动扩展、SSL终止、蓝色/绿色部署等的支持

如果您想要基于RedHat的linux发行版采用咸系统管理方式(Amazon linux是RedHat的一种风格),请学习
systemd
,正如@bvdb在上面的回答中所提到的:

按照EC2实例上的描述设置所有内容,快照自定义AMI,并使用此自定义AMI作为承载应用程序的EC2实例的基础。这样,您就不必多次进行所有设置。如果您在具有正常运行时间要求的生产环境中运行,您可能也希望熟悉负载平衡器

或者,是的,正如@bvdb所提到的,您也可以使用
pm2
systemd
接口。尽管我不认为
pm2
有助于在多个EC2实例上运行应用程序,但对于有正常运行时间要求的生产环境,这是绝对推荐的

所有这些都是一个非常陡峭的学习曲线。由于OP似乎对所有这些都是新的,因此Elastic Beanstalk、Google App Engine和其他工具是一种让代码在云中运行的好方法,而不需要这些


这些天我用TypeScript开发,在云中部署无服务器的函数执行,并且根本不需要考虑包安装或应用程序启动。

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

首先,您需要创建一个
.service
文件。(在我的例子中
cloudylela.service

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

[Unit]
Description=cloudy leela
Documentation=http://documentation.domain.com
After=network.target

[Service]
Type=simple
TimeoutSec=0
User=ubuntu
ExecStart=/usr/bin/node /home/ubuntu/server.js
Restart=on-failure

[Install]
WantedBy=multi-user.target
在此应用程序中,
节点
应用程序启动。你需要一个完整的路径。我配置了,如果出现问题,应用程序应该简单地重新启动。默认情况下,Amazon使用的实例没有用户密码

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

ubuntu@ip-172-31-21-195:~$ sudo systemctl daemon-reload
ubuntu@ip-172-31-21-195:~$ sudo systemctl start cloudyleela
ubuntu@ip-172-31-21-195:~$ sudo systemctl enable cloudyleela
Created symlink /etc/systemd/system/multi-user.target.wants/cloudyleela.service → /lib/systemd/system/cloudyleela.service.
ubuntu@ip-172-31-21-195:~$
有一个很棒的systemd for node.js教程

如果运行Web服务器: 你可能会遇到一些问题
sudo iptables -t nat -A PREROUTING -i -p tcp --dport 80 -j REDIRECT --to-port 4200
[Service]
...
PermissionsStartOnly=true
ExecStartPre=/sbin/iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 4200
ExecStopPost=/sbin/iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 4200
[ec2-user@ip-172-31-39-212 system]$ sudo systemctl daemon-reload
[ec2-user@ip-172-31-39-212 system]$ sudo systemctl stop cloudyleela
[ec2-user@ip-172-31-39-212 system]$ sudo systemctl start cloudyleela
[ec2-user@ip-172-31-39-212 system]$
npm install pm2 -g
pm2 start index.js --name "foo"`. 
pm2 save