web-dev-qa-db-ja.com

AWSのAmazon Linux AMIでnode.jsアプリケーションを自動的に起動するにはどうすればよいですか?

インスタンスの起動および実行時にアプリケーションを起動する方法を説明する簡単なガイドはありますか? yumを介してインストールされたサービスの1つであれば、/sbin/chkconfigを使用してサービスに追加できると思います。 (確認するために、正しいですか?)

ただし、yumを介してインストールされていないプログラムを実行したいだけです。 node.jsプログラムを実行するには、システムが起動するたびにホームディレクトリでスクリプトSudo node app.jsを実行する必要があります。

私はAmazon Linux AMIに慣れていないので、ブートのたびにスクリプトを自動的に実行する「正しい」方法を見つけるのに少し苦労しています。

これを行うエレガントな方法はありますか?

40
user482594

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

20
mvbl fst

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の著者です。

9
arva

簡単な解決策は、アプリを/etc/rc.localから起動することです。そこにコマンドを追加するだけです。

しかし、エレガントな方法を使用したい場合は、アプリケーションをrpmファイルにパッケージ化し、/etc/rc.dに含まれる起動スクリプトを用意して、アプリケーションでchkconfigを使用できるようにする必要があります。次に、インスタンスにrpmをインストールします。

多分 this または this ヘルプ。 (または単に「rpmパッケージの作成」のためにグーグル)

7
Unknown

アプリを起動および停止できるスクリプトを作成し、/ etc/init.dに配置できます。スクリプトをchkconfigの規則(下記)に準拠させ、次にchkconfigを使用して、他のサービスが開始されたときに開始するように設定します。

/etc/init.dから既存のスクリプトを選択して、例として使用できます。 この記事 は基本的に以下の要件を説明しています。

  • 必要なシェルを識別する実行可能スクリプト(つまり、#!/ bin/bash)
  • #chkconfig:という形式のコメントは、多くの場合345です。startprioはサービスを開始する順序を示し、stopprioはサービスを停止する順序を示します。私は通常、すでに存在する同様のサービスを選択し、これらの値のガイドとして使用します(つまり、Web関連サービスがある場合は、httpdと同じレベルで開始し、同様の開始および停止の優先順位で)。

スクリプトを設定したら、使用できます

 chkconfig --add yourscript 
 chkconfig yourscript on 

そしてあなたは行ってもいいはずです。 (一部のディストリビューションでは、スクリプトに手動で/etc/init.d/rc.dへのシンボリックリンクが必要になる場合がありますが、スクリプトを有効にすると、AWSディストリビューションがそれを行うと考えています。

5
TomG

Elastic Beanstalkを使用:)自動スケーリング、SSL終了、ブルー/グリーン展開などのサポートを提供します。

0
Tim Fulmer

私の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チュートリアルが利用可能です こちら

Webサーバーを実行する場合:

おそらく、ポート80でWebサーバーを実行する際にいくつかの問題が発生するでしょう。そして、最も簡単な解決策は、実際に異なるポート(4200など)でWebサーバーを実行し、そのポートをポート80にリダイレクトすることです。次のコマンドでこれを実現できます。

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

残念ながら、これはnot persistentであるため、サーバーを再起動するたびに繰り返す必要があります。 より良いアプローチは、サービススクリプトにこのコマンドを含めることです:

  1. ExecStartPreはポート転送を追加します
  2. ExecStopPostはポート転送を削除します
  3. 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]$
0
bvdb