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

前書き

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

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

前提条件

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

  • https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04で説明されているように、ルート以外のsudo対応ユーザーとUFWファイアウォールが有効になっている2台のUbuntu 16.04サーバー[Ubuntu 16.04での初期サーバー設定]。

  • いずれかのサーバーにLEMP(Linux、Nginx、MySQL、PHP)スタックをインストールする必要があります。 チュートリアルhttps://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-in-ubuntu-16-04[Linux、Nginx、MySQLのインストール方法、Ubuntu 16.04のPHP(LEMPスタック)]がプロセスをガイドします。 MySQLのインストールに関するステップ2をスキップする必要があります。 代わりに、このチュートリアルでMySQLをインストールします。

  • オプションで(ただし強く推奨)、SSL証明書でLEMP Webサーバーを保護できます。 ドメイン名が必要になりますが、証明書は無料です。 ガイドhttps://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16-04[Ubuntu 16.04でLet’s Encryptを使用してNginxを保護する方法]方法を示します。

手順1-データベースサーバーへのMySQLのインストール

データを別のサーバーに保存することは、1台のマシン構成のパフォーマンスの上限に達したときに適切に拡張する良い方法です。 また、後で負荷を分散し、インフラストラクチャをさらに拡張するために必要な基本構造も提供します。

まず、LEMPスタックをインストールしなかったサーバーにMySQLをインストールします。 このサーバーにログインし、パッケージキャッシュを更新してMySQLサーバーソフトウェアをインストールします。

sudo apt-get update
sudo apt-get install mysql-server

インストール手順中に、MySQLの* root *パスワードを設定および確認するよう求められます。 後で必要になるため、強力なパスワードを選択してメモしてください。

MySQLをインストールして実行する必要があります。 `+ systemctl +`を使用して確認しましょう:

systemctl status mysql
Output● mysql.service - MySQL Community Server
  Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
   since Tue 2017-05-23 14:54:04 UTC; 12s ago
Main PID: 27179 (mysqld)
  CGroup: /system.slice/mysql.service
          └─27179 /usr/sbin/mysqld

`+ Active:active(running)+`行は、MySQLがインストールされ実行されていることを意味します。 ここで、インストールをもう少し安全にします。 MySQLには、システムをロックダウンする手順を示すスクリプトが付属しています。

mysql_secure_installation

これにより、設定したばかりのMySQL * root *パスワードが求められます。 入力して、「+ ENTER」を押します。 ここで、一連のyesまたはnoプロンプトに答えます。 それらを見ていきましょう。

まず、MySQLユーザーに特定のパスワード強度ルールを自動的に適用できるプラグイン* validate password plugin *について尋ねられます。 これを有効にすることは、個々のセキュリティニーズに基づいて行う必要がある決定です。 「+ y 」と「 ENTER 」を入力して有効にするか、単に「 ENTER 」を押してスキップします。 有効にした場合、パスワード検証の厳格さについて0〜2のレベルを選択するよう求められます。 番号を選択し、「 ENTER」を押して続行します。

次に、* root *パスワードを変更するかどうかを尋ねられます。 MySQLのインストール時にパスワードを作成したばかりなので、これは安全にスキップできます。 パスワードを更新せずに続行するには、「+ ENTER」を押します。

残りのプロンプトには「はい」と回答できます。 匿名 MySQLユーザーの削除、リモート* root ログインの禁止、 test *データベースの削除、特権テーブルの再読み込みについて、以前の変更が適切に有効になることを確認するよう求められます。 これらはすべて良い考えです。 「+ y 」と入力し、それぞれに対して「 ENTER +」を押します。

すべてのプロンプトに答えると、スクリプトは終了します。 これで、MySQLのインストールが適切に保護されました。 次のステップでは、リモート接続からのアクセスを許可するようにMySQLを構成します。

ステップ2-リモート接続をリッスンするためのMySQLの構成

データベースを稼働させたので、他のコンピューターからの接続を許可するためにいくつかの構成値を変更する必要があります。

エディターでroot権限で `+ mysqld +`設定ファイルを開きます:

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

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

mysqld.cnf

. . .
[mysqld]

このセクション内では、 `+ bind-address`というパラメーターを見つける必要があります。 これにより、接続をリッスンするネットワークアドレスがデータベースソフトウェアに通知されます。

現在、MySQLはローカル接続のみを検索するように設定されています。 サーバーに到達できる_external_ IPアドレスを参照するように変更する必要があります。

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

/etc/mysql/my.cnf

[mysqld]
. . .
bind-address =

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

/etc/mysql/my.cnf

. . .
require_secure_transport = on

完了したら、ファイルを保存して閉じます。

SSL接続が機能するには、いくつかのキーと証明書を作成する必要があります。 MySQLには、必要なものをすべて自動的に設定するコマンドが付属しています。

sudo mysql_ssl_rsa_setup --uid=mysql

これにより、必要なファイルが作成され、MySQLサーバーで読み取り可能になります( +-uid = mysql +)。

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

sudo systemctl restart mysql

サーバーが外部インターフェースをリッスンしていることを確認するには、 `+ netstat +`で確認します。

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

`+ netstat `は、サーバーのネットワークシステムに関する統計情報を出力します。 この出力は、「 mysqld 」というプロセスが、標準MySQLポートであるポート「+3306」で「++」に接続されていることを示しています。

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

sudo ufw allow mysql

次に、サーバーにリモートアクセスするために必要なユーザーとデータベースを設定します。

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

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

MySQL * root *アカウントを使用してMySQLに接続することから始めます。

mysql -u root -p

MySQLの* root *パスワードの入力を求められ、新しい「+ mysql> +」プロンプトが表示されます。

これで、WordPressが使用するデータベースを作成できます。 後で簡単に識別できるように、これを単に「+ wordpress +」と呼びます。

CREATE DATABASE wordpress;

データベースができたので、ユーザーを作成する必要があります。 ユーザーを作成する際の1つのポイントは、ユーザーの接続元に基づいて2つの異なるプロファイルを定義する必要があることです。 ローカルのみのユーザーと、ウェブサーバーのIPアドレスに関連付けられたリモートユーザーを作成します。

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

CREATE USER 'wordpressuser'@'localhost' IDENTIFIED BY '';

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

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

このユーザーは、WordPressのデータベースに対して任意の操作を実行できるようになりましたが、このアカウントはローカルマシンからの接続のみに一致するため、リモートで使用することはできません。

次に、Webサーバーからの接続のみに一致するコンパニオンアカウントを作成します。 これには、WebサーバーのIPアドレスが必要です。 このアカウントには任意の名前を付けることができますが、より一貫性のあるエクスペリエンスを実現するために、ホスト部分のみを変更して、上記とまったく同じユーザー名を使用します。

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

CREATE USER 'wordpressuser'@'' IDENTIFIED BY '';

リモートアカウントを取得したので、ローカルユーザーと同じ特権を与えることができます。

GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'';

特権をフラッシュしてディスクに書き込み、使用を開始します。

FLUSH PRIVILEGES;

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

exit

新しいデータベースとリモート対応ユーザーを設定したので、データベースと接続をテストしましょう。

ステップ4-リモートおよびローカル接続のテスト

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

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

mysql -u wordpressuser -p

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

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

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

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

sudo apt-get update
sudo apt-get install mysql-client

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

mysql -u wordpressuser -h  -p

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

  • wordpressuser *アカウントのパスワードを求められ、すべてがうまくいけばMySQLプロンプトが表示されます。 次のコマンドを使用して、接続がSSLを使用していることを確認できます。

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

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

`+ SSL:+`行は、SSL暗号が使用されているかどうかを示します。 リモートで接続できることを確認したので、すぐにプロンプ​​トを終了できます。

exit

追加のチェックとして、3番目のサーバーから同じことを試して、この他のサーバーにアクセスが許可されていないことを確認できます。 ローカルアクセスとWebサーバーからのアクセスを確認しましたが、他の接続が拒否されることを確認していません。

先に進んで、特定のユーザーアカウントを設定していないサーバーで同じ手順を試してください。 上記と同様に、クライアントユーティリティをインストールする必要がある場合があります。

mysql -u wordpressuser -h  -p

これは正常に完了しないはずです。 次のようなエラーが返されます。

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

これは私たちが期待するものであり、私たちが望むものです。

リモート接続のテストに成功し、WordPressのインストールを続行できるようになりました。

ステップ5-WordPressのインストール

新しいリモート対応MySQLサーバーの機能を実証するために、人気のあるブログプラットフォームであるWordPressをWebサーバーにインストールして設定します。 これには、ソフトウェアをダウンロードして抽出し、接続情報を構成してから、WordPressの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 +`ファイルにコピーして貼り付けることができます。

Outputdefine('AUTH_KEY',         '1jl/vqfs<XhdXoAPz9  c_j{iwqD^<+c9.k<[email protected]');
define('SECURE_AUTH_KEY',  'E2N-h2]Dcvp+aS/p7X  {Ka(f;rv?Pxf})CgLi-3');
define('LOGGED_IN_KEY',    'W(50,{W^,OPB%PB<JF  2;y&,2m%3]R6DUth[;88');
define('NONCE_KEY',        'll,4UC)7ua+8<!4VM+  #`DXF+[$atzM7 o^-C7g');
define('AUTH_SALT',        'koMrurzOA+|L_lG}kf   07VC*Lj*lD&?3w!BT#-');
define('SECURE_AUTH_SALT', 'p32*p,]z%LZ+pAu:VY  C-?y+K0DK_+F|0h{!_xY');
define('LOGGED_IN_SALT',   'i^/G2W7!-1H2OQ+t$3  t6**bRVFSD[Hi])-qS`|');
define('NONCE_SALT',       'Q6]U:K?j4L%Z]}h^q7  1% ^qUswWgn+6&xqHN&%');

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

nano ~/wordpress/wp-config.php

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

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

wp-config.php

. . .
/** The name of the database for WordPress */
define('DB_NAME', '');

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

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

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

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

wp-config.php

define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

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

次に、 `〜/ wordpress`ディレクトリにあるファイルとディレクトリをNginxドキュメントルートにコピーする必要があります。 ` -a +`フラグを使用して、アクセス許可が維持されていることを確認します。

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

これで、すべてのファイルが配置されました。 あとは、ファイルの所有権を変更するだけです。 ドキュメントルートにあるすべてのファイルを、Webサーバーユーザーである `+ www-data +`が所有するように設定します。

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

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

ステップ6-Webインターフェースを介したWordpressのセットアップ

WordPressには、いくつかの質問をして、データベースに必要なテーブルをインストールするWebベースのセットアップルーチンがあります。 今から始めましょう。

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

http://

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

image:https://assets.digitalocean.com/articles/remote-mysql-1604/wp-install.png [WordPressインストール画面]

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

結論

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

前の投稿:Restic Backup Clientを使用してオブジェクトストレージサービスにデータをバックアップする方法
次の投稿:Debian 9にAnaconda Pythonディストリビューションをインストールする方法