Ubuntu18.04でMySQLを使用してサイトのパフォーマンスを最適化するためにリモートデータベースを設定する方法
序章
アプリケーションまたはWebサイトが大きくなるにつれて、現在のサーバー設定を超えてしまう可能性があります。 Webサーバーとデータベースバックエンドを同じマシンでホストしている場合は、これら2つの機能を分離して、それぞれが独自のハードウェアで動作し、訪問者の要求に応答する負荷を共有できるようにすることをお勧めします。
このガイドでは、Webアプリケーションが接続できるリモートMySQLデータベースサーバーを構成する方法について説明します。 何かを操作するために例としてWordPressを使用しますが、この手法はMySQLに基づくすべてのアプリケーションに広く適用できます。
前提条件
このチュートリアルを開始する前に、次のものが必要です。
- 2つのUbuntu18.04サーバー。 Ubuntu 18.04 チュートリアルでの初期サーバー設定で説明されているように、それぞれにsudo権限とUFWファイアウォールが有効になっている非rootユーザーが必要です。 これらのサーバーの1つがMySQLバックエンドをホストします。このガイドでは、これをデータベースサーバーと呼びます。 もう1つは、データベースサーバーにリモートで接続し、Webサーバーとして機能します。 同様に、このガイドでは、これをWebサーバーと呼びます。
- NginxとPHPがWebサーバーにインストールされています。 チュートリアルUbuntu18.04にLinux、Nginx、MySQL、PHP(LEMPスタック)をインストールする方法でプロセスをガイドしますが、MySQLのインストールに焦点を当てたこのチュートリアルのステップ2をスキップする必要があることに注意してください。 MySQLをデータベースサーバーにインストールするためです。
- MySQLはデータベースサーバーにをインストールしました。 これを設定するには、 Ubuntu18.04にMySQLをインストールする方法に従ってください。
- オプションで(ただし強くお勧めします)、Let’sEncryptのTLS/SSL証明書がWebサーバーにインストールされています。 ドメイン名を購入し、サーバーに DNSレコードを設定する必要がありますが、証明書自体は無料です。 ガイドUbuntu18.04でLet’sEncryptを使用してNginxを保護する方法では、これらの証明書を取得する方法を説明しています。
ステップ1—リモート接続をリッスンするようにMySQLを構成する
データを別のサーバーに保存しておくことは、1台のマシン構成のパフォーマンスの上限に達した後に適切に拡張するための良い方法です。 また、負荷分散を行い、後でインフラストラクチャをさらに拡張するために必要な基本構造も提供します。 前提条件のチュートリアルに従ってMySQLをインストールした後、他のコンピューターからの接続を許可するためにいくつかの構成値を変更する必要があります。
MySQLサーバーの構成変更のほとんどは、 mysqld.cnf
に保存されているファイル /etc/mysql/mysql.conf.d/
デフォルトではディレクトリ。 データベースサーバーでこのファイルを開き、好みのエディターで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
Outputtcp 0 0 db_server_ip:3306 0.0.0.0:* LISTEN 27328/mysqld
netstat
サーバーのネットワークシステムに関する統計を出力します。 この出力は、 mysqld
に取り付けられています db_server_ip
港で 3306
、標準のMySQLポートであり、サーバーが適切なインターフェイスでリッスンしていることを確認します。
次に、ファイアウォールでそのポートを開いて、トラフィックが通過できるようにします。
- sudo ufw allow mysql
これらは、MySQLに対して行う必要のあるすべての構成変更です。 次に、データベースといくつかのユーザープロファイルを設定する方法について説明します。そのうちの1つを使用して、サーバーにリモートでアクセスします。
ステップ2—WordPressデータベースとリモートクレデンシャルを設定する
MySQL自体が外部IPアドレスをリッスンしていますが、現在、リモート対応のユーザーまたはデータベースは構成されていません。 WordPress用のデータベースとそれにアクセスできるユーザーのペアを作成しましょう。
rootMySQLユーザーとしてMySQLに接続することから始めます。
- sudo mysql
注:前提条件のMySQLチュートリアルのステップ3で説明されているように、パスワード認証を有効にしている場合は、代わりに次のコマンドを使用してMySQLシェルにアクセスする必要があります。
- mysql -u root -p
このコマンドを実行すると、MySQL root パスワードの入力を求められ、入力すると、新しいパスワードが与えられます。 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アドレスが必要です。
で構成したのと同じネットワークを利用するIPアドレスを使用する必要があることに注意してください mysqld.cnf
ファイル。 これは、プライベートネットワークIPを指定した場合 mysqld.cnf
ファイルの場合、次の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
リモートデータベースにアクセスするには、MySQL用のクライアントツールをWebサーバーにインストールする必要があります。 最初に、ローカルパッケージキャッシュを最近更新していない場合は、更新します。
- 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サーバーからのアクセスを確認しましたが、他の接続が拒否されることを確認していません。 追加のチェックとして、特定のユーザーアカウントをしない構成した3番目のサーバーから同じことを実行して、この他のサーバーにアクセスが許可されていないことを確認してください。
次のコマンドを実行して接続を試行する前に、上記のように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のインストールに進むことができます。
ステップ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
一時的にファイルする:
警告!毎回独自の値を要求することが重要です。 ここに表示されている値をコピーしないでください。
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');
受け取った出力をクリップボードにコピーしてから、テキストエディタで構成ファイルを開きます。
- 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');
. . .
最後に、ファイルの任意の場所に、MySQLデータベースへのSSL接続を使用するようにWordPressに指示する次の行を追加します。
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ベースのセットアップルーチンを実行する準備が整いました。
ステップ5—Webインターフェイスを介してWordpressを設定する
WordPressにはWebベースのセットアッププロセスがあります。 あなたがそれを通過するとき、それはいくつかの質問をし、あなたのデータベースに必要なすべてのテーブルをインストールします。 ここでは、WordPressをセットアップする最初の手順について説明します。これは、リモートデータベースバックエンドを使用する独自のカスタムWebサイトを構築するための開始点として使用できます。
Webサーバーに関連付けられているドメイン名(またはパブリックIPアドレス)に移動します。
http://example.com
WordPressインストーラーの言語選択画面が表示されます。 適切な言語を選択し、クリックしてメインのインストール画面に移動します。
情報を送信したら、作成したアカウントを使用してWordPress管理インターフェースにログインする必要があります。 次に、新しいWordPressサイトをカスタマイズできるダッシュボードが表示されます。
結論
このチュートリアルに従うことで、リモートのWordpressインストールからSSLで保護された接続を受け入れるようにMySQLデータベースを設定しました。 このガイドで使用されているコマンドと手法は、任意のプログラミング言語で記述されたすべてのWebアプリケーションに適用できますが、具体的な実装の詳細は異なります。 詳細については、アプリケーションまたは言語のデータベースのドキュメントを参照してください。