LoginSignup
0
2

More than 1 year has passed since last update.

本番環境(EC2)上でunicornが起動できない時に確認すべきこと

Posted at

概要

下記記事を参考に、RailsアプリをAWS上で動かす設定をしていたが、unicornの起動から色々とハマった。
その際の解決方法について。

環境

  • アプリ

    • ruby 3.0.2
    • rails 6.1.4
    • mysql 8.0.31
  • EC2AMI

    • Amazon Linux2 AMI

unicorn起動

ターミナル(EC2)
# xx-xx-xx-xxはパプリックIPアドレス
[ec2-user@ip-xx-xx-xx-xx <app名>]$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D

エラー発生

master failed to start, check stderr log for details

エラー内容確認

ログをチェック

cat log/unicorn.stderr.log

エラー内容抜粋

関係ありそうなログの記述は大きく下記の2つ。

log/unicorn.stderr.log
エラー①
Access denied for user 'ec2-user'@'localhost' (using password: NO) (ActiveRecord::ConnectionNotEstablished)

エラー②
Unknown MySQL server host 'db' (-2) (ActiveRecord::ConnectionNotEstablished)

確認事項1:そもそもDBは作ったか?

ターミナル(EC2)
[ec2-user@ip-xx-xx-xx-xx <app名>]$ mysql -u root -p
Enter password: パスワードを入力
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 68
Server version: 8.0.31 MySQL Community Server - GPL
# データベースを確認
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.04 sec)

データベースが作成されていないことが判明。

 # データベースを作成
[ec2-user@ip-xx-xx-xx-xx <app名>]$ rails db:create RAILS_ENV=production

実行すると、別のエラーが発生。

Caused by:
Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (-2)

確認事項2:本番環境のdatabase設定は正確に行っているか?

エラー②と同じように、「'db'という名前のhostに接続できない」ことでエラーとなっている様子。
DBのhost名称設定は、config/database.ymlで規定している。

config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: <%= ENV['DATABASE_DEV_PASSWORD'] %>
  host: db

--中略--

production:
  <<: *default
  database: <%= Rails.application.credentials.db[:database] %>
  username: <%= Rails.application.credentials.db[:username] %>
  password: <%= Rails.application.credentials.db[:password] %>
  socket: <%= Rails.application.credentials.db[:socket] %>

production環境のhostは、defaultで規定した'db'となっている。
これを、productionのみ'localhost'としてみる。

# 一旦本番環境のソースを直接修正
[ec2-user@ip-xx-xx-xx-xx <app名>]$ vim config/database.yml
config/database.yml修正後
--修正箇所抜粋--
production:
  <<: *default
  database: <%= Rails.application.credentials.db[:database] %>
  username: <%= Rails.application.credentials.db[:username] %>
  password: <%= Rails.application.credentials.db[:password] %>
  socket: <%= Rails.application.credentials.db[:socket] %>
  host: localhost

これにより、下記DB作成が正常に実行できた。

 # データベースを作成
[ec2-user@ip-xx-xx-xx-xx <app名>]$ rails db:create RAILS_ENV=production

unicorn起動

ターミナル(EC2)
[ec2-user@ip-xx-xx-xx-xx <app名>]$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D

エラーの発生は無し。

起動自体はできていることを確認。

ターミナル(EC2)
[ec2-user@ip-xx-xx-xx-xx <app名>]$ ps -ef | grep unicorn | grep -v grep
ec2-user 22015     1  0 11:32 ?        00:00:01 unicorn_rails master -c config/unicorn.rb -E production -D
ec2-user 22017 22015  0 11:32 ?        00:00:00 unicorn_rails worker[0] -c config/unicorn.rb -E production -D

最後に

より良い方法や間違い等ありましたらご指摘いただけますと幸いです!

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2