是否有简短的指南来解释如何在实例启动并运行时启动应用程序?如果它是通过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
不幸的是,这不是持久的,因此每当服务器重新启动时,您都必须重复它。更好的方法是在我们的服务脚本中包含以下命令:
-
ExecStartPre
添加端口转发 -
ExecStopPost
删除端口转发 -
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所提到的,您也可以使用 pm2
与systemd
进行交互。虽然我认为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
这是一篇有用的文章,帮助我设置了它。