如何在 AWS 上的 Amazon Linux AMI 中自动启动Node.js应用程序



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

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

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

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

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

以下是开始步骤:

1) 安装新贵实用程序(如果您使用标准 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启动应用程序

您可以使用永久服务将节点脚本作为服务进行预配,并在启动期间自动启动。以下命令将完成必要的操作,

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

这将通过永久将当前目录中的 app.js 作为服务进行配置。每次重新启动系统时,该服务都会自动重新启动。同样,当停止时,它将尝试优雅地停止。此脚本也预配日志旋转脚本。

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

截至目前,永久服务支持Amazon Linux,CentOS,Redhat支持其他Linux发行版,Mac和Windows正在开发中。

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

我的 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:~$

一个很棒的 systemd for node.js 教程在这里找到。

如果您运行网络服务器:

在端口 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使用须藤电源执行此操作

所以,像这样:

[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]$

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

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

PM2 的优点是只需安装一项服务。接下来是PM2,它管理实际的应用程序。

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

npm install pm2 -g

添加新服务更加容易:

pm2 start index.js --name "foo"`. 

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

pm2 save

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

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

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

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

也许这个或这个帮助。(或者只是谷歌"创建RPM包")

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

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

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

设置脚本后,您可以使用

 chkconfig --add yourscript 
 chkconfig yourscript on 

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

使用 Elastic Beanstalk :) 提供对自动扩展、SSL 终止、蓝/绿部署等的支持

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

https://en.wikipedia.org/wiki/Systemd

按照 EC2 实例上的描述设置所有内容,拍摄自定义 AMI 的快照,并将此自定义 AMI 用作托管应用程序的 EC2 实例的基础。这样,您就不必多次完成所有这些设置。如果您在具有正常运行时间要求的生产环境中运行,您可能还需要熟悉负载均衡器。

或者,是的,正如@bvdb所提到的,您也可以使用 pm2systemd进行交互。虽然我认为pm2无助于跨多个 EC2 实例运行您的应用程序,但绝对建议用于具有正常运行时间要求的生产环境。

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

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

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

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

一直在 AWS 上使用,它做得很好。安装 使用

 [sudo] npm install forever -g

添加应用程序使用

 forever start path_to_application

并停止使用应用程序

 forever stop path_to_application

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

最新更新