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.cnf
のbind-address
でIPアドレスを指定、またはコメントアウトする必要がある。
この情報を得るまでに多くの時間を費やしたのだけど、bind-address
で調べると案外記事が出てきたので、自分の検索スキルが低かったのかな。