是否有简要指南解释如何在实例启动和运行时启动应用程序?如果它是通过yum
安装的服务之一,那么我想我可以使用/sbin/chkconfig
将其添加到服务中。 (为了确定,它是否正确?)
但是,我只想运行未通过yum
安装的程序。要运行node.js程序,只要系统启动,我就必须在主目录下运行脚本sudo node app.js
。
我不习惯使用Amazon Linux AMI,所以在每次启动时都找不到自动运行某些脚本的“正确”方法。
有优雅的方法吗?
答案 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。
答案 3 :(得分:5)
您可以创建一个脚本,可以启动和停止您的应用并将其放在/etc/init.d中;使脚本遵循chkconfig的约定(如下),然后使用chkconfig将其设置为在启动其他服务时启动。
您可以从/etc/init.d中选择一个现有脚本作为示例; this article描述了基本要求:
设置完脚本后,您可以使用
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
不幸的是,这不是持久性,因此,每当服务器重新启动时,都必须重复此操作。 一种更好的方法是也将此命令包含在我们的服务脚本中:
ExecStartPre
添加端口转发ExecStopPost
删除端口转发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)