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

时间:2012-06-30 16:50:35

标签: linux node.js amazon-ec2 amazon-web-services

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

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

我不习惯使用Amazon Linux AMI,所以在每次启动时都找不到自动运行某些脚本的“正确”方法。

有优雅的方法吗?

8 个答案:

答案 0 :(得分:21)

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

以下是开始步骤:

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

sudo yum install upstart

对于Ubuntu:

sudo apt-get install upstart

2)为您的节点应用创建新手脚本:

/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

启动您的应用

答案 1 :(得分:8)

您可以使用forever-service将节点脚本配置为服务,并在引导期间自动启动。以下命令将完成所需,

npm install -g forever-service
forever-service install test

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

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

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

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

答案 2 :(得分:7)

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

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

可能thisthis有帮助。 (或者只是谷歌“创建rpm包”)

答案 3 :(得分:5)

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

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

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

设置完脚本后,您可以使用

 chkconfig --add yourscript 
 chkconfig yourscript on 

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

答案 4 :(得分:0)

使用Elastic Beanstalk :)支持自动扩展,SSL终止,蓝/绿部署等

答案 5 :(得分:0)

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

首先,您需要创建一个<servicename>.service文件。 (在我的情况下为cloudyleela.service

sudo nano /lib/systemd/system/cloudyleela.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

在此应用程序中,node应用程序已启动。您将需要一个完整的路径。我配置为如果出现问题,应仅重新启动应用程序。默认情况下,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:~$

here提供了一个很棒的node.js systemd教程。

如果您运行网络服务器:

您可能会在端口80上运行Web服务器时遇到一些问题。最简单的解决方案是在其他端口(例如4200)上运行Web服务器,然后将该端口重定向到端口80。

您可以使用以下命令完成此操作:

sudo iptables -t nat -A PREROUTING -i -p tcp --dport 80 -j REDIRECT --to-port 4200

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

  1. ExecStartPre添加端口转发
  2. ExecStopPost删除端口转发
  3. PermissionStartOnly以sudo的力量做到这一点

所以,像这样:

[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 zbaduk.ishida
[ec2-user@ip-172-31-39-212 system]$ sudo systemctl start zbaduk.ishida
[ec2-user@ip-172-31-39-212 system]$

答案 6 :(得分:-2)

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

@reboot  screen -d -m bash -c "cd /home/user/yourapp/; node app"

答案 7 :(得分:-11)

在AWS上使用forever并且它做得很好。使用

安装
 [sudo] npm install forever -g

添加应用程序

 forever start path_to_application

并停止使用应用程序

 forever stop path_to_application

This是一篇非常有用的文章,帮助我进行设置。