質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.78%

EC2インスタンス起動後に自動でRailsアプリが起動、動作するようにしたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,242

begenner

score 70

現在AWSの無料枠内(EC2)でRailsアプリを2つ動かしています。
サンプルアプリを

(デプロイ編②)世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで - Qiita

を参考にデプロイし、無料枠内でおさめるためEC2に自動起動・停止の設定をしてあります。

そしてEC2インスタンスを起動後に自動でRailsアプリが利用できるようにするために

EC2(AWS)で起動時にアプリを自動起動する - Qiita

を参考に設定してみましたがEC2インスタンスを再起動しても
Railsアプリが利用できませんでした。
もし解決法がわかる方がいらっしゃいましたらご教授いただきますようよろしくお願いいたします(m_ _m)

エラー内容

webブラウザで下記のメッセージが表示される

We're sorry, but something went wrong.
If you are the application owner check the logs for more information.

期待する動作

EC2インスタンスを起動後に自動でRailsアプリがweb上で利用できるようにする

動作環境

AWS

  • インスタンスタイプ: t2.micro
  • EIP: 設定済

Rails

  • 4.2.11.1
  • Railsアプリケーションの場所: var/www/rails/myapp

補足

EC2再起動後、インスタンスにログインし下記のコアmんどを実行するとRailsアプリは動作します

cd /var/www/rails/myapp;
bundle exec unicorn_rails -c /var/www/rails/myapp/config/unicorn.conf.rb -D -E production;

試したこと(前提条件: terminalからEC2インスタンスにユーザーmyusernameで接続)

01-nginxを自動起動するように設定

[myusername@ip-xxx ~]$systemctl is-enabled nginx.service
# enabled

# 再起動後
[myusername@ip-xxx ~]$ systemctl status nginx
#● nginx.service - The nginx HTTP and reverse proxy server
#   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
#   Active: active (running) since 木 2019-10-10 07:23:08 UTC; 10min ago
#  Process: 3093 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
#  Process: 3074 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
#  Process: 3071 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
# Main PID: 3099 (nginx)
#   CGroup: /system.slice/nginx.service
#           ├─3099 nginx: master process /usr/sbin/nginx
#           └─3100 nginx: worker process

02-スクリプトファイル/home/username/start.shに実行したいコマンドを記述

# /home/myusername/start.sh
cd /var/www/rails/myapp
bundle exec rake assets:precompile RAILS_ENV=production
bundle exec unicorn_rails -c /var/www/rails/myapp/config/unicorn.conf.rb -D -E production
  1. 自動起動スクリプトの作成
# /home/myusername/application-starter
#!/bin/sh
# chkconfig: 345 99 10
# description: start shell
case "$1" in
  start)
    su -l myusername -c "sh /home/myusername/start.sh"
       ;;
  stop)
       echo "stop!"
       ;;
  *) break ;;
esac
  1. ルートユーザーに切り替え、起動シェルの登録
[myusername@ip-xxx ~]$ sudo su -
[root@ip-xxx ~]$ cd /etc/init.d/
[root@ip-xxx init.d]$ chmod +r application-starter
[root@ip-xxx init.d]$ chkconfig --add application-starter
[root@ip-xxx init.d]$ chkconfig application-starter on

追記(10/11)

yu_1985さんに教えていただいたURLを参考にして、

  • 自動起動スクリプトの作成を削除
  • Unit定義ファイルを作成
  • sudo systemctl list-unit-files --type=service | grep startを実行

しましたが、ステータス確認でstatusがfailedの状態でうまくいきませんでした。

$ sudo systemctl status start-app
# ● start-app.service - start-app daemon
#    Loaded: loaded (/etc/systemd/system/start-app.service; enabled; vendor preset: disabled)
#    Active: failed (Result: start-limit) since 金 2019-10-11 00:10:52 UTC; 14min ago
#  Main PID: 5821 (code=exited, status=127)
# 
# ip-xxx.ap-northeast-1.compute.internal systemd[1]: start-app.service: main process exited, code=exited, status=127/n/a
# ip-xxx.ap-northeast-1.compute.internal systemd[1]: Unit start-app.service entered failed state.
# ip-xxx.ap-northeast-1.compute.internal systemd[1]: start-app.service failed.
# ip-xxx.ap-northeast-1.compute.internal systemd[1]: start-app.service holdoff time over, scheduling restart.
# ip-xxx.ap-northeast-1.compute.internal systemd[1]: start request repeated too quickly for start-app.service
# ip-xxx.ap-northeast-1.compute.internal systemd[1]: Failed to start start daemon.
# ip-xxx.ap-northeast-1.compute.internal systemd[1]: Unit start-app.service entered failed state.
# ip-xxx.ap-northeast-1.compute.internal systemd[1]: start-app.service failed.

02-01. Unit定義ファイルを作成する

# etc/systemd/system/start-app.service
[Unit]
Description = start-app daemon

[Service]
ExecStart = /home/myusername/start.sh
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target


02-02. UnitがServiceとして認識されたか確認する

$ sudo systemctl list-unit-files --type=service | grep start
# plymouth-start.service                        disabled
# start-app.service                             enabled

02-03. 自動起動の設定、起動

# 自動起動on
$ sudo systemctl enable start-app
# 起動
$ sudo systemctl start start-app

追記3

ごにょごにょしてたらstatusに表示されるメッセージが変更されていたので追記します。
依然としてどの処理でエラーが発生しているのか、動作の妨げになっているのかわかりません(m_ _m)
参考: [CentOS7] systemdにサービスを登録して、サーバ起動時に自動でサービスを立ち上げる | RE:ENGINES

[Unit]
Description = start-app daemon

[Service]
User = myusername

# 環境変数パス
EnvironmentFile=/etc/systemd/env


ExecStart = /home/myusername/start.sh
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target
# /etc/systemd/env
PATH=/home/myusername/.rbenv/shims:/home/myusername/.rbenv/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/myusername/.local/bin:/home/myusername/bin

追記、修正後の結果

[myusername@ip-10-0-1-127 ~]$ sudo systemctl status start-app.service
# ● start-app.service - start-app daemon
#    Loaded: loaded (/etc/systemd/system/start-app.service; enabled; vendor preset: disabled)
#    Active: active (running) since 金 2019-10-11 07:01:56 UTC; 4s ago
#  Main PID: 3842 (start.sh)
#    CGroup: /system.slice/start-app.service
#            ├─3842 /bin/sh /home/myusername/start.sh
#            └─3843 /var/www/rails/myapp/vendor/bundle/ruby/2.4.0/bin/rake assets:precompile RAILS_ENV=production
# 
# 10月 11 07:01:56 ip-10-0-1-127.ap-northeast-1.compute.internal systemd[1]: start-app.service holdoff time over, scheduling restart.
# 10月 11 07:01:56 ip-10-0-1-127.ap-northeast-1.compute.internal systemd[1]: Started start-app daemon.
# 10月 11 07:01:56 ip-10-0-1-127.ap-northeast-1.compute.internal systemd[1]: Starting start-app daemon...
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

OSはなんでしょうか。Amazon LinuxとAmazon Linux2ではまた変わってきます。
systemctlを使っているので恐らくAmazon Linux2ではないかと思いますが…。

Amazon Linux2はCentOS7系なので、chkconfigではなくsystemdを使って設定する方法を調べてみてください。
たとえばこのへんなんかが参考になります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/14 09:56

    >ちょっと手元に試せる環境がないので正しいかわかりませんが、バックグラウンドで処理させたらどうなりますか?
    AWSにてバックグラウンドで処理させるとはどのような方法でしょうか?
    AWSに関してはまったくの初心者ですので自分ではわかりかねます(m_ _m)

    キャンセル

  • 2019/10/14 10:35

    コマンドの後ろに & をつけてください。
    https://qiita.com/inosy22/items/341cfc589494b8211844
    これはシェルに関する知識であってAWSは特に関係ないです。

    キャンセル

  • 2019/10/15 17:16

    返信が遅くなりすいません(m_ _m)
    再起動するとstatus が failed に戻っていました。

    https://qiita.com/cmwig65/items/3386a061aeb3d2f81b81
    https://qiita.com/vukujin/items/68d0957d7ac3c1dec977
    上記の2つのURLを参考に
    cat /var/log/messages

    を実行すると
    Failed at step EXEC spawning /home/ueno/start.sh: Exec format error

    というエラーが表示されていたため
    /etc/systemd/system/start-app.service

    ExecStart = /home/myusername/start.sh

    ExecStart =/bin/bash /home/myusername/start.sh
    に変更したところ
    期待通り動作してくれました!!
    とても丁寧にご対応いただきありがとうございました!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る