多くのWebサイトとアプリケーションは、同じマシンでホストされているWebサーバーとデータベースバックエンドから始まります。 ただし、時間の経過とともに、このような設定は煩雑になり、スケーリングが困難になる可能性があります。 一般的な解決策は、リモートデータベースを設定してこれらの機能を分離し、サーバーとデータベースをそれぞれのマシン上で独自のペースで拡張できるようにすることです。
リモートMySQLデータベースをセットアップしようとしたときにユーザーが遭遇する最も一般的な問題の1つは、MySQLインスタンスがローカル接続をリッスンするようにのみ構成されていることです。 これはMySQLのデフォルト設定ですが、MySQLはサーバーに到達できる外部 IPアドレスをリッスンできる必要があるため、リモートデータベースセットアップでは機能しません。 これを有効にするには、 mysqld.cnf
ファイル:
- sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
で始まる行に移動します bind-address
指令。 次のようになります。
. . .
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
:
. . .
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
デフォルトではファイル。 この場合、ファイルの下部に次の強調表示された行を追加します。
. . .
[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
発効:
- sudo systemctl restart mysql
リモートホストからデータベースに接続するために使用する予定の既存のMySQLユーザーアカウントがある場合は、localhostではなくリモートサーバーから接続するようにそのアカウントを再構成する必要があります。 これを行うには、MySQLクライアントを root MySQLユーザーとして、または別の特権ユーザーアカウントで開きます。
- sudo mysql
root のパスワード認証を有効にしている場合は、代わりに次のコマンドを使用してMySQLシェルにアクセスする必要があります。
- mysql -u root -p
ユーザーのホストを変更するには、MySQLを使用できます RENAME USER
指図。 次のコマンドを実行し、必ず変更してください sammy
MySQLユーザーアカウントの名前に remote_server_ip
リモートサーバーのIPアドレスへ:
- RENAME USER 'sammy'@'localhost' TO 'sammy'@'remote_server_ip';
または、次のコマンドを使用して、リモートホストからのみ接続する新しいユーザーアカウントを作成することもできます。
- CREATE USER 'sammy'@'remote_server_ip' IDENTIFIED BY 'password';
注:このコマンドは、MySQLのデフォルトの認証プラグインで認証するユーザーを作成します。 caching_sha2_password
. ただし、PHPの一部のバージョンには、このプラグインで問題を引き起こす可能性のある既知の問題があります。
このデータベースをPHPアプリケーション(たとえば、phpMyAdmin)で使用する場合は、古いもので認証するリモートユーザーを作成することをお勧めしますが、それでも安全です。 mysql_native_password
代わりにプラグイン:
- CREATE USER 'sammy'@'remote_server_ip' IDENTIFIED WITH mysql_native_password BY 'password';
よくわからない場合は、で認証するユーザーをいつでも作成できます caching_sha2_plugin
その後 ALTER
後でこのコマンドを使用します。
- ALTER USER 'sammy'@'remote_server_ip' IDENTIFIED WITH mysql_native_password BY 'password';
次に、新しいユーザーに特定のニーズに適した特権を付与します。 次の例では、ユーザーにグローバル権限を付与します。 CREATE
, ALTER
、 と DROP
データベース、テーブル、ユーザー、および INSERT
, UPDATE
、 と DELETE
サーバー上の任意のテーブルからのデータ。 また、ユーザーにデータをクエリする機能を付与します SELECT
、で外部キーを作成します REFERENCES
キーワード、および実行 FLUSH
との操作 RELOAD
特権。 ただし、ユーザーに必要な権限のみを付与する必要があるため、必要に応じてユーザーの権限を自由に調整してください。
- GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'sammy'@'remote_server_ip' WITH GRANT OPTION;
これに続いて、を実行することをお勧めします FLUSH PRIVILEGES
指図。 これにより、前述の結果としてサーバーがキャッシュしたメモリが解放されます。 CREATE USER
と GRANT
ステートメント:
- FLUSH PRIVILEGES;
次に、MySQLクライアントを終了できます。
- exit
最後に、データベースサーバーにファイアウォールを構成している場合は、ポートも開く必要があります。 3306
— MySQLのデフォルトポート—MySQLへのトラフィックを許可します。
1つの特定のマシンからのみデータベースサーバーにアクセスすることを計画している場合は、次のコマンドを使用して、そのマシンにデータベースにリモート接続するための排他的アクセス許可を付与できます。 必ず交換してください remote_IP_address
接続する予定のマシンの実際のIPアドレスを使用して:
- sudo ufw allow from remote_IP_address to any port 3306
将来、他のマシンからデータベースにアクセスする必要がある場合は、このコマンドを使用して、アドホックベースでデータベースへのアクセスを許可できます。 それぞれのIPアドレスを含めることを忘れないでください。
または、次のコマンドを使用して、 anyIPアドレスからMySQLデータベースへの接続を許可することもできます。
警告:このコマンドを使用すると、誰でもMySQLデータベースにアクセスできます。 データベースに機密データが保持されている場合は、実行しないでください。
- sudo ufw allow 3306
これに続いて、別のマシンからリモートでデータベースにアクセスしてみてください。
注:特定のIPアドレスからの接続のみを許可するファイアウォールルールを追加した場合は、そのアドレスに関連付けられたマシンでデータベースにアクセスする必要があります。
- mysql -u user -h database_server_ip -p
データベースにアクセスできる場合は、 bind-address
設定ファイルのディレクティブが問題でした。 ただし、その設定に注意してください bind-address
に 0.0.0.0
任意のIPアドレスからサーバーへの接続を許可するため、安全ではありません。 一方、それでもデータベースにリモートでアクセスできない場合は、他の何かが問題を引き起こしている可能性があります。 いずれの場合も、 Ubuntu 18.04 でMySQLを使用してサイトのパフォーマンスを最適化するリモートデータベースを設定する方法に関するガイドに従って、より安全なリモートデータベース構成を設定すると役立つ場合があります。