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

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

ただいまの
回答率

88.92%

AWSのEC2サーバー上でRailsを起動させたいです(Can't connect to local MySQL server through socket '/tmp/mysql.sock')

解決済

回答 3

投稿 編集

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

RYtera

score 8

解決したいこと:EC2サーバでRailsを起動したいです。

AWSでデプロイをします。
※ EC2インスタンス内で、MySQL、Rails、Unicornを使用します。
デプロイの経験が乏しく、解けない状況が続いており相談させてください。

発生している問題点と仮説

// ユニコーンを実行しようとしたところエラーになりました。
[ec2-user@ip アプリ名]$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D
=> master failed to start, check stderr log for details

// エラーメッセージに「check stderr log」とあるので、エラー詳細確認したところMySQL serverのエラーとのことです。
[ec2-user@ip アプリ名]$ less log/unicorn.stderr.log
=> E, [2020-07] ERROR -- : Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) (Mysql2::Error::ConnectionError)

試したこと

【試行1:SQLのパスの修正】
// 開発環境と本番環境のSQLの設定を同一にするため、socket周りを修正、githubへマージの後pullをしました。
#config/database.yml
production:
  <<: *default
  database: アプリ名_production
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock

//ソケットの読み込み先パスが同一か確認。設定されています。
$ mysql_config --socket
=> /var/lib/mysql/mysql.sock

// keyとpwが正しく入っているか確認しました。
=> SECRET_KEY_BASE=xxx
=> DATABASE_PASSWORD=xxx

// データベースを作成しマイグレーションを行いました。
[ec2-user@ip アプリ名]$ rails db:create RAILS_ENV=production
[ec2-user@ip アプリ名]$ rails db:migrate RAILS_ENV=production

// 再び、ユニコーンの起動を試みます。
[ec2-user@ip アプリ名]$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D
=> (反応なく次の行に遷移)

// 通過したので「http://elasticIP:3000」でアクセスするとビュー上でエラーになります。
=> We're sorry, but something went wrong.

// F12検証ツール
Failed to load resource: the server responded with a status of 500 (Internal Server Error)

// 再度エラーでひっかかっていた箇所を確認すると、同様のエラーのままでした。
[ec2-user@ip アプリ名]$ less log/unicorn.stderr.log
=> E, [2020-07-14   ] ERROR -- : Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) (Mysql2::Error::ConnectionError)


【試行2:各種確認】
// MySQLとUnicornの状態確認(PIDは取得できている様子です)
$ ps ax | grep mysql 
root      2850  0.0  0.2  11788  2824 pts/0    S    22:49   0:00 /bin/sh /usr/libexec/mysql56/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql     3064  0.0 46.0 1328608 464484 pts/0  Sl   22:49   0:01 /usr/libexec/mysql56/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql56/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
ec2-user  3622  0.0  0.2 110536  2220 pts/0    S+   23:39   0:00 grep --color=auto mysql

$ ps aux | grep unicorn
ec2-user  3454  0.1 11.9 515308 121084 ?       Sl   23:12   0:02 unicorn_rails master -c config/unicorn.rb -E production -D                                                                                            
ec2-user  3475  0.0 11.0 515308 111628 ?       Sl   23:17   0:00 unicorn_rails worker[0] -c config/unicorn.rb -E production -D                                                                                         
ec2-user  3604  0.0  0.2 110536  2192 pts/0    S+   23:34   0:00 grep --color=auto unicorn

//MySQL起動確認
[ec2-user@ip ~]$ sudo service mysqld status
=> mysqld (pid  15692) is running...

//MySQL接続確認
[ec2-user@ip ~]$ mysql -u root -p
=> Welcome to the MySQL monitor. 

// gemの版数でエラーになるとの記事から5.4.1にしています。
=> gem "unicorn", "5.4.1"

// ローカル環境でrails sによりPUMA確認
=> エラーなく動きます。


【試行3】
// AWSのEC2インスタンスの再起動
そもそもインスタンスを再起動しないと動かない事があるとの記事から
念のため行いましたが、同じエラーが出る状況です。

関連するソースコード

#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
  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


#database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  socket: /tmp/mysql.sock

development:
  <<: *default
  database: アプリ名_development

test:
  <<: *default
  database: アプリ名_test

production:
  <<: *default
  database: アプリ名_production
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock

色々な記事を参考に試行しましたがエラー状況が変わらず、
修正できないでいます。
情報不足や疑問点などありましたらご指摘ください。
何卒よろしくお願いいたします。

補足事項

Ruby(2.5.1)
Rails(5.2.4.3)
MySQL(5.6.47)
Unicorn(5.4.1)

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • Orlofsky

    2020/07/17 12:10

    [Oracle]タグは無関係だから削ってください。

    キャンセル

  • RYtera

    2020/07/17 12:54

    ご指摘ありがとうございます!
    削除致しました。

    キャンセル

回答 3

+1

これはよくわからないですね・・
次のような切り分けを行って原因の範囲を狭めていくのはいかがでしょうか

1

bundle exec rails s -e production -b 0.0.0.0

で起動してみて、データベースにアクセスできるか確認してみる
→ nginx に原因があるかどうかの切り分けになります

2
本番環境で database.yml の default の socket: の設定を
一時的に /var/lib/mysql/mysql.sock に変更して
データベースにアクセスできるか確認してみる
→ database.yml が読み込まれているかどうかの切り分けになります

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/19 23:24

    すみません、下記私のミスです。
    unicornのkillができていない事が原因だった様子です。
    「> in `initialize': Address already in use - bind(2)」

    killを確認後に、以下を実施すると
    bundle exec rails s -e production -b 0.0.0.0
    「* Listening on tcp://0.0.0.0:3000 Use Ctrl-C to stop 」
    となります。
    一旦ctrl Cで閉じて、MySQLを呼ぶとDATABASE、TABLESともに内容をshow可能です。
    [ec2-user@xxx ]$ mysql -u root -p


    ・切り分け案2について
    database.yml/default
    socket: /var/lib/mysql/mysql.sock
    に変更後も[ec2-user@xxx ]にて
    MySQLの閲覧可能です
    (SHOW DATABASE; / SHOW TABLES;)。

    キャンセル

  • 2020/07/19 23:39

    「データベースにアクセスできるか確認してみる」のは
    MySQL クライアントではなく、Rails でやってみてください
    つまり、ブラウザか curl でアクセスして Rails のログを確認してみてください

    キャンセル

  • 2020/07/21 23:02

    ご提案ありがとうございます!
    https://qiita.com/yasuhiroki/items/a569d3371a66e365316f
    curlについて上記記事を参考にしましたが理解が足らず解決不可でした。

    その後にゼロベースで確認したところなぜか起動できたため、
    本件クローズとさせて頂きます。
    切り分け案ありがとうございました!

    キャンセル

+1

config/uncorn.rb に listen という設定項目が有ると思います。そこが /tmp/mysql.sock になってませんか?

すみません、勘違いしていました、unicorn - nginx 間の問題ではなく、Rails - Mysqlの問題ですね。
質問の最初に書かれている「Can't connect to local MySQL server through socket '/tmp/mysql.sock'」は

[ec2-user@ip アプリ名]$ rails db:create RAILS_ENV=production
[ec2-user@ip アプリ名]$ rails db:migrate RAILS_ENV=production

が成功していれば 「Rails - Mysqlの問題」は解決しています。
成功していたならさらに

// 再度エラーでひっかかっていた箇所を確認すると、同様のエラーのままでした。
Can't connect to local MySQL server through socket '/tmp/mysql.sock'

というのが不思議です。
Rails - Mysqlの問題
Rails - unicorn の問題
の切り分けがまだ不十分に感じます。
RAILS_ENV=production rails c
でproduction環境でconsoleに入って、定義済のモデル、例えばUserがあるなら
User.count
とした時に 0 とか 12 とか返ってくるか確認してください。
帰ってきたら Rails - Mysqlの問題 はOKです。
RAILS_ENV=production は commandの引数で入れるとだめなcommandもあるので、念の為commandの前に置いて試してください。

なお、

in `initialize': Address already in use - bind(2) for "0.0.0.0" port 3000 (Errno::EADDRINUSE)
プロセスをkillし直しましたが同じくエラーのままでした。

これはおかしいです。killが失敗したか、違うプロセスをkillしたか何方かです。
3000を使おうとしているのが、unicorn と bundle exec rails s -e production -b 0.0.0.0 と2つ有りますから、要注意。

追記2
pry >User.count で => 0 となるってことは production環境で RailsとMySQLは接続できています。
なのになぜ???
気になるのは
bundle exec unicorn_rails -c config/unicorn.rb -E production -D
もしかしたら developmentで起動していないか?
実は私は 環境をパラメーターで渡すのは余り信用していないのです。
次の2つ試してください
RAILS_ENV=production bundle exec unicorn_rails -c config/unicorn.rb -D
-E でなく -e(下記のように)で
bundle exec unicorn_rails -c config/unicorn.rb -e production -D

AWSでいつまでも3000で実行するわけでは無いでしょうから、nginxとかに切り替えたほうが早いかも

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/17 13:11

    #confing/unicorn.rb
    > app_path = File.expand_path('../../', __FILE__)
    > worker_processes 1
    > working_directory app_path
    > pid "#{app_path}/tmp/pids/unicorn.pid"
    > listen 3000

    ポート番号の指定、3000にしています。

    キャンセル

  • 2020/07/19 23:04

    winterboum様
    いえ、ご連絡頂けるたけでもありがたいことです!

    細かくは(2)、「Can't connect to local MySQL server through socket '/tmp/mysql.sock'(2)」の状況です。
    下記実施して、0の数字が返ってきます。
    $ RAILS_ENV=production rails c
    pry >User.count
    => 0
    unicorn.rbを疑い文法など見直しましたが問題なさそうです。

    「in `initialize': Address already in use - bind(2)」に関して、
    仰るとおりkillの失敗が原因のようです。
    複数回実験してみると、なぜかkillができていない場合があります
    (ps aux | grep unicorn も実行されない事があります)。

    因みに、
    % less log/unicorn.stderr.log 、
    を実行した場合下方に
    ```
    bundler: failed to load command: unicorn_rails (/home/ec2-user/.rbenv/versions/2.5.1/bin/unicorn_rails)
    ArgumentError: Already running on PID:3927
    ```
    のエラーメッセージもあります。
    これが、Can't connectのエラーに紐づいて生じているのかは分かっていません。

    キャンセル

  • 2020/07/21 23:02

    試行案頂きありがとうございます!
    早速昨日試して下記結果でした。
    ①RAILS_ENV=production bundle exec unicorn_rails -c config/unicorn.rb -D
    =>同じエラーがでした。
    ②bundle exec unicorn_rails -c config/unicorn.rb -e production -D
    =>こちらもエラーでした(手許のメモを見ると確かfailed to loadか NameErrorあたりです)。

    Nginxにする前にもう一度という事で初期設定から見直したところ起動しました。どこが原因だったのか分かっていません。。。
    ・今回以前デプロイ練習用に作成したインスタンスを停止。
    ・UnicornとMySQL再作成。
    ・bashとzsh切り替えました。
    ・vim .env見直し、seacret_key再作成。
    ・image_tagをasset_path()に変更。
    ・db:seed実施

    ご助言頂いた通り、
    データ投入して挙動とビューを確認、Nginxに切り替えを進めます。
    提案頂きありがとうございました!

    キャンセル

check解決した方法

0

今回
・以前デプロイ練習用に作成したインスタンスを停止。
・UnicornとMySQL再作成。
・bashとzsh切り替えました。
・vim .env見直し、seacret_key再作成。
・image_tagをasset_path()に変更。
・db:seed実施

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • トップ
  • MySQLに関する質問
  • AWSのEC2サーバー上でRailsを起動させたいです(Can't connect to local MySQL server through socket '/tmp/mysql.sock')