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
1my-app 2├── src 3│ ├── app 4│ ├── bin 5│ ├── config 6│ ├── ... 7│ └── ... 8├── .gitattributes 9├── .gitignore 10└── 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
1# /var/www/my_app/src/config/puma.rb 2 3workers Integer(ENV['WEB_CONCURRENCY'] || 2) 4max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } 5min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count } 6threads min_threads_count, max_threads_count 7 8preload_app! 9rackup DefaultRackup 10# rails_env = ENV.fetch("RAILS_ENV") { "development" } 11rails_env = "production" 12environment rails_env 13bind "unix:///var/www/my_app/src/tmp/sockets/puma.sock" 14 15pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" } 16plugin :tmp_restart 17 18on_worker_boot do 19 # Worker specific setup for Rails 4.1+ 20 # See: https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server#on-worker-boot 21 ActiveRecord::Base.establish_connection 22end
yml
1# /var/www/my_app/src/config/database.yml 2 3default: &default 4 adapter: mysql2 5 encoding: utf8mb4 6 reconnect: false 7 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> 8 username: root 9 password: <%= ENV['DATABASE_PASSWORD'] %> 10 host: localhost 11 12development: 13 <<: *default 14 database: my_app_development 15 socket: /tmp/mysql.sock 16test: 17 <<: *default 18 database: my_app_test 19 socket: /tmp/mysql.sock 20production: 21 database: my_app_production 22 adapter: mysql2 23 encoding: utf8mb4 24 charset: utf8mb4 25 collation: utf8mb4_general_ci 26 username: <%= Rails.application.credentials.db[:user_name] %> 27 password: <%= Rails.application.credentials.db[:password] %> 28 host: <%= Rails.application.credentials.db[:endpoint] %> 29 pool: 20 30 timeout: 1000 31 socket: /tmp/mysql.sock
試したこと
・rails c
内ではEC2<=>RDSの通信に成功していることを確認
bash
1[ec2-user@ip-10-0-1-40 src]$ RAILS_ENV=production rails c 2Loading production environment (Rails 6.1.4.4) 3irb(main):001:0> User.count 4=> 0
・EC2内のmysql.sock
の場所を調べてdatabase.yml
に記載
console
1[hajsu00@ip-10-0-1-40 conf.d]$ mysql_config --socket 2/var/lib/mysql/mysql.sock
yml
1# /var/www/my_app/src/config/database.yml 2 3default: &default 4 adapter: mysql2 5 encoding: utf8mb4 6 reconnect: false 7 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> 8 username: root 9 password: <%= ENV['DATABASE_PASSWORD'] %> 10 host: localhost 11 12development: 13 <<: *default 14 database: my_app_development 15 socket: /tmp/mysql.sock 16test: 17 <<: *default 18 database: my_app_test 19 socket: /tmp/mysql.sock 20production: 21 database: my_app_production 22 adapter: mysql2 23 encoding: utf8mb4 24 charset: utf8mb4 25 collation: utf8mb4_general_ci 26 username: <%= Rails.application.credentials.db[:user_name] %> 27 password: <%= Rails.application.credentials.db[:password] %> 28 host: <%= Rails.application.credentials.db[:endpoint] %> 29 pool: 20 30 timeout: 1000 31 # socket: /tmp/mysql.sock 32 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
1workers Integer(ENV['WEB_CONCURRENCY'] || 2) 2max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } 3min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count } 4threads min_threads_count, max_threads_count 5 6preload_app! 7rails_env = ENV.fetch("RAILS_ENV") { "development" } 8environment rails_env 9case rails_env 10 when "development" 11 port ENV.fetch("PORT") { 3000 } 12 when "production" 13 bind "unix:///var/www/hangartalk/src/tmp/sockets/puma.sock" 14end 15 16pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" } 17plugin :tmp_restart 18 19on_worker_boot do 20 # Worker specific setup for Rails 4.1+ 21 # See: https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server#on-worker-boot 22 ActiveRecord::Base.establish_connection 23end
その結果、おそらく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
1production: 2 ... 3 # socket: /tmp/mysql.sock 4 port: 3306
それぞれの場合でEC2内でmysql -u {ユーザー名} -p
でログインを試みたところ、表題と同じエラーが出ました。
EC2内でもデータベースへの接続に失敗していたことになります。
EC2 => RDS(MySQL)は成功
EC2内からRDSにエンドポイントを指定してログインを試みたところ、成功しました。
ということは、Rails => RDSが失敗している?
bash
1$ mysql -u <ユーザー名> -p -h <RDSのエンドポイント> 2Enter password: 3Welcome to the MariaDB monitor. Commands end with ; or \g. 4Your MySQL connection id is 23 5Server version: 8.0.28 Source distribution 6 7Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. 8 9Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 10 11MySQL [(none)]> SHOW DATABASES; 12+-----------------------+ 13| Database | 14+-----------------------+ 15| myapp_production | 16| information_schema | 17| mysql | 18| performance_schema | 19| sys | 20+-----------------------+ 215 rows in set (0.00 sec)

回答1件
あなたの回答
tips
プレビュー