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

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

詳細はこちら
unicorn

Unicornは、汎用のRackアプリケーションサーバ。RackとWebサーバーの機能を併せ持ちます。レスポンス処理や、Nginx単体がRackの機能をサポートしていない事から、一般的にはNginx+Unicorn+Railsの構成を取って用います。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Amazon Route 53

Amazon Route 53 はAmazonが提供する、 可用性と拡張性に優れた ドメインネームシステム(DNS)サービスです。

Amazon EC2

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

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

Q&A

解決済

1回答

1494閲覧

Rails 本番環境 エラーの原因

ken0426

総合スコア34

unicorn

Unicornは、汎用のRackアプリケーションサーバ。RackとWebサーバーの機能を併せ持ちます。レスポンス処理や、Nginx単体がRackの機能をサポートしていない事から、一般的にはNginx+Unicorn+Railsの構成を取って用います。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Amazon Route 53

Amazon Route 53 はAmazonが提供する、 可用性と拡張性に優れた ドメインネームシステム(DNS)サービスです。

Amazon EC2

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

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

0グッド

0クリップ

投稿2021/02/01 18:50

編集2021/02/02 17:47

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に追記

Gemfile

1gem "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をインストール

Gemfile

1group :production do 2 gem 'unicorn', '5.4.1' 3end
% 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'


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

タイププロトコルポート範囲送信元
カスタムTCPTCP3000カスタム/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

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

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

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

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

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

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

guest

回答1

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日間もかかりました

投稿2021/02/02 17:45

編集2021/02/02 17:50
ken0426

総合スコア34

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問