Ubuntu 18.04でMySQLを使用してサイトパフォーマンスを最適化するためにリモートデータベースを設定する方法

前書き

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

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

前提条件

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

  • 2つのUbuntu 18.04サーバー。 Initial Server Setup with Ubuntu 18.04のチュートリアルで説明されているように、それぞれにsudo権限とUFWファイアウォールが有効になっているroot以外のユーザーが必要です。 これらのサーバーの1つがMySQLバックエンドをホストします。このガイドでは、これをdatabase serverと呼びます。 もう1つは、データベースサーバーにリモートで接続し、Webサーバーとして機能します。同様に、このガイドでは、これをweb serverと呼びます。

  • NginxとPHPはon your web serverをインストールしました。 チュートリアルHow To Install Linux, Nginx, MySQL, PHP (LEMP stack) in Ubuntu 18.04でプロセスをガイドしますが、データベースサーバーにMySQLをインストールするため、MySQLのインストールに焦点を当てたこのチュートリアルのステップ2はスキップする必要があることに注意してください。

  • MySQLはon your database serverをインストールしました。 これを設定するには、How To Install MySQL on Ubuntu 18.04に従ってください。

  • オプションで(ただし強く推奨)、Let’s EncryptのTLS / SSL証明書がインストールされたon your web server。 ドメイン名を購入してDNS records set up for your serverを取得する必要がありますが、証明書自体は無料です。 ガイドHow To Secure Nginx with Let’s Encrypt on Ubuntu 18.04は、これらの証明書を取得する方法を示しています。

[[step-1 -—- configuring-mysql-to-listen-for-remote-connections]] ==ステップ1—リモート接続をリッスンするようにMySQLを構成する

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

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

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がローカル接続のみを検索するように構成されていることを意味します。 サーバーにアクセスできるexternal IPアドレスを参照するには、これを変更する必要があります。

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

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

[mysqld]
. . .
bind-address = db_server_ip

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

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

[mysqld]
. . .
require_secure_transport = on
. . .

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

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

sudo mysql_ssl_rsa_setup --uid=mysql

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

sudo systemctl restart mysql

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

sudo netstat -plunt | grep mysqld
Outputtcp        0      0 db_server_ip:3306     0.0.0.0:*               LISTEN      27328/mysqld

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

次に、ファイアウォールでそのポートを開き、トラフィックの通過を許可します。

sudo ufw allow mysql

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

[[step-2 -—- setting-up-a-wordpress-database-and-remote-credentials]] ==ステップ2—WordPressデータベースとリモート資格情報の設定

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

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

sudo mysql

[。注意]##

Note:Step 3 of the prerequisite MySQL tutorialで説明されているように、パスワード認証を有効にしている場合は、代わりに次のコマンドを使用してMySQLシェルにアクセスする必要があります。

mysql -u root -p

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

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

CREATE DATABASE wordpress;

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

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

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

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

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

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

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

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

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

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

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

FLUSH PRIVILEGES;

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

exit

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

[[step-3 -—- testing-remote-and-local-connections]] ==ステップ3—リモート接続とローカル接続のテスト

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

まず、新しいアカウントでログインを試みて、database serverからのローカル接続をテストします。

mysql -u wpuser -p

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

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

exit

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

ssh [email protected]_server_ip

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

sudo apt update

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

sudo apt install mysql-client

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

mysql -u remotewpuser -h db_server_ip -p

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

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

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
--------------

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

exit

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

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

mysql -u wordpressuser -h db_server_ip -p

これは正常に完了せず、次のようなエラーがスローされます。

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

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

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

[[step-4 -—- installing-wordpress]] ==ステップ4—WordPressのインストール

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

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

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

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

tar xzvf latest.tar.gz

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

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

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

WordPressシークレットキージェネレーターから安全な値を取得するには、次のように入力します。

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

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

[.warning]#Warning!毎回独自の値をリクエストすることが重要です。 Do notはここに示されている値をコピーします!

Outputdefine('AUTH_KEY',         'L4|2Yh(giOtMLHg3#] DO NOT COPY THESE VALUES %G00o|te^[email protected])');
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');

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

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フラグが含まれていることに注意してください。

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

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

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

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

[[step-5 -—- setting-up-wordpress-through-the-web-interface]] ==ステップ5—Webインターフェイスを介したWordpressの設定

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

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

http://example.com

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

WordPress install screen

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

結論

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