サイトのパフォーマンスを最適化するためのリモートデータベースの設定方法(Ubuntu 20.04用MySQL)

紹介

アプリケーションやウェブサイトが成長するにつれて、現在のサーバー設定が手狭になる可能性があります。ウェブサーバーとデータベースバックエンドを同じマシンにホスティングしている場合、それぞれが独自のハードウェアで動作し、訪問者のリクエストに応答する負荷を分散するためにこれらの2つの機能を分離することが良い考えかもしれません。

このガイドでは、ウェブアプリケーションが接続できるリモートMySQLデータベースサーバーを構成します。WordPressは作業の対象として使用されていますが、この手法はMySQLでバックアップされた任意のアプリケーションに広く適用されます。

前提条件

このチュートリアルを開始する前に、以下が必要です:

ステップ1 — データベースサーバーでのリモート接続のMySQLの設定

データを別のサーバーに保存することは、1台の構成でパフォーマンスの天井に達した後に gracefully に拡張する良い方法です。また、基本的な構造を提供し、将来さらにインフラストラクチャを拡張しやすくします。前提チュートリアルに従ってMySQLをインストールした後、他のコンピューターからの接続を許可するためにいくつかの設定値を変更する必要があります。

MySQLサーバーのほとんどの構成変更は、デフォルトで/etc/mysql/mysql.conf.d/ディレクトリに保存されているmysqld.cnfファイルで行うことができます。お好みのエディタでルート権限でこのファイルをデータベースサーバーで開きます。この例では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接続を暗号化しない場合、ウェブサーバーとデータベースサーバー間での機密情報を誰でもネットワーク上で嗅ぎ取ることができます。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

サーバーが外部インターフェイスでリスニングされていることを確認するには、次のssコマンドを実行します:

  1. sudo ss -plunt | grep mysqld
Output
tcp LISTEN 0 70 127.0.0.1:33060 0.0.0.0:* users:(("mysqld",pid=4053,fd=22)) tcp LISTEN 0 151 db_server_ip:3306 0.0.0.0:* users:(("mysqld",pid=4053,fd=24))

ssは、サーバーのネットワーキングシステムに関する統計を表示します。この出力によると、mysqldというプロセスがdb_server_ipのポート3306にアタッチされています。これは、サーバーが適切なインターフェイスでリスニングしていることを確認するもので、これは標準のMySQLポートです。

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

  1. sudo ufw allow mysql

これがMySQLに必要なすべての設定変更です。次に、データベースといくつかのユーザープロファイルを設定し、そのうちの1つをリモートでサーバーにアクセスするために使用します。

ステップ2 — WordPressデータベースとデータベースサーバーでのリモート資格情報の設定

MySQL自体は外部IPアドレスでリスニングされていますが、現在、リモートで使用できるユーザーやデータベースは構成されていません。WordPress用のデータベースとそのアクセス可能なユーザーのペアを作成します。

まず、MySQLのroot MySQLユーザーとして接続します:

  1. sudo mysql

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

  1. mysql -u root -p

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

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

  1. CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

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

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

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

次に、このアカウントにwordpressデータベースへの完全なアクセス権を付与します。

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

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

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

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

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

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

最後に、権限をフラッシュして MySQL がそれらを使用し始めるようにします:

  1. FLUSH PRIVILEGES;

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

  1. exit

新しいデータベースとリモート有効化されたユーザーを設定したので、ウェブサーバーからデータベースに接続できるかどうかをテストできます。

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

続行する前に、データベースサーバーであるローカルマシンとウェブサーバーの両方からデータベースに接続できるかどうかを確認するのが最善です。

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

  1. mysql -u local_db_user -p

求められたら、このアカウント用に設定したパスワードを入力してください。

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

  1. exit

次に、リモート接続をテストするためにウェブサーバーにログインします:

  1. ssh remote_user@web_server_ip

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

  1. sudo apt update

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

  1. sudo apt install mysql-client

その後、以下の構文を使用してデータベースサーバーに接続します:

  1. mysql -u remote_user -h db_server_ip -p

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

リモートユーザーremote_userアカウントのパスワードを求められます。入力した後、すべてが予想通りに機能している場合は、MySQLプロンプトに移動します。次のコマンドで接続がSSLを使用していることを確認してください:

  1. status

接続が確かにSSLを使用している場合、SSL:行にそれが表示されます:

Output
-------------- mysql Ver 8.0.29-0ubuntu0.20.04.2 for Linux on x86_64 ((Ubuntu)) Connection id: 14 Current database: Current user: remote_user@web_server_ip SSL: Cipher in use is TLS_AES_256_GCM_SHA384 Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 8.0.29-0ubuntu0.20.04.2 (Ubuntu) Protocol version: 10 Connection: db_server_ip via TCP/IP Server characterset: utf8mb4 Db characterset: utf8mb4 Client characterset: utf8mb4 Conn. characterset: utf8mb4 TCP port: 3306 Binary data as: Hexadecimal Uptime: 1 hour 8 min 28 sec Threads: 2 Questions: 69 Slow queries: 0 Opens: 206 Flush tables: 3 Open tables: 125 Queries per second avg: 0.016 --------------

リモートで接続できることを確認した後、プロンプトを終了します:

  1. exit

ローカルアクセスとWebサーバーからのアクセスは確認しましたが、他の接続が拒否されることを確認していません。追加のチェックとして、特定のユーザーアカウントを構成しなかった第三のサーバーから同じことを試みて、この他のサーバーがアクセス権限を付与されていないことを確認してください。

次のコマンドを実行する前に、以前と同様に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のインストールのためのWebサーバーの準備

前提チュートリアルに従っていれば、NginxとPHPの両方がインストールされているはずです。WordPressやその多くのプラグインは、多くの追加のPHP拡張機能を利用しています。WebサーバーにWordPressをインストールする前に、WordPressで使用するいくつかのPHP拡張機能をインストールして、サーバーを準備します。

  1. sudo apt install php-curl php-gd php-intl php-mbstring php-soap php-xml php-xmlrpc php-zip

注意: 各WordPressプラグインには独自の要件があります。一部のプラグインは、追加のPHP拡張機能パッケージのインストールが必要な場合があります。PHPの要件を確認するには、プラグインのドキュメントを参照してください。利用可能であれば、前述の例のようにaptでインストールできます。

拡張機能のインストールが完了したら、実行中のPHPプロセッサが新しくインストールされた機能を利用できるように、PHP-FPMプロセスを再起動します。

  1. sudo systemctl restart php7.4-fpm

次に、Nginxサーバーブロックファイルをいくつか調整します。前提チュートリアルに基づいて、/etc/nginx/sites-available/ディレクトリにサイトの構成ファイルがあるはずです。また、サーバーのドメイン名またはIPアドレスに応答し、TLS/SSL証明書で保護されている必要があります。/etc/nginx/sites-available/your_domainはここで例として使用されています。適切な場所に構成ファイルのパスを置き換えてください。

さらに、この例のWordPressインストールでは、/var/www/your_domainがルートディレクトリとして使用されます。自分自身の構成で指定されたドキュメントルートを使用してください。

注意:このサーバーで1つのウェブサイトのみをホストする場合は、デフォルトの設定である/etc/nginx/sites-available/default/var/www/htmlをドキュメントルートとして使用することができます。それ以外の場合は、必要な構成を論理的なチャンクに分割し、1つのサイトごとに1つのファイルを使用することが最適です。

お好みのエディタでサイトのサーバーブロックファイルを開きます。この例ではnanoを使用しています:

  1. sudo nano /etc/nginx/sites-available/your_domain

このサーバーブロック内に、いくつかのロケーションブロックを追加します。まず、/favicon.ico/robots.txtへのリクエストに対して正確に一致するロケーションブロックを作成します。これらのリクエストのログを取得したくないためです。

これを行うには、静的ファイルへのリクエストに一致する正規表現ロケーションを使用し、これらのリクエストのログをオフにし、通常、サーバーにとって高価なリソースであるため、これらを非常にキャッシュ可能としてマークします。この静的ファイルリストを、サイトが使用する他のファイル拡張子を含めるように調整できます:

/etc/nginx/sites-available/your_domain
server {
    server_name your_domain www.your_domain;
    root /var/www/your_domain;

    index index.html index.htm index.php;

    location = /favicon.ico { log_not_found off; access_log off; }
    location = /robots.txt { log_not_found off; access_log off; allow all; }
    location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
        expires max;
        log_not_found off;
    }
    . . .
}

既存のlocation /ブロックの内部で、try_filesリストを調整できます。まず、最初の行にシャープ記号(#)を前置してデフォルトの設定をコメントアウトします。次に、次の行を追加します:

/etc/nginx/sites-available/your_domain
server {
    . . .
    location / {
        #try_files $uri $uri/ =404;
        try_files $uri $uri/ /index.php$is_args$args;
    }
    . . .
}

この新しい行を設定することで、デフォルトのオプションとして404エラーを返す代わりに、リクエスト引数を使用してindex.phpファイルに制御が渡されます。

すべてのファイルの上部は次のようになる必要があります:

/etc/nginx/sites-available/your_domain
server {
    server_name your_domain www.your_domain;
    root /var/www/your_domain;

    index index.html index.htm index.php;

    location = /favicon.ico { log_not_found off; access_log off; }
    location = /robots.txt { log_not_found off; access_log off; allow all; }
    location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
        expires max;
        log_not_found off;
    }

    location / {
       # try_files $uri $uri/ =404;
        try_files $uri $uri/ /index.php$is_args$args;
    }

  ...
}

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

構文エラーをチェックするために、構成を確認してください。

  1. sudo nginx -t

エラーが報告されない場合は、次のコマンドを入力してNginxをリロードします。

  1. sudo systemctl reload nginx

ウェブサーバーの準備が整ったら、WordPressをインストールする準備ができました。

ステップ5 – ウェブサーバーにWordPressをインストールする

新しいリモート対応のMySQLサーバーの機能を示すために、人気のあるコンテンツ管理システムであるWordPressをインストールおよび構成するプロセスを実行します。ウェブサーバー。サーバーソフトウェアが構成されているため、WordPressをダウンロードできます。セキュリティ上の理由から、常にプロジェクトのウェブサイトからWordPressの最新バージョンを取得することが推奨されています。

まず、書き込み可能なディレクトリ(一時的なディレクトリとして/tmpが推奨されます)に移動します:

  1. cd /tmp

これにより、作業ディレクトリが一時フォルダに変更されます。次に、次のコマンドを入力して、最新バージョンのWordPressを圧縮ファイルとしてダウンロードします:

  1. curl -LO https://wordpress.org/latest.tar.gz

圧縮ファイルを展開してWordPressディレクトリ構造を作成します:

  1. tar xzvf latest.tar.gz

これらのファイルをドキュメントルートに移動する前に、サンプル構成ファイルをWordPressが読み取るファイル名にコピーしてください。

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

ドキュメントルートにディレクトリ全体の内容をコピーします。 -a フラグを使用すると、権限が維持され、ソースディレクトリの末尾にドットを付けることで、ディレクトリ内のすべてのものがコピーされます(隠しファイルも含まれます):

  1. sudo cp -a /tmp/wordpress/. /var/www/your_domain

ファイルを配置したら、www-dataユーザーとグループに所有権を割り当てます。これは、Nginxが実行されるユーザーとグループであり、Nginxはウェブサイトを提供し、WordPressファイルを読み書きしてウェブサイトを自動更新する必要があります:

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

WordPressファイルがサーバーのドキュメントルートにあり、正しい所有権が設定されています。これで、WordPressを構成する準備が整いました。

ステップ6 — WordPress構成ファイルの設定

WordPress構成ファイルを開くと、インストールのセキュリティを確保するために一部の秘密キーを調整することから始めます。WordPressは、これらの値のセキュアなジェネレーターを提供しているため、自分で値を考える必要はありません。これらは内部でのみ使用されるため、複雑でセキュアな値がここにあると使用性に影響しません。

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

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

以下は出力例に似た一意の値が表示されます:

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

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

これらは、安全なキーを設定するために設定ファイルに直接貼り付けることができる構成行です。今受け取った出力をコピーしてください。

WordPress の設定ファイルを開きます:

  1. sudo nano /var/www/your_domain/wp-config.php

それらの設定値の例を含むセクションを見つけます:

/var/www/your_domain/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');
. . .

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

/var/www/your_domain/wp-config.php
. . .
define('AUTH_KEY',         'VALUES COPIED FROM THE COMMAND LINE');
define('SECURE_AUTH_KEY',  'VALUES COPIED FROM THE COMMAND LINE');
define('LOGGED_IN_KEY',    'VALUES COPIED FROM THE COMMAND LINE');
define('NONCE_KEY',        'VALUES COPIED FROM THE COMMAND LINE');
define('AUTH_SALT',        'VALUES COPIED FROM THE COMMAND LINE');
define('SECURE_AUTH_SALT', 'VALUES COPIED FROM THE COMMAND LINE');
define('LOGGED_IN_SALT',   'VALUES COPIED FROM THE COMMAND LINE');
define('NONCE_SALT',       'VALUES COPIED FROM THE COMMAND LINE');
. . .

次に、ファイルの先頭にあるデータベース接続設定の一部を変更します。データベース名、データベースユーザー、および MySQL で構成された関連するパスワードを調整する必要があります。

リモートデータベースの接続情報を入力します。前のリモートデータベースのテストで使用した IP アドレスと資格情報を使用することを覚えておいてください:

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

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

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

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

最後に、define( 'DB_COLLATE', '' ); の行の下に、WordPress に MySQL データベースへの SSL 接続を使用するように指示するこのハイライトされた行を追加します:

var/www/your_domain/wp-config.php
...
define( 'DB_COLLATE', '' );

define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
...

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

設定が完了したら、WordPress がインストールされ、Web ベースのセットアップ手順を実行する準備が整っています。

ステップ 7 — ウェブインターフェースを介した WordPress の設定

WordPressにはWebベースの設定プロセスがあります。それを進めると、いくつかの質問が表示され、必要なすべてのテーブルがデータベースにインストールされます。ここでは、WordPressの設定の最初のステップを実行します。これは、リモートデータベースバックエンドを使用するカスタムウェブサイトの構築の出発点として使用できます。

ウェブサーバーに関連付けられたドメイン名(または公開IPアドレス)に移動し、末尾に/wp-adminを追加します。

http://your_domain.com/wp-admin

使用したい言語を選択するように求められます。

次に、メインのセットアップページに移動します。

WordPressサイトの名前を選択し、ユーザー名を選択します。セキュリティ上の理由から、「admin」などの一般的なユーザー名は避け、ユニークな名前を選択することをお勧めします。強力なパスワードが自動的に生成されます。このパスワードを保存するか、代替の強力なパスワードを選択してください。

メールアドレスを入力し、サイトのインデックスを検索エンジンに非表示にするかどうかを選択します。

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

結論

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

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-remote-database-to-optimize-site-performance-with-mysql-on-ubuntu-20-04