前提・実現したいこと
作ったアプリケーションのデプロイ作業を行うことが目的です。
AWSです。
Capistranoではまだ行っておらず、
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D
こんな形でユニコーンの起動を行おうとしております。
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ rails db:create RAILS_ENV=production Created database '<データベース名>' [ec2-user@ip-172-31-23-189 <リポジトリ名>]$ rails db:migrate RAILS_ENV=production
これらも実行できており、エラーは起きておりません。
mysqlも起動できております。
nginxも起動できております。
githubにもプッシュできております。
念のため、
git pull origin master
しております。
EC2インスタンスに環境変数の設定は完了しております。
ただ、疑問点としては、
エラー文にあるソケットの
socket '/tmp/mysql.sock'
と
database.ymlに記載のソケットの位置の
socket: /var/lib/mysql/mysql.sock
が違うため、おそらくこれが原因ではないかと考えておりますが、
対策がわかりません。
おそらくdatabase.ymlの
default: &default adapter: mysql2 encoding: utf8 pool: 5 username: root password: socket: /tmp/mysql.sock
こっちのソケットを読み込もうとしてしまっているのだろうか、という疑問点はあります。
発生している問題・エラーメッセージ
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D master failed to start, check stderr log for details
というのがターミナル上で出て
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ less log/unicorn.stderr.log
これを実行し、エラー内容を確認すると
I, [2020-04-15T06:42:59.713364 #28024] INFO -- : Refreshing Gem list I, [2020-04-15T06:43:02.138532 #28024] INFO -- : listening on addr=0.0.0.0:3000 fd=10 E, [2020-04-15T06:43:02.139052 #28024] ERROR -- : Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) (Mysql2::Error::ConnectionError) /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in `connect' /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in `initialize' /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7.2/lib/active_record/connection_adapters/mysql2_adapter.rb:25:in `new' /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7.2/lib/active_record/connection_adapters/mysql2_adapter.rb:25:in `mysql2_connection' /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:729:in `new_connection' /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:773:in `checkout_new_connection' /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:752:in `try_to_checkout_new_connection' /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:713:in `acquire_connection' /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:490:in `checkout' /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:364:in `connection' /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7.2/lib/active_record/connection_adapters/abstract/connection_
こうなり、
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) (Mysql2::Error::ConnectionError)
この様なエラーが現れ、対処に苦しんでおります。
ちなみに、 < elastic ip >:3000にアクセスすると、
The page you were looking for doesn't exist. You may have mistyped the address or the page may have moved. If you are the application owner check the logs for more information.
となります。
該当のソースコード
database.yml
production: <<: *default database: sfc-b_production username: root password: <%= ENV['DATABASE_PASSWORD'] %> socket: /var/lib/mysql/mysql.sock
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
試したこと
1 mysql の再起動
2 nginx の再起動
3 ソケット位置の確認
4 ローカル上で出ていた、動作上での軽微なエラーの修正
5 検証用の新しいアプリを作って、比較検証
6 インスタンスの再作成
7 シークレットキーベースの再設定
8 EC2側の再起動
9 routesの確認(表示画面から)
10 Node.jsのバージョン変更(関係ないかもしれませんが、古くなっているよ、worningとでていたため)
11 database.yml記載のソケットの位置に整合性があるかどうか確認
12 強行突破し、Capistranoでの実行(当たり前ですが失敗)
補足情報(FW/ツールのバージョンなど)
ruby 2.5.1
Rails 5.0.7.2
知識も検索力も浅はかで、不明点が多く、至らぬ質問となってしまい申し訳ございません。
しかしながら、このエラーと対峙するのに少し時間がをかけすぎてしまいました。
ここまで、デプロイする上で、databaseがcreateできなかったり、migrateできなかったりとありましたが、
それについては解決できました。
しかし、このエラーについては、検索しても多様な内容のエラーが多々あり、どれが該当しているのか
理解することができず、手の打ちようが、「再度同内容を確認する」ことくらいしか思い当たらず、今回投稿させていただきました。
何卒お力添えのほど、よろしくお願いいたします。
また、必要なコードなどについても公開させていただきますので、ご連絡いただけましたら幸いです。
あなたの回答
tips
プレビュー