開発者ドキュメント

MySQLへのリモートアクセスを許可する方法

多くのWebサイトとアプリケーションは、同じマシンでホストされているWebサーバーとデータベースバックエンドから始まります。 ただし、時間の経過とともに、このような設定は煩雑になり、スケーリングが困難になる可能性があります。 一般的な解決策は、リモートデータベースを設定してこれらの機能を分離し、サーバーとデータベースをそれぞれのマシン上で独自のペースで拡張できるようにすることです。

リモートMySQLデータベースをセットアップしようとしたときにユーザーが遭遇する最も一般的な問題の1つは、MySQLインスタンスがローカル接続をリッスンするようにのみ構成されていることです。 これはMySQLのデフォルト設定ですが、MySQLはサーバーに到達できる外部 IPアドレスをリッスンできる必要があるため、リモートデータベースセットアップでは機能しません。 これを有効にするには、 mysqld.cnf ファイル:

  1. sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

で始まる行に移動します bind-address 指令。 次のようになります。

/etc/mysql/mysql.conf.d/mysqld.cnf
. . .
lc-messages-dir = /usr/share/mysql
skip-external-locking
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address            = 127.0.0.1
. . .

デフォルトでは、この値はに設定されています 127.0.0.1、サーバーがローカル接続のみを検索することを意味します。 外部IPアドレスを参照するには、このディレクティブを変更する必要があります。 トラブルシューティングの目的で、このディレクティブをワイルドカードIPアドレスに設定することもできます。 *, ::、 また 0.0.0.0:

/etc/mysql/mysql.conf.d/mysqld.cnf
. . .
lc-messages-dir = /usr/share/mysql
skip-external-locking
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address            = 0.0.0.0
. . .

注: MySQLの特定のバージョンでは、 bind-address ディレクティブが含まれていない可能性があります mysqld.cnf デフォルトではファイル。 この場合、ファイルの下部に次の強調表示された行を追加します。

/etc/mysql/mysql.conf.d/mysqld.cnf
. . .
[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
log-error       = /var/log/mysql/error.log
bind-address            = 0.0.0.0

この行を変更した後、ファイルを保存して閉じます(CTRL + X, Y、 それから ENTER で編集した場合 nano).

次に、MySQLサービスを再起動して、行った変更を加えます mysqld.cnf 発効:

  1. sudo systemctl restart mysql

リモートホストからデータベースに接続するために使用する予定の既存のMySQLユーザーアカウントがある場合は、localhostではなくリモートサーバーから接続するようにそのアカウントを再構成する必要があります。 これを行うには、MySQLクライアントを root MySQLユーザーとして、または別の特権ユーザーアカウントで開きます。

  1. sudo mysql

root のパスワード認証を有効にしている場合は、代わりに次のコマンドを使用してMySQLシェルにアクセスする必要があります。

  1. mysql -u root -p

ユーザーのホストを変更するには、MySQLを使用できます RENAME USER 指図。 次のコマンドを実行し、必ず変更してください sammy MySQLユーザーアカウントの名前に remote_server_ip リモートサーバーのIPアドレスへ:

  1. RENAME USER 'sammy'@'localhost' TO 'sammy'@'remote_server_ip';

または、次のコマンドを使用して、リモートホストからのみ接続する新しいユーザーアカウントを作成することもできます。

  1. CREATE USER 'sammy'@'remote_server_ip' IDENTIFIED BY 'password';

:このコマンドは、MySQLのデフォルトの認証プラグインで認証するユーザーを作成します。 caching_sha2_password. ただし、PHPの一部のバージョンには、このプラグインで問題を引き起こす可能性のある既知の問題があります。

このデータベースをPHPアプリケーション(たとえば、phpMyAdmin)で使用する場合は、古いもので認証するリモートユーザーを作成することをお勧めしますが、それでも安全です。 mysql_native_password 代わりにプラグイン:

  1. CREATE USER 'sammy'@'remote_server_ip' IDENTIFIED WITH mysql_native_password BY 'password';

よくわからない場合は、で認証するユーザーをいつでも作成できます caching_sha2_plugin その後 ALTER 後でこのコマンドを使用します。

  1. ALTER USER 'sammy'@'remote_server_ip' IDENTIFIED WITH mysql_native_password BY 'password';

次に、新しいユーザーに特定のニーズに適した特権を付与します。 次の例では、ユーザーにグローバル権限を付与します。 CREATE, ALTER、 と DROP データベース、テーブル、ユーザー、および INSERT, UPDATE、 と DELETE サーバー上の任意のテーブルからのデータ。 また、ユーザーにデータをクエリする機能を付与します SELECT、で外部キーを作成します REFERENCES キーワード、および実行 FLUSH との操作 RELOAD 特権。 ただし、ユーザーに必要な権限のみを付与する必要があるため、必要に応じてユーザーの権限を自由に調整してください。

  1. GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'sammy'@'remote_server_ip' WITH GRANT OPTION;

これに続いて、を実行することをお勧めします FLUSH PRIVILEGES 指図。 これにより、前述の結果としてサーバーがキャッシュしたメモリが解放されます。 CREATE USERGRANT ステートメント:

  1. FLUSH PRIVILEGES;

次に、MySQLクライアントを終了できます。

  1. exit

最後に、データベースサーバーにファイアウォールを構成している場合は、ポートも開く必要があります。 3306 — MySQLのデフォルトポート—MySQLへのトラフィックを許可します。

1つの特定のマシンからのみデータベースサーバーにアクセスすることを計画している場合は、次のコマンドを使用して、そのマシンにデータベースにリモート接続するための排他的アクセス許可を付与できます。 必ず交換してください remote_IP_address 接続する予定のマシンの実際のIPアドレスを使用して:

  1. sudo ufw allow from remote_IP_address to any port 3306

将来、他のマシンからデータベースにアクセスする必要がある場合は、このコマンドを使用して、アドホックベースでデータベースへのアクセスを許可できます。 それぞれのIPアドレスを含めることを忘れないでください。

または、次のコマンドを使用して、 anyIPアドレスからMySQLデータベースへの接続を許可することもできます。

警告:このコマンドを使用すると、誰でもMySQLデータベースにアクセスできます。 データベースに機密データが保持されている場合は、実行しないでください

  1. sudo ufw allow 3306

これに続いて、別のマシンからリモートでデータベースにアクセスしてみてください。

:特定のIPアドレスからの接続のみを許可するファイアウォールルールを追加した場合は、そのアドレスに関連付けられたマシンでデータベースにアクセスする必要があります。

  1. mysql -u user -h database_server_ip -p

データベースにアクセスできる場合は、 bind-address 設定ファイルのディレクティブが問題でした。 ただし、その設定に注意してください bind-address0.0.0.0 任意のIPアドレスからサーバーへの接続を許可するため、安全ではありません。 一方、それでもデータベースにリモートでアクセスできない場合は、他の何かが問題を引き起こしている可能性があります。 いずれの場合も、 Ubuntu 18.04 でMySQLを使用してサイトのパフォーマンスを最適化するリモートデータベースを設定する方法に関するガイドに従って、より安全なリモートデータベース構成を設定すると役立つ場合があります。

モバイルバージョンを終了