序章

アプリケーションまたはWebサイトが大きくなるにつれて、現在のサーバー設定を超えてしまう可能性があります。 Webサーバーとデータベースバックエンドを同じマシンでホストしている場合は、これら2つの機能を分離して、それぞれが独自のハードウェアで動作し、訪問者の要求に応答する負荷を共有できるようにすることをお勧めします。

このガイドでは、Webアプリケーションが接続できるリモートMySQLデータベースサーバーを構成する方法について説明します。 何かを操作するために例としてWordPressを使用しますが、この手法はMySQLに基づくすべてのアプリケーションに広く適用できます。

前提条件

このチュートリアルを開始する前に、次のものが必要です。

  • 2つのUbuntu18.04サーバー。 Ubuntu 18.04 チュートリアルでの初期サーバー設定で説明されているように、それぞれにsudo権限とUFWファイアウォールが有効になっている非rootユーザーが必要です。 これらのサーバーの1つがMySQLバックエンドをホストします。このガイドでは、これをデータベースサーバーと呼びます。 もう1つは、データベースサーバーにリモートで接続し、Webサーバーとして機能します。 同様に、このガイドでは、これをWebサーバーと呼びます。
  • NginxとPHPがWebサーバーインストールされています。 チュートリアルUbuntu18.04にLinux、Nginx、MySQL、PHP(LEMPスタック)をインストールする方法でプロセスをガイドしますが、MySQLのインストールに焦点を当てたこのチュートリアルのステップ2をスキップする必要があることに注意してください。 MySQLをデータベースサーバーにインストールするためです。
  • MySQLはデータベースサーバーをインストールしました。 これを設定するには、 Ubuntu18.04にMySQLをインストールする方法に従ってください。
  • オプションで(ただし強くお勧めします)、Let’sEncryptのTLS/SSL証明書がWebサーバーにインストールされています。 ドメイン名を購入し、サーバー DNSレコードを設定する必要がありますが、証明書自体は無料です。 ガイドUbuntu18.04でLet’sEncryptを使用してNginxを保護する方法では、これらの証明書を取得する方法を説明しています。

ステップ1—リモート接続をリッスンするようにMySQLを構成する

データを別のサーバーに保存しておくことは、1台のマシン構成のパフォーマンスの上限に達した後に適切に拡張するための良い方法です。 また、負荷分散を行い、後でインフラストラクチャをさらに拡張するために必要な基本構造も提供します。 前提条件のチュートリアルに従ってMySQLをインストールした後、他のコンピューターからの接続を許可するためにいくつかの構成値を変更する必要があります。

MySQLサーバーの構成変更のほとんどは、mysqld.cnfファイルで行うことができます。このファイルは、デフォルトで/etc/mysql/mysql.conf.d/ディレクトリに保存されています。 このファイルをデータベースサーバーで、お好みのエディターでroot権限で開きます。 ここでは、nanoを使用します。

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

このファイルは、角括弧内のラベル([および])で示されるセクションに分割されています。 mysqldというラベルの付いたセクションを見つけます。

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

このセクション内で、bind-addressというパラメーターを探します。 これは、接続をリッスンするネットワークアドレスをデータベースソフトウェアに通知します。

デフォルトでは、これは127.0.0.1に設定されています。これは、MySQLがローカル接続のみを検索するように構成されていることを意味します。 サーバーにアクセスできる外部IPアドレスを参照するには、これを変更する必要があります。

両方のサーバーがプライベートネットワーク機能を備えたデータセンターにある場合は、データベースサーバーのプライベートネットワークIPを使用します。 それ以外の場合は、パブリックIPアドレスを使用できます。

/etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
. . .
bind-address = db_server_ip

インターネット経由でデータベースに接続するため、データを安全に保つために暗号化された接続が必要になることをお勧めします。 MySQL接続を暗号化しない場合、ネットワーク上の誰もがWebサーバーとデータベースサーバーの間で機密情報をスニッフィングする可能性があります。 MySQL接続を暗号化するには、更新したbind-address行の後に次の行を追加します。

/etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
. . .
require_secure_transport = on
. . .

終了したら、ファイルを保存して閉じます。 nanoを使用している場合は、CTRL+XYENTERの順に押してください。

SSL接続を機能させるには、いくつかのキーと証明書を作成する必要があります。 MySQLには、これらを自動的に設定するコマンドが付属しています。 次のコマンドを実行すると、必要なファイルが作成されます。 また、 mysql ユーザーのUIDを指定することにより、MySQLサーバーで読み取り可能になります。

  1. sudo mysql_ssl_rsa_setup --uid=mysql

MySQLに構成を更新させ、新しいSSL情報を読み取るには、データベースを再起動します。

  1. sudo systemctl restart mysql

サーバーが外部インターフェイスでリッスンしていることを確認するには、次のnetstatコマンドを実行します。

  1. sudo netstat -plunt | grep mysqld
Output
tcp 0 0 db_server_ip:3306 0.0.0.0:* LISTEN 27328/mysqld

netstatは、サーバーのネットワークシステムに関する統計を出力します。 この出力は、mysqldというプロセスが標準のMySQLポートであるポート3306db_server_ipに接続されていることを示しており、サーバーが適切なインターフェイスでリッスンしていることを確認しています。

次に、ファイアウォールでそのポートを開いて、トラフィックが通過できるようにします。

  1. sudo ufw allow mysql

これらは、MySQLに対して行う必要のあるすべての構成変更です。 次に、データベースといくつかのユーザープロファイルを設定する方法について説明します。そのうちの1つを使用して、サーバーにリモートでアクセスします。

ステップ2—WordPressデータベースとリモートクレデンシャルを設定する

MySQL自体が外部IPアドレスをリッスンしていますが、現在、リモート対応のユーザーまたはデータベースは構成されていません。 WordPress用のデータベースとそれにアクセスできるユーザーのペアを作成しましょう。

rootMySQLユーザーとしてMySQLに接続することから始めます。

  1. sudo mysql

注:前提条件のMySQLチュートリアルステップ3で説明されているように、パスワード認証を有効にしている場合は、代わりに次のコマンドを使用してMySQLシェルにアクセスする必要があります。

  1. mysql -u root -p

このコマンドを実行すると、MySQL root パスワードの入力を求められ、パスワードを入力すると、新しいmysql>プロンプトが表示されます。

MySQLプロンプトから、WordPressが使用するデータベースを作成します。 後で簡単に識別できるように、このデータベースに認識可能な名前を付けると役立つ場合があります。 ここでは、wordpressという名前を付けます。

  1. CREATE DATABASE wordpress;

データベースを作成したので、次にユーザーのペアを作成する必要があります。 ローカル専用ユーザーと、WebサーバーのIPアドレスに関連付けられたリモートユーザーを作成します。

まず、ローカルユーザー wpuser を作成し、宣言で localhost を使用して、このアカウントがローカル接続の試行にのみ一致するようにします。

  1. CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'password';

次に、このアカウントにwordpressデータベースへのフルアクセスを許可します。

  1. GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';

このユーザーは、WordPressのデータベースで任意の操作を実行できるようになりましたが、このアカウントはローカルマシンからの接続とのみ一致するため、リモートで使用することはできません。 これを念頭に置いて、Webサーバーからの接続のみに一致するコンパニオンアカウントを作成します。 このためには、WebサーバーのIPアドレスが必要です。

mysqld.cnfファイルで構成したものと同じネットワークを利用するIPアドレスを使用する必要があることに注意してください。 つまり、mysqld.cnfファイルでプライベートネットワークIPを指定した場合は、次の2つのコマンドにWebサーバーのプライベートIPを含める必要があります。 パブリックインターネットを使用するようにMySQLを構成した場合は、それをWebサーバーのパブリックIPアドレスと一致させる必要があります。

  1. CREATE USER 'remotewpuser'@'web_server_ip' IDENTIFIED BY 'password';

リモートアカウントを作成したら、ローカルユーザーと同じ権限をアカウントに付与します。

  1. GRANT ALL PRIVILEGES ON wordpress.* TO 'remotewpuser'@'web_server_ip';

最後に、MySQLが特権の使用を開始することを認識できるように、特権をフラッシュします。

  1. FLUSH PRIVILEGES;

次に、次のように入力してMySQLプロンプトを終了します。

  1. exit

新しいデータベースとリモート対応ユーザーを設定したので、Webサーバーからデータベースに接続できるかどうかのテストに進むことができます。

ステップ3—リモート接続とローカル接続のテスト

続行する前に、ローカルマシン(データベースサーバー)とWebサーバーの両方からデータベースに接続できることを確認することをお勧めします。

まず、新しいアカウントでログインして、データベースサーバーからのローカル接続をテストします。

  1. mysql -u wpuser -p

プロンプトが表示されたら、このアカウントに設定したパスワードを入力します。

MySQLプロンプトが表示された場合、ローカル接続は成功しています。 次のように入力すると、再び終了できます。

  1. exit

次に、 Webサーバーにログインして、リモート接続をテストします。

  1. ssh sammy@web_server_ip

リモートデータベースにアクセスするには、MySQL用のクライアントツールをWebサーバーにインストールする必要があります。 最初に、ローカルパッケージキャッシュを最近更新していない場合は、更新します。

  1. sudo apt update

次に、MySQLクライアントユーティリティをインストールします。

  1. sudo apt install mysql-client

これに続いて、次の構文を使用してデータベースサーバーに接続します。

  1. mysql -u remotewpuser -h db_server_ip -p

ここでも、データベースサーバーに正しいIPアドレスを使用していることを確認する必要があります。 プライベートネットワークでリッスンするようにMySQLを構成した場合は、データベースのプライベートネットワークIPを入力します。 それ以外の場合は、データベースサーバーのパブリックIPアドレスを入力します。

remotewpuserアカウントのパスワードの入力を求められます。 入力後、すべてが期待どおりに機能している場合は、MySQLプロンプトが表示されます。 次のコマンドを使用して、接続がSSLを使用していることを確認します。

  1. status

接続が実際にSSLを使用している場合、SSL:行は、次のようにこれを示します。

Output
-------------- mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64) using EditLine wrapper Connection id: 52 Current database: Current user: [email protected] SSL: Cipher in use is DHE-RSA-AES256-SHA Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 5.7.18-0ubuntu0.16.04.1 (Ubuntu) Protocol version: 10 Connection: 203.0.113.111 via TCP/IP Server characterset: latin1 Db characterset: latin1 Client characterset: utf8 Conn. characterset: utf8 TCP port: 3306 Uptime: 3 hours 43 min 40 sec Threads: 1 Questions: 1858 Slow queries: 0 Opens: 276 Flush tables: 1 Open tables: 184 Queries per second avg: 0.138 --------------

リモートで接続できることを確認したら、先に進んでプロンプトを終了します。

  1. exit

これで、ローカルアクセスとWebサーバーからのアクセスを確認しましたが、他の接続が拒否されることを確認していません。 追加のチェックとして、特定のユーザーアカウントをしない構成した3番目のサーバーから同じことを実行して、この他のサーバーにアクセスが許可されていないことを確認してください。

次のコマンドを実行して接続を試行する前に、上記のようにMySQLクライアントユーティリティをインストールする必要がある場合があることに注意してください。

  1. mysql -u wordpressuser -h db_server_ip -p

これは正常に完了しないはずであり、次のようなエラーを返すはずです。

Output
ERROR 1130 (HY000): Host '203.0.113.12' is not allowed to connect to this MySQL server

これは、このサーバーからの接続を許可するMySQLユーザーを作成していないため、また、データベースサーバーがMySQLサーバーへの不正なユーザーアクセスを確実に拒否するために必要なためです。

リモート接続のテストに成功したら、WebサーバーへのWordPressのインストールに進むことができます。

ステップ4—WordPressをインストールする

新しいリモート対応のMySQLサーバーの機能を示すために、人気のあるコンテンツ管理システムであるWordPressをWebサーバーにインストールして構成するプロセスを実行します。 これには、ソフトウェアをダウンロードして抽出し、接続情報を構成してから、WordPressのWebベースのインストールを実行する必要があります。

Webサーバーで、最新リリースのWordPressをホームディレクトリにダウンロードします。

  1. cd ~
  2. curl -O https://wordpress.org/latest.tar.gz

ファイルを抽出します。これにより、ホームディレクトリにwordpressというディレクトリが作成されます。

  1. tar xzvf latest.tar.gz

WordPressには、開始点として使用するサンプル構成ファイルが含まれています。 このファイルのコピーを作成し、ファイル名から-sampleを削除して、WordPressによってロードされるようにします。

  1. cp ~/wordpress/wp-config-sample.php ~/wordpress/wp-config.php

ファイルを開くときの最初の仕事は、インストールのセキュリティを強化するためにいくつかの秘密鍵を調整することです。 WordPressは、これらの値の安全なジェネレーターを提供するため、自分で適切な値を考え出す必要はありません。 これらは内部でのみ使用されるため、ここで複雑で安全な値を使用してもユーザビリティが損なわれることはありません。

WordPressの秘密鍵ジェネレーターから安全な値を取得するには、次のように入力します。

  1. curl -s https://api.wordpress.org/secret-key/1.1/salt/

これにより、いくつかのキーが出力に出力されます。 これらをwp-config.phpファイルに一時的に追加します。

警告!毎回独自の値をリクエストすることが重要です。 ここに表示されている値をコピーしないでください。

Output
define('AUTH_KEY', 'L4|2Yh(giOtMLHg3#] DO NOT COPY THESE VALUES %G00o|te^5YG@)'); define('SECURE_AUTH_KEY', 'DCs-k+MwB90/-E(=!/ DO NOT COPY THESE VALUES +WBzDq:7U[#Wn9'); define('LOGGED_IN_KEY', '*0kP!|VS.K=;#fPMlO DO NOT COPY THESE VALUES +&[%8xF*,18c @'); define('NONCE_KEY', 'fmFPF?UJi&(j-{8=$- DO NOT COPY THESE VALUES CCZ?Q+_~1ZU~;G'); define('AUTH_SALT', '@qA7f}2utTEFNdnbEa DO NOT COPY THESE VALUES t}Vw+8=K%20s=a'); define('SECURE_AUTH_SALT', '%BW6s+d:7K?-`C%zw4 DO NOT COPY THESE VALUES 70U}PO1ejW+7|8'); define('LOGGED_IN_SALT', '-l>F:-dbcWof%4kKmj DO NOT COPY THESE VALUES 8Ypslin3~d|wLD'); define('NONCE_SALT', '4J(<`4&&F (WiK9K#] DO NOT COPY THESE VALUES ^ZikS`es#Fo:V6');

受け取った出力をクリップボードにコピーしてから、テキストエディタで構成ファイルを開きます。

  1. nano ~/wordpress/wp-config.php

それらの設定のダミー値を含むセクションを見つけます。 次のようになります。

/wordpress/wp-config.php
. . .
define('AUTH_KEY',         'put your unique phrase here');
define('SECURE_AUTH_KEY',  'put your unique phrase here');
define('LOGGED_IN_KEY',    'put your unique phrase here');
define('NONCE_KEY',        'put your unique phrase here');
define('AUTH_SALT',        'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT',   'put your unique phrase here');
define('NONCE_SALT',       'put your unique phrase here');
. . .

それらの行を削除し、コマンドラインからコピーした値を貼り付けます。

次に、リモートデータベースの接続情報を入力します。 これらの構成行は、ファイルの上部、キーを貼り付けた場所のすぐ上にあります。 以前にリモートデータベーステストで使用したものと同じIPアドレスを使用することを忘れないでください。

/wordpress/wp-config.php
. . .
/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');

/** MySQL database username */
define('DB_USER', 'remotewpuser');

/** MySQL database password */
define('DB_PASSWORD', 'password');

/** MySQL hostname */
define('DB_HOST', 'db_server_ip');
. . .

最後に、ファイルの任意の場所に、MySQLデータベースへのSSL接続を使用するようにWordPressに指示する次の行を追加します。

/wordpress/wp-config.php
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

ファイルを保存して閉じます。

次に、~/wordpressディレクトリにあるファイルとディレクトリをNginxのドキュメントルートにコピーします。 このコマンドには-aフラグが含まれており、既存のすべてのアクセス許可が確実に引き継がれることに注意してください。

  1. sudo cp -a ~/wordpress/* /var/www/html

この後、あとはファイルの所有権を変更するだけです。 ドキュメントルート内のすべてのファイルの所有権を、UbuntuのデフォルトのWebサーバーユーザーであるwww-dataに変更します。

  1. sudo chown -R www-data:www-data /var/www/html

これで、WordPressがインストールされ、Webベースのセットアップルーチンを実行する準備が整いました。

ステップ5—Webインターフェイスを介してWordpressを設定する

WordPressにはWebベースのセットアッププロセスがあります。 あなたがそれを通過するとき、それはいくつかの質問をし、あなたのデータベースに必要なすべてのテーブルをインストールします。 ここでは、リモートデータベースバックエンドを使用する独自のカスタムWebサイトを構築するための開始点として使用できるWordPressのセットアップの初期手順について説明します。

Webサーバーに関連付けられているドメイン名(またはパブリックIPアドレス)に移動します。

http://example.com

WordPressインストーラーの言語選択画面が表示されます。 適切な言語を選択し、クリックしてメインのインストール画面に移動します。

WordPress install screen

情報を送信したら、作成したアカウントを使用してWordPress管理インターフェースにログインする必要があります。 次に、新しいWordPressサイトをカスタマイズできるダッシュボードが表示されます。

結論

このチュートリアルに従うことで、リモートのWordpressインストールからSSLで保護された接続を受け入れるようにMySQLデータベースを設定しました。 このガイドで使用されているコマンドと手法は、任意のプログラミング言語で記述されたすべてのWebアプリケーションに適用できますが、具体的な実装の詳細は異なります。 詳細については、アプリケーションまたは言語のデータベースのドキュメントを参照してください。