是否有简要指南来说明如何在实例启动和运行时启动应用程序?如果它是通过安装的服务之一,yum
那么我想我可以用/sbin/chkconfig
它来将它添加到服务中。(为了确定,它是正确的吗?)
但是,我只想运行没有通过yum
. 要运行 node.js 程序,我必须sudo node app.js
在系统启动时在主目录中运行脚本。
我不习惯 Amazon Linux AMI,所以我很难找到一种“正确”的方式来在每次启动时自动运行一些脚本。
有没有一种优雅的方式来做到这一点?
是否有简要指南来说明如何在实例启动和运行时启动应用程序?如果它是通过安装的服务之一,yum
那么我想我可以用/sbin/chkconfig
它来将它添加到服务中。(为了确定,它是正确的吗?)
但是,我只想运行没有通过yum
. 要运行 node.js 程序,我必须sudo node app.js
在系统启动时在主目录中运行脚本。
我不习惯 Amazon Linux AMI,所以我很难找到一种“正确”的方式来在每次启动时自动运行一些脚本。
有没有一种优雅的方式来做到这一点?
一种方法是创建一个新贵的工作。这样,您的应用程序将在 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
您可以使用 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 正在开发中。
注意:我是永远服务的作者。
您可以创建一个可以启动和停止您的应用程序的脚本并将其放在 /etc/init.d 中;使脚本遵守 chkconfig 的约定(如下),然后使用 chkconfig 将其设置为在其他服务启动时启动。
您可以从 /etc/init.d 中选择一个现有脚本作为示例;本文描述了要求,基本上是:
设置好脚本后,您可以使用
chkconfig --add yourscript
chkconfig yourscript on
你应该很高兴。(某些发行版可能要求您手动将脚本符号链接到 /etc/init.d/rc.d,但我相信您的 AWS 发行版会在您启用脚本时为您执行此操作。
我的 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
不幸的是,这不是持久性的,因此每当您的服务器重新启动时,您都必须重复它。更好的方法是在我们的服务脚本中也包含这个命令:
ExecStartPre
添加端口转发ExecStopPost
删除端口转发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]$
前面提到的解决方案提供了很大的灵活性,但设置它确实需要一些时间。对于每个额外的应用程序,您都需要再次完成整个过程。当您安装第 5 个节点应用程序时,您肯定会开始怀疑:“必须有一个快捷方式”。
PM2 的优势在于它只需安装一项服务。接下来是管理实际应用程序的 PM2。
甚至 PM2 的初始设置也很容易,因为它会自动为您安装 pm2 服务。
npm install pm2 -g
添加新服务更加容易:
pm2 start index.js --name "foo"`.
当一切都启动并运行时,您可以保存设置,让它在重新启动时自动启动。
pm2 save
如果您想了解所有正在运行的节点应用程序,您可以运行pm2 list
PM2 还提供了一个在线(基于 Web)仪表板来远程监控您的应用程序。不过,您可能需要许可证才能访问某些仪表板功能(恕我直言,这有点高估了)。
使用 Elastic Beanstalk :) 提供对自动缩放、SSL 终止、蓝/绿部署等的支持
如果您想要基于 RedHat 的 linux 发行版的咸 sysadmin 方式(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"