AWS初心者です。
RailsアプリをEC2にデプロイしたいのですが、ブラウザでEC2のIPアドレスにアクセスするとMySQLへの接続エラーが発生して解決できずに困っています。
ご助言をいただけると幸いです。
起きている問題
・ブラウザからEC2のIPアドレスにアクセスすると
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
が発生する。
※SSHで直接EC2に入ると、Rails<=>MySQLは正常に動作する(詳細は後述)
前提事項
開発環境
・macOS Monterey v12.1
・ruby v3.0.3
・Rails v6.1.4.4
・MySQL 8.0.28
・puma 5.5.2
・nginx 1.20.0
インフラ構成図
ディレクトリ構造
directory
my-app ├── src │ ├── app │ ├── bin │ ├── config │ ├── ... │ └── ... ├── .gitattributes ├── .gitignore └── README.md
関係するコード
EC2内でnginxとpumaを起動済み(設定は以下の通り)
# /etc/nginx/conf.d/my_app.conf upstream puma { server unix:/var/www/my_app/src/tmp/sockets/puma.sock; } server { listen 80; server_name ***.***.***.***; keepalive_timeout 0; access_log /var/log/nginx/my_app.access.log main; client_max_body_size 4G; root /var/www/my_app/src/public; location ~ .*\.(swf|SWF|ico|ICO|jar|txt|gz|js) { root /var/www/my_app/src/public; expires 15m; break; } location ~ ^\/fonts\/* { root /var/www/my_app/src/public; expires 15m; break; } location ~ ^\/assets\/* { root /var/www/my_app/src/public; break; } location ~ ^\/favicon\/* { root /var/www/my_app/src/public; break; } location = /manifest.json { root /var/www/my_app/src/public; break; } location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; #auth_basic "Restricted"; #auth_basic_user_file /etc/nginx/.htpasswd; #if ($http_x_forwarded_proto = "http") { #rewrite ^(.*) https://$server_name$1 #break; #} proxy_pass http://puma; } }
ruby
# /var/www/my_app/src/config/puma.rb workers Integer(ENV['WEB_CONCURRENCY'] || 2) max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count } threads min_threads_count, max_threads_count preload_app! rackup DefaultRackup # rails_env = ENV.fetch("RAILS_ENV") { "development" } rails_env = "production" environment rails_env bind "unix:///var/www/my_app/src/tmp/sockets/puma.sock" pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" } plugin :tmp_restart on_worker_boot do # Worker specific setup for Rails 4.1+ # See: https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server#on-worker-boot ActiveRecord::Base.establish_connection end
yml
# /var/www/my_app/src/config/database.yml default: &default adapter: mysql2 encoding: utf8mb4 reconnect: false pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: <%= ENV['DATABASE_PASSWORD'] %> host: localhost development: <<: *default database: my_app_development socket: /tmp/mysql.sock test: <<: *default database: my_app_test socket: /tmp/mysql.sock production: database: my_app_production adapter: mysql2 encoding: utf8mb4 charset: utf8mb4 collation: utf8mb4_general_ci username: <%= Rails.application.credentials.db[:user_name] %> password: <%= Rails.application.credentials.db[:password] %> host: <%= Rails.application.credentials.db[:endpoint] %> pool: 20 timeout: 1000 socket: /tmp/mysql.sock
試したこと
・rails c
内ではEC2<=>RDSの通信に成功していることを確認
bash
[ec2-user@ip-10-0-1-40 src]$ RAILS_ENV=production rails c Loading production environment (Rails 6.1.4.4) irb(main):001:0> User.count => 0
・EC2内のmysql.sock
の場所を調べてdatabase.yml
に記載
console
[hajsu00@ip-10-0-1-40 conf.d]$ mysql_config --socket /var/lib/mysql/mysql.sock
yml
# /var/www/my_app/src/config/database.yml default: &default adapter: mysql2 encoding: utf8mb4 reconnect: false pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: <%= ENV['DATABASE_PASSWORD'] %> host: localhost development: <<: *default database: my_app_development socket: /tmp/mysql.sock test: <<: *default database: my_app_test socket: /tmp/mysql.sock production: database: my_app_production adapter: mysql2 encoding: utf8mb4 charset: utf8mb4 collation: utf8mb4_general_ci username: <%= Rails.application.credentials.db[:user_name] %> password: <%= Rails.application.credentials.db[:password] %> host: <%= Rails.application.credentials.db[:endpoint] %> pool: 20 timeout: 1000 # socket: /tmp/mysql.sock socket: /var/lib/mysql/mysql.sock
→エラー文はCan't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
で変化なし
考えたこと
ec2内でのRails<=>MySQL通信には成功していること、ブラウザからhttpアクセスには成功している(Railsのエラー場面が表示されている)ことからnginx<=>pumaで問題が発生していると考えています。
しかし、検索しても長時間解決に至りません。
お手数お掛けしますが、ご助言いただけると幸いです。
よろしくお願いします。
追記(5/5)
68user さんのコメントをもとに検証を進めました。
puma.rb
を修正
そもそもpuma.rb
が間違いだらけでしたので、書き直しました。
まず、上記実行にあたりサーバー内のRails実行環境を改めて指定。
$ export RAILS_ENV=production
次に、puma.rb
を以下のように書き換える。
ruby
workers Integer(ENV['WEB_CONCURRENCY'] || 2) max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count } threads min_threads_count, max_threads_count preload_app! rails_env = ENV.fetch("RAILS_ENV") { "development" } environment rails_env case rails_env when "development" port ENV.fetch("PORT") { 3000 } when "production" bind "unix:///var/www/hangartalk/src/tmp/sockets/puma.sock" end pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" } plugin :tmp_restart on_worker_boot do # Worker specific setup for Rails 4.1+ # See: https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server#on-worker-boot ActiveRecord::Base.establish_connection end
その結果、おそらくnginxへ接続できていない
$ curl http://localhost | head % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
EC2内のRails<=>MySQLは失敗していた
database.yml
の設定を以下の2通りで試しました。
yml
production: ... # socket: /tmp/mysql.sock port: 3306
それぞれの場合でEC2内でmysql -u {ユーザー名} -p
でログインを試みたところ、表題と同じエラーが出ました。
EC2内でもデータベースへの接続に失敗していたことになります。
EC2 => RDS(MySQL)は成功
EC2内からRDSにエンドポイントを指定してログインを試みたところ、成功しました。
ということは、Rails => RDSが失敗している?
bash
$ mysql -u <ユーザー名> -p -h <RDSのエンドポイント> Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 23 Server version: 8.0.28 Source distribution Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]> SHOW DATABASES; +-----------------------+ | Database | +-----------------------+ | myapp_production | | information_schema | | mysql | | performance_schema | | sys | +-----------------------+ 5 rows in set (0.00 sec)
まだ回答がついていません
会員登録して回答してみよう