6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MySQLに外部から接続したい

Posted at

MySQLに外部から接続したい

Laravelを使ってWebアプリを作成していました。

環境

  • Ubuntu 19.04 (daily build, 4.19.0-13-generic #14-Ubuntu SMP, Host)
  • Ubuntu 18.04 (LXC)
    • mysql 5.7.25-0ubuntu0.18.04.2

下準備

Laravelでは簡単に認証を実装できるということで以下のコマンドを打とうとした。

php artisan make:auth

おっと、その前にDBの設定をしないと。そう思い私は、LXCを建てそこにMySQLをインストールした。

# lxc launch ubuntu:18.04 mysql
# lxc exec mysql bash
mysql # apt install mysql-server
mysql # mysql -u root
mysql> create database homestead;
mysql> grant all on homestead.* to homestead@'%' identified by 'secret';
mysql> exit
mysql # exit 

さて、.envで設定されているデータベース名やユーザ名、パスワードに合わせて設定したのでDB_HOSTだけコンテナのIPアドレスにしてあげればよいだろう。

# lxc list
+-------+---------+---------------------+------+------------+-----------+
| NAME  |  STATE  |        IPV4         | IPV6 |    TYPE    | SNAPSHOTS |
+-------+---------+---------------------+------+------------+-----------+
| mysql | RUNNING | 10.55.37.202 (eth0) |      | PERSISTENT |           |
+-------+---------+---------------------+------+------------+-----------+

10.55.37.202が今回のMySQLサーバのアドレスとなることがわかる。
したがって、.envに設定するDBの設定は以下のようになった。

DB_CONNECTION=mysql
DB_HOST=10.55.37.202
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

認証の実装

準備が終わったので認証の実装をする。「実装をする」と言っても最初に紹介したコマンドを1行打つだけだ。

# php artisan make:auth
Authentication scaffolding generated successfully.

successfullyを出力され、ディレクトリを見るとコントローラやビューなど必要なものが生成される。次にマイグレートの実行だ。

# php artisan migrate
 Illuminate\Database\QueryException  : SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = homestead and table_name = migrations)

Connection refused

原因

今回の構成の場合、MySQLはコンテナ上で実行されているのでホストOSからのアクセスは外部からのアクセスとなる。そのため、grantではhomestead@'%'のようにしてどこからでもアクセスできるようにしていた。実際に、外部から接続したい系記事ではこれで接続できていた。なぜだ。

/etc/mysql/mysql.conf.d/mysqld.cnf

/etc/mysql/mysql.conf.d/mysqld.cnfに以下のような設定があった。

bind-address          = 127.0.0.1

この設定によって、127.0.0.1でLISTENしているため外部からの接続は拒否されるらしい。
この設定をコメントアウトするとどこからでも接続できるようできる。また、IPアドレスを変更して特定のIPアドレスでLISTENするなどするらしい。

したがって、以下のように設定することでマイグレートできるようになった。

# bind-address          = 127.0.0.1

さいごに

MySQLに外部から接続するにはgrantでIPアドレスを指定するだけなく、/etc/mysql/mysql.conf.d/mysqld.cnfbind-addressでIPアドレスを指定、またはコメントアウトする必要がある。

この情報を得るまでに多くの時間を費やしたのだけど、bind-addressで調べると案外記事が出てきたので、自分の検索スキルが低かったのかな。

MySQLにリモートホストから接続できるようにする
外部からMySQLの接続する際のチェックポイント

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?