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

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

新規登録して質問してみよう
ただいま回答率
85.48%
unicorn

Unicornは、汎用のRackアプリケーションサーバ。RackとWebサーバーの機能を併せ持ちます。レスポンス処理や、Nginx単体がRackの機能をサポートしていない事から、一般的にはNginx+Unicorn+Railsの構成を取って用います。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

Q&A

解決済

3回答

653閲覧

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

RYtera

総合スコア8

unicorn

Unicornは、汎用のRackアプリケーションサーバ。RackとWebサーバーの機能を併せ持ちます。レスポンス処理や、Nginx単体がRackの機能をサポートしていない事から、一般的にはNginx+Unicorn+Railsの構成を取って用います。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

0グッド

0クリップ

投稿2020/07/17 02:21

編集2020/07/17 03:54

解決したいこと: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)

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2020/07/17 03:10

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

2020/07/17 03:54

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

回答3

0

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 03:56

編集2020/07/19 19:53
winterboum

総合スコア23347

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RYtera

2020/07/17 04: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にしています。
RYtera

2020/07/19 14: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のエラーに紐づいて生じているのかは分かっていません。
RYtera

2020/07/21 14: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に切り替えを進めます。 提案頂きありがとうございました!
guest

0

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

1

console

1bundle exec rails s -e production -b 0.0.0.0

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

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

投稿2020/07/17 03:05

y_shinoda

総合スコア3272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RYtera

2020/07/19 14:25 編集

y_shinoda様 切り分けの提案ありがとうございます。1を実施してみました。 1.データベースにアクセスできるか確認 ターミナル上での実行しました。 [ec2-user@ip アプリ名]$ bundle exec rails s -e production -b 0.0.0.0 怪しいと思ったのは下記全文の中の最後の文、 already in use - bind(2)です。 > in `initialize': Address already in use - bind(2) for "0.0.0.0" port 3000 (Errno::EADDRINUSE) プロセスをkillし直しましたが同じくエラーのままでした。 これはnginxに問題があるという事でしょうか。 因みに、ローカルで実行して下記を試しましたがエラーになります。 http://0.0.0.0:3000/ => We're sorry, but something went wrong. ``` #抜粋版です。 => Booting Puma => Rails 5.2.4.3 application starting in production => Run `rails server -h` for more startup options Puma starting in single mode... * Version 3.12.6 (ruby 2.5.1-p57), codename: Llamas in Pajamas * Min threads: 5, max threads: 5 * Environment: production Exiting Traceback (most recent call last): 40: from bin/rails:3:in `<main>' 39: from bin/rails:3:in `load' 38: from /var/www/knock-knock/bin/spring:15:in `<top (required)>' ~~~ 中略 ~~~ 4: from /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/puma-3.12.6/lib/puma/binder.rb:90:in `each' 3: from /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/puma-3.12.6/lib/puma/binder.rb:106:in `block in parse' 2: from /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/puma-3.12.6/lib/puma/binder.rb:273:in `add_tcp_listener' 1: from /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/puma-3.12.6/lib/puma/binder.rb:273:in `new' /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/puma-3.12.6/lib/puma/binder.rb:273:in `initialize': Address already in use - bind(2) for "0.0.0.0" port 3000 (Errno::EADDRINUSE) ```
y_shinoda

2020/07/17 05:27

これは 3000 ポートが使われていることが原因のようなので、 bundle exec rails s -e production -b 0.0.0.0 -p 3001 とか、ポートを変えてみるとどうでしょうか?
RYtera

2020/07/17 05:37

ポート番号を変えるとターミナルで通ります。 $ bundle exec rails s -e production -b 0.0.0.0 -p 3001 => * Listening on tcp://0.0.0.0:3001 => Use Ctrl-C to stop http://ElasticIP:3001を行うと、 接続中でグリーズしタイムアウトで終了になる状況です。
y_shinoda

2020/07/17 05:43

セキュリティーグループで 3001 ポートを許可していないと 外からは接続できないものと思われます ターミナル二つで接続し、片方で rails s, もう片方で curl などを試してみると良いかもしれません
RYtera

2020/07/19 14: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;)。
y_shinoda

2020/07/19 14:39

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

2020/07/21 14:02

ご提案ありがとうございます! https://qiita.com/yasuhiroki/items/a569d3371a66e365316f curlについて上記記事を参考にしましたが理解が足らず解決不可でした。 その後にゼロベースで確認したところなぜか起動できたため、 本件クローズとさせて頂きます。 切り分け案ありがとうございました!
guest

0

自己解決

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

投稿2020/07/21 14:05

編集2020/07/21 23:41
RYtera

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問