前書き
アプリケーションやウェブサイトが成長するにつれて、現在のサーバー設定を超えてしまう可能性があります。 Webサーバーとデータベースバックエンドを同じマシンでホストしている場合、これら2つの機能を分離して、それぞれが独自のハードウェアで動作し、訪問者のリクエストに応答する負荷を共有できるようにすることをお勧めします。
このガイドでは、Webアプリケーションが接続できるリモートMySQLデータベースサーバーを構成する方法について説明します。 WordPressを例として使用して作業を行いますが、この手法はMySQLに裏打ちされたアプリケーションに広く適用できます。
前提条件
このチュートリアルを開始する前に、次のものが必要です。
-
Initial Server Setup with Ubuntu 16.04で説明されているように、root以外のsudoが有効なユーザーと、UFWファイアウォールが有効になっている2つのUbuntu16.04サーバー。
-
いずれかのサーバーにLEMP(Linux、Nginx、MySQL、PHP)スタックをインストールする必要があります。 チュートリアルHow To Install Linux, Nginx, MySQL, PHP (LEMP stack) in Ubuntu 16.04は、プロセスをガイドします。 MySQLのインストールに関するステップ2をスキップする必要があります。 代わりに、このチュートリアルでMySQLをインストールします。
-
オプションで(ただし強く推奨)、SSL証明書でLEMP Webサーバーを保護できます。 ドメイン名が必要になりますが、証明書は無料です。 ガイドHow To Secure Nginx with Let’s Encrypt on Ubuntu 16.04でその方法を説明します。
[[step-1 -—- installing-mysql-on-the-database-server]] ==ステップ1—データベースサーバーへのMySQLのインストール
データを別のサーバーに保存することは、1台のマシン構成のパフォーマンスの上限に達したときに適切に拡張する良い方法です。 また、後で負荷を分散し、インフラストラクチャをさらに拡張するために必要な基本構造も提供します。
開始するには、LEMPスタックをdid notインストールするサーバーに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)
Active: active (running) 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
これにより、設定したMySQLrootパスワードの入力を求められます。 入力してENTER
を押します。 ここで、一連のyesまたはnoプロンプトに答えます。 それらを見ていきましょう。
まず、MySQLユーザーに特定のパスワード強度ルールを自動的に適用できるプラグインであるvalidate password pluginについて質問されます。 これを有効にすることは、個々のセキュリティニーズに基づいて行う必要がある決定です。 y
とENTER
を入力して有効にするか、ENTER
を押してスキップします。 有効にした場合、パスワード検証の厳格さについて0〜2のレベルを選択するよう求められます。 番号を選択し、ENTER
を押して続行します。
次に、rootパスワードを変更するかどうかを尋ねられます。 MySQLのインストール時にパスワードを作成したばかりなので、これは安全にスキップできます。 パスワードを更新せずに続行するには、ENTER
を押します。
残りのプロンプトはyesで答えることができます。 anonymous MySQLユーザーの削除、リモートrootログインの禁止、testデータベースの削除、および特権テーブルの再読み込みについて尋ねられ、以前の変更が正しく有効になります。 これらはすべて良い考えです。 y
と入力し、それぞれにENTER
を押します。
すべてのプロンプトに答えると、スクリプトは終了します。 これで、MySQLのインストールが適切に保護されました。 次のステップでは、リモート接続からのアクセスを許可するようにMySQLを構成します。
[[step-2 -—- configuring-mysql-to-listen-for-remote-connections]] ==ステップ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 = db_server_ip
インターネット経由でデータベースに接続するため、データを安全に保つために暗号化された接続が必要になります。 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 db_server_ip:3306 0.0.0.0:* LISTEN 27328/mysqld
netstat
は、サーバーのネットワークシステムに関する統計を出力します。 この出力は、mysqld
というプロセスが標準のMySQLポートであるポート3306
でdb_server_ip
に接続されていることを示しています。
ファイアウォールのポートを開いて、トラフィックの通過を許可します:
sudo ufw allow mysql
次に、サーバーにリモートアクセスするために必要なユーザーとデータベースを設定します。
[[step-3 -—- setting-up-a-wordpress-database-and-remote-credentials]] ==ステップ3—WordPressデータベースとリモート資格情報の設定
MySQL自体は現在外部IPアドレスでリッスンしていますが、現在、リモート対応のユーザーまたはデータベースは構成されていません。 WordPress用のデータベースと、それにアクセスできるユーザーを作成しましょう。
MySQLrootアカウントを使用してMySQLに接続することから始めます。
mysql -u root -p
MySQLrootパスワードの入力を求められた後、新しいmysql>
プロンプトが表示されます。
これで、WordPressが使用するデータベースを作成できます。 後で簡単に識別できるように、これをwordpress
と呼びます。
CREATE DATABASE wordpress;
[.note]#Note:すべてのSQLステートメントはセミコロン(;
)で終了する必要があります。 MySQLコマンドでENTER
を押し、->
プロンプトのある改行のみが表示される場合は、セミコロンを忘れている可能性があります。 新しい行に入力し、もう一度ENTER
を押して続行します。
#
データベースができたので、ユーザーを作成する必要があります。 ユーザーを作成する際の1つのポイントは、ユーザーの接続元に基づいて2つの異なるプロファイルを定義する必要があることです。 ローカルのみのユーザーと、ウェブサーバーのIPアドレスに関連付けられたリモートユーザーを作成します。
まず、ローカルユーザーwordpressuserを作成し、宣言でlocalhostを使用して、このアカウントがローカル接続の試行にのみ一致するようにします。
CREATE USER 'wordpressuser'@'localhost' IDENTIFIED BY 'password';
先に進み、このアカウントにデータベースへのフルアクセスを許可します。
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'localhost';
このユーザーは、WordPressのデータベースに対して任意の操作を実行できるようになりましたが、このアカウントはローカルマシンからの接続のみに一致するため、リモートで使用することはできません。
次に、Webサーバーからの接続のみに一致するコンパニオンアカウントを作成します。 これには、WebサーバーのIPアドレスが必要です。 このアカウントには任意の名前を付けることができますが、より一貫性のあるエクスペリエンスを実現するために、ホスト部分のみを変更して、上記とまったく同じユーザー名を使用します。
mysqld.cnf
ファイルで構成したものと同じネットワークを利用するIPアドレスを使用する必要があることに注意してください。 つまり、プライベートネットワークIPを使用している場合は、ウェブサーバーのプライベートIPを使用するために以下のルールを作成する必要があります。 パブリックインターネットを使用するようにMySQLを構成した場合、WebサーバーのパブリックIPアドレスと一致させる必要があります。
CREATE USER 'wordpressuser'@'web-server_ip' IDENTIFIED BY 'password';
リモートアカウントを取得したので、ローカルユーザーと同じ特権を与えることができます。
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'web_server_ip';
特権をフラッシュしてディスクに書き込み、使用を開始します。
FLUSH PRIVILEGES;
次に、次のように入力してMySQLプロンプトを終了します。
exit
新しいデータベースとリモート対応ユーザーを設定したので、データベースと接続をテストしましょう。
[[step-4 -—- testing-remote-and-local-connections]] ==ステップ4—リモート接続とローカル接続のテスト
続行する前に、wordpressuserアカウントを使用して、ローカルマシンとWebサーバーの両方からデータベースに接続できることを確認することをお勧めします。
まず、新しいアカウントでログインを試みて、database machineからのローカル接続をテストします。
mysql -u wordpressuser -p
プロンプトが表示されたら、このアカウントに設定したパスワードを入力します。
MySQLプロンプトが表示されたら、ローカル接続は成功しています。 次のように入力して、再度終了できます。
exit
web serverにログインして、リモート接続をテストします。
ウェブサーバーに、リモートデータベースにアクセスするには、MySQLのクライアントツールをインストールする必要があります。 ローカルパッケージキャッシュを更新してから、クライアントユーティリティをインストールします。
sudo apt-get update
sudo apt-get install mysql-client
これで、次の構文を使用してデータベースサーバーに接続できます。
mysql -u wordpressuser -h db_server_ip -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]
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
--------------
SSL:
行は、SSL暗号が使用されているかどうかを示します。 リモートで接続できることを確認したので、すぐにプロンプトを終了できます。
exit
追加のチェックとして、3番目のサーバーから同じことを実行して、この他のサーバーにnotのアクセスが許可されていることを確認できます。 ローカルアクセスとWebサーバーからのアクセスを確認しましたが、他の接続が拒否されることを確認していません。
先に進み、notが特定のユーザーアカウントを構成したサーバーで同じ手順を試してください。 上記と同様に、クライアントユーティリティをインストールする必要がある場合があります。
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
これは私たちが期待するものであり、私たちが望むものです。
リモート接続のテストに成功し、WordPressのインストールを続行できるようになりました。
[[step-5 -—- installing-wordpress]] ==ステップ5—WordPressのインストール
新しいリモート対応MySQLサーバーの機能を実証するために、人気のあるブログプラットフォームであるWordPressをWebサーバーにインストールして設定します。 これには、ソフトウェアをダウンロードして抽出し、接続情報を構成してから、WordPressのWebベースのインストールを実行する必要があります。
web serverで、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
ファイルに貼り付けることができる構成が出力されます。
[.warning]#Warning!毎回一意の値を要求することが重要です。 Do notは以下に示す値をコピーします!
#
Outputdefine('AUTH_KEY', '1jl/vqfs
受け取った出力をクリップボードにコピーしてから、テキストエディターで構成ファイルを開きます。
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', 'wordpress');
/** MySQL database username */
define('DB_USER', 'wordpressuser');
/** MySQL database password */
define('DB_PASSWORD', 'password');
/** MySQL hostname */
define('DB_HOST', 'db_server_ip');
. . .
最後に、ファイル内の任意の場所に、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ベースのセットアップルーチンを実行する準備ができました。 次のステップでそれを行います。
[[step-6 -—- setting-up-wordpress-through-the-web-interface]] ==ステップ6—Webインターフェイスを介したWordpressの設定
WordPressには、いくつかの質問をして、データベースに必要なテーブルをインストールするWebベースのセットアップルーチンがあります。 今から始めましょう。
Webサーバーに関連付けられているドメイン名(またはパブリックIPアドレス)に移動します。
http://example.com
WordPressインストーラーの言語選択画面が表示されます。 適切な言語を選択し、クリックしてメインのインストール画面に進みます。
情報を送信したら、作成したアカウントを使用してWordPress管理インターフェイスにログインする必要があります。 その後、サイトをカスタマイズして操作できるダッシュボードに移動します。
結論
このチュートリアルでは、MySQLデータベースをセットアップして、リモートのWordpressインストールからSSLで保護された接続を受け入れます。 使用したコマンドと手法は、プログラミング言語で記述されたWebアプリケーションに適用できますが、具体的な実装の詳細は異なります。 詳細については、アプリケーションまたは言語のデータベースドキュメントを参照してください。