49

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

但是,我只想运行没有通过yum. 要运行 node.js 程序,我必须sudo node app.js在系统启动时在主目录中运行脚本。

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

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

4

8 回答 8

23

一种方法是创建一个新贵的工作。这样,您的应用程序将在 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

于 2012-06-30T17:19:26.580 回答
11

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

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

这将通过永远将当前目录中的 app.js 配置为服务。每次系统重启时服务都会自动重启。此外,当它停止时,它会尝试优雅地停止。此脚本也提供logrotate脚本。

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

截至目前,forever-service 支持 Amazon Linux、CentOS、Redhat 对其他 Linux 发行版的支持,Mac 和 Windows 正在开发中。

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

于 2014-08-26T04:43:20.847 回答
6

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

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

也许这个这个帮助。(或者只是谷歌“创建 rpm 包”)

于 2012-06-30T17:10:39.593 回答
5

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

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

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

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

 chkconfig --add yourscript 
 chkconfig yourscript on 

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

于 2013-04-23T01:59:06.607 回答
5

我的 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应用程序已启动。您将需要一个完整的路径。我配置了如果出现问题,应用程序应该简单地重新启动。默认情况下,亚马逊使用的实例没有用户密码。

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

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

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

如果您运行网络服务器:

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

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

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

  1. ExecStartPre添加端口转发
  2. ExecStopPost删除端口转发
  3. PermissionStartOnly用 sudo power 做到这一点

所以,像这样:

[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)仪表板来远程监控您的应用程序。不过,您可能需要许可证才能访问某些仪表板功能(恕我直言,这有点高估了)。

于 2019-01-06T00:53:46.347 回答
-1

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

如果您想要基于 RedHat 的 linux 发行版的咸 sysadmin 方式(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 中进行开发,大多数事情都部署到云中的无服务器函数执行,并且根本不需要考虑包安装或应用程序启动。

于 2017-07-26T00:06:17.223 回答
-2

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

@reboot  screen -d -m bash -c "cd /home/user/yourapp/; node app"
于 2017-06-26T18:50:48.293 回答
-12

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

 [sudo] npm install forever -g

添加应用程序使用

 forever start path_to_application

并停止应用程序使用

 forever stop path_to_application

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

于 2012-06-30T17:17:42.837 回答