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

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

ただいまの
回答率

87.59%

Rails 本番環境 エラーの原因

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 679

score 0

master failed to start, check stderr log for details

[ec2 リポジトリ 名]$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D


をすると

master failed to start, check stderr log for details


がでる。

そこから

less log/unicorn.stderr.log


で調べるとエラーを発見

発生している問題・エラーメッセージ

[ec2 リポジトリ 名]$ less log/unicorn.stderr.log
I, [2021-02-02T12:28:15.675241 #18872]  INFO -- : Refreshing Gem list
bundler: failed to load command: unicorn_rails (/home/ec2-user/.rbenv/versions/2.6.5/bin/unicorn_rails)
NoMethodError: Cannot load `Rails.config.active_storage.service`:
undefined method `fetch' for nil:NilClass

試したこと

S3でバケットの作成

バケットポリシーの設定

"aws-sdk-s3"をGemfileに追記

gem "aws-sdk-s3", require: false


% bundle install



development.rbを編集
config/environments/development.rb

# ~省略~

config.active_storage.service = :amazon

# ~省略~



storage.ymlにバケット名とリージョン名を記述
config/storage.yml

amazon:
service: S3
region: ap-northeast-1
bucket: バケット名



環境変数を設定するファイルを開く

% vim ~/.zshrc



環境変数にアクセスキーを代入

export AWS_ACCESS_KEY_ID="CSVファイルのAccess key ID"
export AWS_SECRET_ACCESS_KEY="CSVファイルのSecret access key"



保存

環境変数の設定ファイルを読み込み直し、追加した環境変数を使えるようにする

% source ~/.zshrc



storage.ymlを編集
config/storage.yml

amazon:
service: S3
region: ap-northeast-1
bucket:  バケット名が記載されている状態
access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
secret_access_key:  <%= ENV['AWS_SECRET_ACCESS_KEY'] %>



git-secretsをインストール

% cd ~/ 
% brew install git-secrets


% cd アプリケーション名 #開発中のアプリに移動
% git secrets --install



git-secretsの条件を設定

% git secrets --register-aws --global
% git secrets --list



GitHub Desktopからgit-secretsを利用できるようにする

% sudo cp /usr/local/bin/git-secrets /Applications/GitHub\ Desktop.app/Contents/Resources/app/git/bin/git-secrets



今後作成する全てのリポジトリに、git-secretsが適用されるように

% git secrets --install ~/.git-templates/git-secrets
% git config --global init.templatedir '~/.git-templates/git-secrets'



production.rbを編集
production.rbに記述している画像の保存先の設定を「:local」→「:amazon」に変更
config/environments/production.rb

# ~省略~

config.active_storage.service = :amazon

# ~省略~



EC2インスタンスを作成

Amazon Linux 2 AMI を選択

キーペア名を決めて、ダウンロード

Elastic IPの作成

Elastic IPの紐付けをする

インバウンドのルールの編集

タイプ プロトコル ポート範囲 送信元
HTTP TCP 80 カスタム/0.0.0.0/0
HTTP TCP 80 カスタム::/0

を追加

EC2インスタンスへログイン

% cd ~
% mkdir ~/.ssh
% mv Downloads/ダウンロードした鍵の名前.pem .ssh/
% cd .ssh/
% ls

# pemファイルが存在するか確認
% chmod 600 ダウンロードした鍵の名前.pem
% ssh -i ダウンロードした鍵の名前.pem ec2-user@作成したEC2インスタンスと紐付けたElastic IP



「yes」と入力し、実行

パッケージをアップデート

[ec2 ~]$ sudo yum -y update
[ec2 ~]$ sudo yum  -y install git make gcc-c++ patch libyaml-devel libffi-devel libicu-devel zlib-devel readline-devel libxml2-devel libxslt-devel ImageMagick ImageMagick-devel openssl-devel libcurl libcurl-devel curl



EC2にNode.jsをインストール

[ec2 ~]$ sudo curl -sL https://rpm.nodesource.com/setup_10.x | sudo bash -
[ec2 ~]$ sudo yum -y install nodejs



EC2にYarnのインストール

[ec2 ~]$ sudo yum -y install wget
[ec2 ~]$ sudo wget https://dl.yarnpkg.com/rpm/yarn.repo -O /etc/yum.repos.d/yarn.repo
[ec2 ~]$ sudo yum -y install yarn



EC2にrbenvとruby-buildをインストール

# ①rbenvのインストール
[ec2 ~]$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv 

# ②パスを通す
[ec2 ~]$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile 

# ③rbenvを呼び出すための記述
[ec2 ~]$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

# ④.bash_profileの読み込み
[ec2 ~]$ source .bash_profile

# ⑤ruby-buildのインストール
[ec2 ~]$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

# ⑥rehashを行う
[ec2 ~]$ rbenv rehash



EC2にRubyをインストール

# Ruby 2.6.5のバージョンをインストール
[ec2 ~]$ rbenv install 2.6.5

# EC2インスタンス内で使用するRubyのバージョンを決める
[ec2 ~]$ rbenv global 2.6.5

# rehashを行う
[ec2 ~]$ rbenv rehash  

# Rubyのバージョンを確認
[ec2 ~]$ ruby -v 



MariaDBをインストール

[ec2 ~]$ sudo yum -y install mysql56-server mysql56-devel mysql56 mariadb-server mysql-devel



データベースを起動

[ec2 ~]$ sudo systemctl start mariadb
[ec2 ~]$ sudo systemctl status mariadb



データベースのrootパスワードの設定

[ec2 ~]$ sudo /usr/bin/mysql_secure_installation



データベースへの接続を確認

[ec2 ~]$ mysql -u root -p


確認できれば「exit」で抜ける

EC2サーバーのssh鍵のペアを作成し、GitHubにssh鍵を登録

[ec2 ~]$ ssh-keygen -t rsa -b 4096



ssh公開鍵の値を確認し、GitHubに登録

[ec2 ~]$ cat ~/.ssh/id_rsa.pub


「ssh-rsa」から「末尾の文字」までコピー

SSH鍵登録に公開鍵を保存

確認

[ec2 ~]$ ssh -T git@github.com



Unicornをインストール

group :production do
  gem 'unicorn', '5.4.1'
end
% bundle install



「unicorn.rb」を作成し、以下のように編集
config/unicorn.rb

app_path = File.expand_path('../../', __FILE__)

worker_processes 1

working_directory app_path

pid "#{app_path}/tmp/pids/unicorn.pid"

listen 3000

stderr_path "#{app_path}/log/unicorn.stderr.log"

stdout_path "#{app_path}/log/unicorn.stdout.log"

timeout 60

preload_app true
GC.respond_to?(:copy_on_write_friendly=) && GC.copy_on_write_friendly = true

check_client_connection false

run_once = true

before_fork do |server, worker|
  defined?(ActiveRecord::Base) &&
    ActiveRecord::Base.connection.disconnect!

  if run_once
    run_once = false # prevent from firing again
  end

  old_pid = "#{server.config[:pid]}.oldbin"
  if File.exist?(old_pid) && server.pid != old_pid
    begin
      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
      Process.kill(sig, File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH => e
      logger.error e
    end
  end
end

after_fork do |_server, _worker|
  defined?(ActiveRecord::Base) && ActiveRecord::Base.establish_connection
end



編集内容をリモートリポジトリに反映する

EC2にローカルの全内容を反映する

#mkdirコマンドで新たにディレクトリを作成
[ec2 ~]$ sudo mkdir /var/www/

#作成したwwwディレクトリの権限をec2-userに変更
[ec2 ~]$ sudo chown ec2-user /var/www/


「リポジトリURL」を取得(URLをコピー)

[ec2 ~]$ cd /var/www/
[ec2 www]$ git clone コピーしたURLを貼り付ける



Swapファイルの領域を広げる

[ec2 ~]$ cd
[ec2 ~]$ sudo dd if=/dev/zero of=/swapfile1 bs=1M count=512
[ec2 ~]$ sudo chmod 600 /swapfile1
[ec2 ~]$ sudo mkswap /swapfile1
[ec2 ~]$ sudo swapon /swapfile1
[ec2 ~]$ sudo sh -c 'echo "/swapfile1  none        swap    sw              0   0" >> /etc/fstab'



gemをインストール

[ec2 www]$ cd  /var/www/開発中のアプリケーション

# rubyのバージョンを確認
[ec2 <リポジトリ名>]$ ruby -v



secret_key_baseを作成

[ec2 <リポジトリ名>]$ rake secret



環境変数を設定

[ec2 ~]$ sudo vim /etc/environment
DATABASE_PASSWORD='データベースのrootユーザーのパスワード'
SECRET_KEY_BASE='secret_key_base'

AWS_ACCESS_KEY_ID='CSVファイルのAccess key IDの値'
AWS_SECRET_ACCESS_KEY='CSVファイルのSecret access key'


入力後、保存

環境変数を反映

[ec2 ~]$ exit
$ ssh -i ダウンロードした鍵の名前.pem ec2-user@作成したEC2インスタンスと紐付けたElastic IP



確認

[ec2 ~]$ env | grep SECRET_KEY_BASE
SECRET_KEY_BASE='secret_key_base'

[ec2 ~]$ env | grep DATABASE_PASSWORD
DATABASE_PASSWORD='データベースのrootユーザーのパスワード'

[ec2 ~]$ env | grep AWS_SECRET_ACCESS_KEY
AWS_SECRET_ACCESS_KEY='Secret access key'

[ec2 ~]$ env | grep AWS_ACCESS_KEY_ID
AWS_ACCESS_KEY_ID='Access key ID'



セキュリティグループのポートを設定        

タイプ プロトコル ポート範囲 送信元
カスタムTCP TCP 3000 カスタム/0.0.0.0/0

を追加

本番環境でRailsを起動

production:
  <<: *default
  database:編集しない
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock
[ec2 <リポジトリ名>] git pull origin master
[ec2 <リポジトリ名>]$ rails db:create RAILS_ENV=production
Created database 'データベース名'
[ec2 <リポジトリ名>]$ rails db:migrate RAILS_ENV=production
[ec2 ~]$ cd /var/www/リポジトリ
[ec2 <リポジトリ名>]$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D


エラー

master failed to start, check stderr log for details

よろしくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

0

〜解決方法(自己解決)〜

Railsガイドを参考に

config/storage.ymlファイルの

amazon:
service: S3
region: ap-northeast-1
bucket:  バケット名が記載されている状態
access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
secret_access_key:  <%= ENV['AWS_SECRET_ACCESS_KEY'] %>

を修正

修正箇所

Before
amazon:
service: S3
region: ap-northeast-1
bucket:  バケット名が記載されている状態
access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
secret_access_key:  <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
After
amazon:
  service: S3
  region: ap-northeast-1
  bucket:  バケット名が記載されている状態
  access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
  secret_access_key:  <%= ENV['AWS_SECRET_ACCESS_KEY'] %>

まさかのインデント(空白)を入れてなかっただけでした!!!!!!!!!!!!

これで再度試すと本番環境で動作しました^^
(凡ミスには気をつけます汗)←解決するのに2日間もかかりました

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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