紹介
アプリケーションやウェブサイトが成長するにつれて、現在のサーバー設定が手狭になる可能性があります。ウェブサーバーとデータベースバックエンドを同じマシンにホスティングしている場合、それぞれが独自のハードウェアで動作し、訪問者のリクエストに応答する負荷を分散するためにこれらの2つの機能を分離することが良い考えかもしれません。
このガイドでは、ウェブアプリケーションが接続できるリモートMySQLデータベースサーバーを構成します。WordPressは作業の対象として使用されていますが、この手法はMySQLでバックアップされた任意のアプリケーションに広く適用されます。
前提条件
このチュートリアルを開始する前に、以下が必要です:
- 2つのUbuntu 20.04サーバー。それぞれ、sudo特権を持つ非ルートユーザーとUFWファイアウォールが有効になっている必要があります。これは、当社のUbuntu 20.04での初期サーバー設定チュートリアルで説明されています。これらのサーバーの1つは、MySQLバックエンドをホストし、このガイド全体でデータベースサーバーとして参照されます。もう1つは、リモートでデータベースサーバーに接続し、ウェブサーバーとして機能します。同様に、このガイド全体でウェブサーバーとして言及されます。
- データベースサーバー上で: MySQLがインストールされています。これを設定するには、Ubuntu 20.04にMySQLをインストールする方法に従ってください。
- ウェブサーバーで: Nginx と PHP がインストールされています。 当社のチュートリアル Ubuntu 20.04 に Linux、Nginx、MySQL、PHP(LEMP スタック)をインストールする方法 がプロセスを案内しますが、このチュートリアルの ステップ 2 をスキップしてください、これは MySQL のインストールに焦点を当てていますが、データベースサーバーに MySQL をインストールします。
- オプション(しかし強く推奨されます)、Let’s Encrypt からの TLS/SSL 証明書が ウェブサーバーにインストールされています。 ドメイン名を購入し、サーバー用の DNS レコードが設定されている必要がありますが、証明書自体は無料です。 当社のガイド Ubuntu 20.04 で Let’s Encrypt を使用して Nginx をセキュリティ化する方法 がこれらの証明書の取得方法を示します。
ステップ1 — データベースサーバーでのリモート接続のMySQLの設定
データを別のサーバーに保存することは、1台の構成でパフォーマンスの天井に達した後に gracefully に拡張する良い方法です。また、基本的な構造を提供し、将来さらにインフラストラクチャを拡張しやすくします。前提チュートリアルに従ってMySQLをインストールした後、他のコンピューターからの接続を許可するためにいくつかの設定値を変更する必要があります。
MySQLサーバーのほとんどの構成変更は、デフォルトで/etc/mysql/mysql.conf.d/
ディレクトリに保存されているmysqld.cnf
ファイルで行うことができます。お好みのエディタでルート権限でこのファイルをデータベースサーバーで開きます。この例ではnano
を使用します:
このファイルは、角かっこ([
と]
)でラベル付けされたセクションに分かれています。mysqld
とラベル付けされたセクションを見つけます:
. . .
[mysqld]
. . .
このセクション内で、bind-address
というパラメータを探します。これはデータベースソフトウェアが接続を待ち受けるネットワークアドレスを指定します。
デフォルトでは、これは127.0.0.1
に設定されています。つまり、MySQLはローカル接続のみを探すように構成されています。これを、サーバーに到達できる外部IPアドレスを参照するように変更する必要があります。
両方のサーバーがプライベートネットワーク機能を備えたデータセンターにある場合は、データベースサーバーのプライベートネットワークIPを使用します。それ以外の場合は、パブリックIPアドレスを使用できます:
[mysqld]
. . .
bind-address = db_server_ip
インターネット経由でデータベースに接続するため、データを保護するために暗号化された接続を要求することをお勧めします。MySQL接続を暗号化しない場合、ウェブサーバーとデータベースサーバー間での機密情報を誰でもネットワーク上で嗅ぎ取ることができます。MySQL接続を暗号化するには、次の行を更新したbind-address
の後に追加します:
[mysqld]
. . .
require_secure_transport = on
. . .
編集が完了したら、ファイルを保存して閉じます。 nano
を使用している場合は、CTRL + X
、Y
、ENTER
を押してください。
SSL接続を有効にするには、いくつかのキーと証明書を作成する必要があります。MySQLには、これらを自動的に設定するコマンドが付属しています。次のコマンドを実行して、必要なファイルを作成します。また、mysqlユーザーのUIDを指定してMySQLサーバーがこれらのファイルを読み取れるようにします:
MySQLに新しいSSL情報を読み込ませ、設定を更新するように強制するには、データベースを再起動します:
サーバーが外部インターフェイスでリスニングされていることを確認するには、次のss
コマンドを実行します:
Outputtcp 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ポートです。
次に、ファイアウォールでそのポートを開いてトラフィックを許可します:
これがMySQLに必要なすべての設定変更です。次に、データベースといくつかのユーザープロファイルを設定し、そのうちの1つをリモートでサーバーにアクセスするために使用します。
ステップ2 — WordPressデータベースとデータベースサーバーでのリモート資格情報の設定
MySQL自体は外部IPアドレスでリスニングされていますが、現在、リモートで使用できるユーザーやデータベースは構成されていません。WordPress用のデータベースとそのアクセス可能なユーザーのペアを作成します。
まず、MySQLのroot MySQLユーザーとして接続します:
注意: 前提としてのMySQLチュートリアルのステップ3で説明されているように、パスワード認証が有効になっている場合は、MySQLシェルにアクセスするには次のコマンドを使用する必要があります。
このコマンドを実行した後、MySQLのrootパスワードが求められ、入力すると新しいmysql>
プロンプトが表示されます。
MySQLプロンプトから、WordPressが使用するデータベースを作成します。後で簡単に識別できるように、このデータベースには認識しやすい名前を付けると役立ちます。ここでは、wordpress
と名付けます。
データベースを作成したので、次に一組のユーザーを作成する必要があります。ローカル専用ユーザーと、ウェブサーバーのIPアドレスに関連付けられたリモートユーザーを作成します。
まず、ローカルユーザーlocal_db_userを作成し、宣言でlocalhostを使用してこのアカウントがローカルの接続試行のみに一致するようにします。
次に、このアカウントにwordpress
データベースへの完全なアクセス権を付与します。
このユーザーはWordPressのデータベースで任意の操作を実行できるようになりますが、このアカウントはローカルマシンからの接続にのみ一致するため、リモートで使用することはできません。このことを考慮して、ウェブサーバーからの接続にのみ一致する補助的なアカウントを作成します。これには、ウェブサーバーのIPアドレスが必要です。
なお、mysqld.cnf
ファイルで構成したネットワークと同じネットワークを使用するIPアドレスを使用する必要があります。つまり、mysqld.cnf
ファイルでプライベートネットワークIPを指定した場合は、以下の2つのコマンドでウェブサーバーのプライベートIPを含める必要があります。MySQLをパブリックインターネットを使用するように構成した場合は、ウェブサーバーのパブリックIPアドレスを一致させる必要があります。
リモートアカウントを作成したら、ローカルユーザーと同じ権限を付与します:
最後に、権限をフラッシュして MySQL がそれらを使用し始めるようにします:
次に、MySQL プロンプトを終了します。次のように入力します:
新しいデータベースとリモート有効化されたユーザーを設定したので、ウェブサーバーからデータベースに接続できるかどうかをテストできます。
ステップ 3 — リモートとローカルの接続をテストする
続行する前に、データベースサーバーであるローカルマシンとウェブサーバーの両方からデータベースに接続できるかどうかを確認するのが最善です。
まず、新しいアカウントでログインしてローカルマシンからの接続をテストします:データベースサーバーに:
求められたら、このアカウント用に設定したパスワードを入力してください。
MySQL プロンプトが表示されたら、ローカル接続が成功しています。再度、次のように入力して終了します:
次に、リモート接続をテストするためにウェブサーバーにログインします:
リモートデータベースにアクセスするために、ウェブサーバーに MySQL クライアントツールをいくつかインストールする必要があります。最近行っていない場合は、まずローカルパッケージキャッシュを更新してください:
次に、MySQL クライアントユーティリティをインストールします:
その後、以下の構文を使用してデータベースサーバーに接続します:
再度、データベースサーバーの正しいIPアドレスを使用していることを確認してください。MySQLをプライベートネットワークでリスニングするように構成した場合は、データベースのプライベートネットワークIPを入力してください。それ以外の場合は、データベースサーバーのパブリックIPアドレスを入力してください。
リモートユーザーremote_userアカウントのパスワードを求められます。入力した後、すべてが予想通りに機能している場合は、MySQLプロンプトに移動します。次のコマンドで接続がSSLを使用していることを確認してください:
接続が確かに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
--------------
リモートで接続できることを確認した後、プロンプトを終了します:
ローカルアクセスとWebサーバーからのアクセスは確認しましたが、他の接続が拒否されることを確認していません。追加のチェックとして、特定のユーザーアカウントを構成しなかった第三のサーバーから同じことを試みて、この他のサーバーがアクセス権限を付与されていないことを確認してください。
次のコマンドを実行する前に、以前と同様にMySQLクライアントユーティリティをインストールする必要がある場合があります:
これは成功しませんし、次のようなエラーが発生するはずです:
OutputERROR 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拡張機能をインストールして、サーバーを準備します。
注意: 各WordPressプラグインには独自の要件があります。一部のプラグインは、追加のPHP拡張機能パッケージのインストールが必要な場合があります。PHPの要件を確認するには、プラグインのドキュメントを参照してください。利用可能であれば、前述の例のようにaptでインストールできます。
拡張機能のインストールが完了したら、実行中のPHPプロセッサが新しくインストールされた機能を利用できるように、PHP-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
を使用しています:
このサーバーブロック内に、いくつかのロケーションブロックを追加します。まず、/favicon.ico
と/robots.txt
へのリクエストに対して正確に一致するロケーションブロックを作成します。これらのリクエストのログを取得したくないためです。
これを行うには、静的ファイルへのリクエストに一致する正規表現ロケーションを使用し、これらのリクエストのログをオフにし、通常、サーバーにとって高価なリソースであるため、これらを非常にキャッシュ可能としてマークします。この静的ファイルリストを、サイトが使用する他のファイル拡張子を含めるように調整できます:
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
リストを調整できます。まず、最初の行にシャープ記号(#
)を前置してデフォルトの設定をコメントアウトします。次に、次の行を追加します:
server {
. . .
location / {
#try_files $uri $uri/ =404;
try_files $uri $uri/ /index.php$is_args$args;
}
. . .
}
この新しい行を設定することで、デフォルトのオプションとして404エラーを返す代わりに、リクエスト引数を使用してindex.php
ファイルに制御が渡されます。
すべてのファイルの上部は次のようになる必要があります:
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;
}
...
}
作業が完了したら、ファイルを保存して閉じます。
構文エラーをチェックするために、構成を確認してください。
エラーが報告されない場合は、次のコマンドを入力してNginxをリロードします。
ウェブサーバーの準備が整ったら、WordPressをインストールする準備ができました。
ステップ5 – ウェブサーバーにWordPressをインストールする
新しいリモート対応のMySQLサーバーの機能を示すために、人気のあるコンテンツ管理システムであるWordPressをインストールおよび構成するプロセスを実行します。ウェブサーバー。サーバーソフトウェアが構成されているため、WordPressをダウンロードできます。セキュリティ上の理由から、常にプロジェクトのウェブサイトからWordPressの最新バージョンを取得することが推奨されています。
まず、書き込み可能なディレクトリ(一時的なディレクトリとして/tmp
が推奨されます)に移動します:
これにより、作業ディレクトリが一時フォルダに変更されます。次に、次のコマンドを入力して、最新バージョンのWordPressを圧縮ファイルとしてダウンロードします:
圧縮ファイルを展開してWordPressディレクトリ構造を作成します:
これらのファイルをドキュメントルートに移動する前に、サンプル構成ファイルをWordPressが読み取るファイル名にコピーしてください。
ドキュメントルートにディレクトリ全体の内容をコピーします。 -a
フラグを使用すると、権限が維持され、ソースディレクトリの末尾にドットを付けることで、ディレクトリ内のすべてのものがコピーされます(隠しファイルも含まれます):
ファイルを配置したら、www-dataユーザーとグループに所有権を割り当てます。これは、Nginxが実行されるユーザーとグループであり、Nginxはウェブサイトを提供し、WordPressファイルを読み書きしてウェブサイトを自動更新する必要があります:
WordPressファイルがサーバーのドキュメントルートにあり、正しい所有権が設定されています。これで、WordPressを構成する準備が整いました。
ステップ6 — WordPress構成ファイルの設定
WordPress構成ファイルを開くと、インストールのセキュリティを確保するために一部の秘密キーを調整することから始めます。WordPressは、これらの値のセキュアなジェネレーターを提供しているため、自分で値を考える必要はありません。これらは内部でのみ使用されるため、複雑でセキュアな値がここにあると使用性に影響しません。
WordPressシークレットキージェネレーターからセキュアな値を取得するには、次のように入力します:
以下は出力例に似た一意の値が表示されます:
警告! 各自で独自の値を毎回要求することが重要です。ここに表示されている値をコピーしないでください!
Outputdefine('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 の設定ファイルを開きます:
それらの設定値の例を含むセクションを見つけます:
. . .
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');
. . .
これらの行を削除して、コマンドラインからコピーした値を貼り付けます:
. . .
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 アドレスと資格情報を使用することを覚えておいてください:
. . .
/** 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 接続を使用するように指示するこのハイライトされた行を追加します:
...
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保護された接続を受け入れる準備が整いました。このガイドで使用されているコマンドやテクニックは、どんなプログラミング言語で書かれたウェブアプリケーションにも適用できますが、具体的な実装の詳細は異なります。詳細については、アプリケーションや言語のデータベースのドキュメントを参照してください。