インスタンスの起動および実行時にアプリケーションを起動する方法を説明する簡単なガイドはありますか? yum
を介してインストールされたサービスの1つであれば、/sbin/chkconfig
を使用してサービスに追加できると思います。 (確認するために、正しいですか?)
ただし、yum
を介してインストールされていないプログラムを実行したいだけです。 node.jsプログラムを実行するには、システムが起動するたびにホームディレクトリでスクリプトSudo node app.js
を実行する必要があります。
私はAmazon Linux AMIに慣れていないので、ブートのたびにスクリプトを自動的に実行する「正しい」方法を見つけるのに少し苦労しています。
これを行うエレガントな方法はありますか?
1つの方法は、スタートアップジョブを作成することです。このようにして、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)ノードアプリのupstartスクリプトを作成します。
/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 URL: https://github.com/zapty/forever-service
現在、forever-serviceはAmazon Linux、CentOS、他のLinuxディストリビューションのRedhatサポートをサポートしています。MacとWindowsは機能しています。
注:私はforever-serviceの著者です。
アプリを起動および停止できるスクリプトを作成し、/ etc/init.dに配置できます。スクリプトをchkconfigの規則(下記)に準拠させ、次にchkconfigを使用して、他のサービスが開始されたときに開始するように設定します。
/etc/init.dから既存のスクリプトを選択して、例として使用できます。 この記事 は基本的に以下の要件を説明しています。
スクリプトを設定したら、使用できます
chkconfig --add yourscript
chkconfig yourscript on
そしてあなたは行ってもいいはずです。 (一部のディストリビューションでは、スクリプトに手動で/etc/init.d/rc.dへのシンボリックリンクが必要になる場合がありますが、スクリプトを有効にすると、AWSディストリビューションがそれを行うと考えています。
Elastic Beanstalkを使用:)自動スケーリング、SSL終了、ブルー/グリーン展開などのサポートを提供します。
私の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:~$
Node.jsの優れたsystemdチュートリアルが利用可能です こちら 。
おそらく、ポート80でWebサーバーを実行する際にいくつかの問題が発生するでしょう。そして、最も簡単な解決策は、実際に異なるポート(4200など)でWebサーバーを実行し、そのポートをポート80にリダイレクトすることです。次のコマンドでこれを実現できます。
Sudo iptables -t nat -A PREROUTING -i -p tcp --dport 80 -j REDIRECT --to-port 4200
残念ながら、これはnot persistentであるため、サーバーを再起動するたびに繰り返す必要があります。 より良いアプローチは、サービススクリプトにこのコマンドを含めることです:
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]$