🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

1860閲覧

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

begenner

総合スコア80

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

1クリップ

投稿2019/10/10 08:14

編集2019/10/11 07:21

現在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を自動起動するように設定

bash

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

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

bash

1# /home/myusername/start.sh 2cd /var/www/rails/myapp 3bundle exec rake assets:precompile RAILS_ENV=production 4bundle exec unicorn_rails -c /var/www/rails/myapp/config/unicorn.conf.rb -D -E production
  1. 自動起動スクリプトの作成

bash

1# /home/myusername/application-starter 2#!/bin/sh 3# chkconfig: 345 99 10 4# description: start shell 5case "$1" in 6 start) 7 su -l myusername -c "sh /home/myusername/start.sh" 8 ;; 9 stop) 10 echo "stop!" 11 ;; 12 *) break ;; 13esac
  1. ルートユーザーに切り替え、起動シェルの登録

bash

1[myusername@ip-xxx ~]$ sudo su - 2[root@ip-xxx ~]$ cd /etc/init.d/ 3[root@ip-xxx init.d]$ chmod +r application-starter 4[root@ip-xxx init.d]$ chkconfig --add application-starter 5[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の状態でうまくいきませんでした。

bash

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

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

bash

1# etc/systemd/system/start-app.service 2[Unit] 3Description = start-app daemon 4 5[Service] 6ExecStart = /home/myusername/start.sh 7Restart = always 8Type = simple 9 10[Install] 11WantedBy = multi-user.target

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

bash

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

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

bash

1# 自動起動on 2$ sudo systemctl enable start-app 3# 起動 4$ sudo systemctl start start-app

追記3

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

bash

1[Unit] 2Description = start-app daemon 3 4[Service] 5User = myusername 6 7# 環境変数パス 8EnvironmentFile=/etc/systemd/env 9 10 11ExecStart = /home/myusername/start.sh 12Restart = always 13Type = simple 14 15[Install] 16WantedBy = multi-user.target

bash

1# /etc/systemd/env 2PATH=/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

追記、修正後の結果

bash

1[myusername@ip-10-0-1-127 ~]$ sudo systemctl status start-app.service 2# ● start-app.service - start-app daemon 3# Loaded: loaded (/etc/systemd/system/start-app.service; enabled; vendor preset: disabled) 4# Active: active (running) since 金 2019-10-11 07:01:56 UTC; 4s ago 5# Main PID: 3842 (start.sh) 6# CGroup: /system.slice/start-app.service 7# ├─3842 /bin/sh /home/myusername/start.sh 8# └─3843 /var/www/rails/myapp/vendor/bundle/ruby/2.4.0/bin/rake assets:precompile RAILS_ENV=production 9# 10# 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. 11# 10月 11 07:01:56 ip-10-0-1-127.ap-northeast-1.compute.internal systemd[1]: Started start-app daemon. 12# 10月 11 07:01:56 ip-10-0-1-127.ap-northeast-1.compute.internal systemd[1]: Starting start-app daemon...

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

投稿2019/10/10 17:17

yu_1985

総合スコア7588

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

begenner

2019/10/11 00:37

教えていただいたURLを参考に設定していきましたが status が failed となりうまくいきません。 下記のようなエラーが表示された時の確認場所はどこを見ればいいのでしょうか? ※当ページの追記場所(https://teratail.com/questions/216511#1011)
yu_1985

2019/10/11 02:21

元の手順だとスクリプトに読み取り権限しかついてないような気がするんですが、実行権限(+x)つけなくて大丈夫なんでしたっけ?
begenner

2019/10/11 05:55

記事を参考にそのままやってたので気にしてませんでした(m_ _m) 今+rxつけてテストしてみましたがダメでした(m_ _m)
yu_1985

2019/10/11 06:04

timeoverとメッセージに出てるので、どこかで処理がストップしてませんか?
yu_1985

2019/10/11 06:12

> Main PID: 5821 (code=exited, status=127) なので、スクリプトを実行しているユーザがコマンドを発見できていないような気もします。
begenner

2019/10/11 07:47

変更を加えてみましたがstatus がactiveに変わっても動作は変わっていないように見えます(m_ _m) いちおう ログイン直後に sh start.sh を実行すると処理が実行され期待通りの動きはできています。
yu_1985

2019/10/13 15:41

ちょっと手元に試せる環境がないので正しいかわかりませんが、バックグラウンドで処理させたらどうなりますか?
begenner

2019/10/14 00:56

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

2019/10/15 08: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 に変更したところ 期待通り動作してくれました!! とても丁寧にご対応いただきありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問