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

0 株式
0
0
0
0

導入

アプリケーションやウェブサイトが成長すると、現在のサーバー構成では対応しきれなくなる場合があります。ウェブサーバーとデータベースを同じマシンでホストしている場合は、2つの機能を分離し、それぞれを専用のハードウェアで実行することで、訪問者のリクエストへの応答負荷を分散させるのが良いでしょう。.

このガイドでは、Webアプリケーションが接続できるリモートMySQLデータベースサーバーの設定方法について説明します。WordPressを例として扱いますが、この手法はMySQLがサポートするあらゆるアプリケーションに広く適用できます。.

前提条件
  • Ubuntu 18.04サーバーを2台用意します。「Ubuntu 18.04の初期サーバー設定」チュートリアルで説明されているように、各サーバーにはsudo権限を持つ非rootユーザーとUFWファイアウォールを有効にする必要があります。1台はMySQLバックエンドをホストし、このガイドではデータベースサーバーと呼びます。もう1台はデータベースサーバーにリモート接続し、Webサーバーとして機能します。同様に、このガイドではWebサーバーと呼びます。.
  • ウェブサーバーにNginxとPHPがインストールされています。Ubuntu 18.04にLinux、Nginx、MySQL、PHP(LEMPスタック)をインストールする方法については、チュートリアルをご覧ください。ただし、このチュートリアルのステップ2はMySQLのインストールに関する部分なので、スキップしてください。MySQLはデータベースサーバーにインストールします。
  • データベースサーバーにMySQLがインストールされています。Ubuntu 18.04にMySQLをインストールする方法については、こちらのガイドに従って設定してください。.
  • オプションですが(強く推奨します)、Let's Encrypt の TLS/SSL 証明書をウェブサーバーにインストールしてください。ドメイン名を購入し、サーバーの DNS レコードを設定する必要がありますが、証明書自体は無料です。Ubuntu 18.04 で Let's Encrypt を使用して Nginx を保護する方法というガイドで、これらの証明書の取得方法を説明しています。.

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

単一マシン構成のパフォーマンスの限界に達した場合、データを別のサーバーに保存することは、スムーズなスケーリングを実現する良い方法です。また、これは、後で負荷分散とインフラストラクチャのスケーリングに必要な基本的な構造を提供します。前提条件となるチュートリアルに従ってMySQLをインストールした後、他のコンピュータからの接続を許可するために、いくつかの設定値を変更する必要があります。.

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

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

このファイルはセクションに分かれており、各セクションは角括弧([ と ])で囲まれたラベルでマークされています。mysqldというセクションを見つけてください。

. . .
[mysqld]
. . .

このセクションでは、bind-addressというパラメータを探してください。これは、データベースソフトウェアが接続をリッスンするネットワークアドレスを指定します。.

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

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

[mysqld]
. . .
bind-address = db_server_ip

データベースへの接続はインターネット経由で行われるため、データのセキュリティを確保するために暗号化された接続を使用することをお勧めします。MySQL接続を暗号化しないと、ネットワーク上の誰でもWebサーバーとデータベースサーバー間の機密情報を傍受できる可能性があります。MySQL接続を暗号化するには、更新したbind-address行の後に次の行を追加してください。

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

完了したら、ファイルを保存して閉じます。nanoを使用している場合は、Ctrl+X、Y、Enterの順に押します。.

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

sudo mysql_ssl_rsa_setup --uid=mysql

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

sudo systemctl restart mysql

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

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

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

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

sudo ufw allow mysql

MySQLで行う必要がある設定変更は以上です。次に、データベースとユーザープロファイルの設定方法を見ていきます。そのうちの1つは、サーバーへのリモートアクセスに使用します。.

ステップ2 – WordPressデータベースとリモート認証情報の設定

MySQLは現在外部IPアドレスでリッスンしていますが、リモートアクセス可能なユーザーやデータベースは設定されていません。WordPress用のデータベースと、それにアクセスできるユーザーを数人作成してみましょう。.

まず、MySQL ルート ユーザーとして MySQL に接続します。

sudo mysql

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

CREATE DATABASE wordpress;

データベースを作成したら、次のステップはユーザーペアの作成です。ローカルユーザーと、Webサーバーの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 サーバーからデータベースに接続できるかどうかをテストできます。.

ステップ3 – リモート接続とローカル接続をテストする

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

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

mysql -u wpuser -p

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

MySQLの入力を求められた場合は、ローカル接続は成功しています。以下のコマンドを入力すると、再び終了できます。

exit

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

ssh sammy@web_server_ip

リモートデータベースにアクセスするには、Webサーバーに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サーバーからのアクセスは確認できましたが、他の接続が拒否されているかどうかはまだ確認できていません。さらに確認するには、特定のユーザーアカウントを設定していない別のサーバーから同じ操作を行い、他のサーバーにアクセスが許可されていないことを確認してください。.

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

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 をダウンロードします。

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ファイルに追加します。

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');

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

nano ~/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アドレスを使用することを忘れないでください。

. . .
/** 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');
. . .

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

define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

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

次に、~/wordpress ディレクトリ内のファイルとディレクトリを Nginx のドキュメントルートにコピーします。このコマンドには、既存のすべての権限が確実に転送されるように -a フラグが含まれていることに注意してください。

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

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

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

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

ステップ5 – Webインターフェース経由でWordPressを設定する

WordPressはウェブベースのセットアッププロセスを備えています。セットアップを進めると、いくつかの質問に答え、必要なテーブルがすべてデータベースにインストールされます。ここでは、WordPressの基本的なセットアップ手順を解説します。この手順は、リモートデータベースを使用した独自のカスタムウェブサイトを構築するための出発点としてご利用いただけます。.

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

http://example.com

WordPressインストーラーの言語選択ページが表示されます。適切な言語を選択し、メインのインストールページをクリックします。

情報を送信したら、作成したアカウントでWordPress管理画面にログインしてください。その後、ダッシュボードに移動し、新しいWordPressサイトをカスタマイズできます。.

結果

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

あなたも気に入るかもしれない