MySQLでサイトのパフォーマンスを最適化するためにリモートデータベースを設定する方法
序章
アプリケーションまたはWebサイトが大きくなると、現在の設定を超えてしまう可能性があります。 現在、Webサーバーとデータベースバックエンドを同じVPSでホストしている場合は、これら2つの機能を分離して、それぞれが独自のマシンで動作および拡張できるようにすることをお勧めします。
このガイドでは、Webサーバーが動的コンテンツ用に接続できるリモートデータベースサーバーを構成する方法について説明します。 例としてWordPressを使用して、何かを操作できるようにします。 WebサーバーでNginxを構成してから、リモートマシンのMySQLデータベースに接続します。 デモでは、Ubuntu12.04VPSインスタンスでこれらすべてを実行します。
データベースサーバーにMySQLをインストールする
まず、1つのVPSインスタンスをMySQLサーバーとして構成します。 データを別のコンピューターに保存しておくことは、1台のコンピューター構成で上限に達したときに適切に拡張するための良い方法です。 また、負荷分散を行い、後でセットアップをさらに拡張するために必要な基本構造も提供します。
開始するには、データベースサーバーにいくつかの基本的なパッケージをインストールする必要があります。 これらは基本的に、従来のLEMPスタック用にデータベースをセットアップするために実行する手順とほとんど同じですが、すべてのコンポーネントが必要になるわけではありません(一部は他のサーバーにあります)。
パッケージキャッシュを更新し、MySQLサーバーをインストールすることから始めます。
sudo apt-get update
sudo apt-get install mysql-server
インストール手順中に、MySQLのrootパスワードを選択して確認するように求められます。
終了したら、データベースインストールコマンドを実行する必要があります。これにより、コンポーネントを管理するための適切なディレクトリ構造が生成されます。
sudo mysql_install_db
その後、いくつかの安全でないデフォルトを無効にすることについて私たちに尋ねるスクリプトを実行することによって、セキュリティを少し強化する必要があります。
sudo mysql_secure_installation
上記の手順で設定したMySQL管理者のパスワードを入力する必要があります。 その後、そのパスワードを変更するかどうかを尋ねられます。 現在のパスワードに満足している場合は、「N」を入力してください。
追加の質問すべてに対して、Enterキーを押して、一部のテストデータベースを削除し、アクセスをロックダウンするデフォルトのオプションを選択する必要があります。
リモートアクセスを許可するようにMySQLを構成する
データベースが稼働しているので、他のコンピューターからの接続を許可するためにいくつかの値を変更する必要があります。
エディターでroot権限を持つMySQLのメイン構成ファイルを開きます。
sudo nano /etc/mysql/my.cnf
このファイルは、角かっこ([および])内の単語で示されるセクションに分割されています。 ラベルの付いたセクションを見つける mysqld
:
[mysqld]
このセクション内(このタグと次のセクションマーカーの間の領域)で、次のパラメーターを見つける必要があります。 bind-address
. これは基本的に、接続をリッスンするネットワークアドレスをデータベースソフトウェアに指示します。
現在、MySQLは、自身のコンピューターからの接続のみを検索するように構成されています。 サーバーにアクセスできる外部IPアドレスを参照するように変更する必要があります。
プライベートネットワーク機能を備えたデータセンターでこれをホストしている場合は、サーバーのプライベートネットワークIPを使用してください。 それ以外の場合は、ここでパブリックIPアドレスを使用できます。
bind-address = your_database_IP
終了したら、ファイルを保存して閉じます。
実装したばかりの新しい変更をMySQLに強制的に読み取らせるには、データベースを再起動します。
sudo service mysql restart
リモートWordPressクレデンシャルとデータベースを設定する
MySQLが外部アドレスをリッスンするように構成されたので、データベースを作成してリモートユーザーを確立する必要があります。 MySQL自体は現在他のマシンが接続できるIPアドレスをリッスンしていますが、現在アクセスできるデータベースはありません。
これは、ユーザーがどこから接続しているかに基づいて、さまざまな特権を確立する機会でもあります。 実際には同じユーザー名であるが、異なるホストに関連付けられる2つの「ユーザー」を作成できます。
これが意味するのは、データベースサーバー自体にバインドされたユーザーを作成し、それに非常に幅広いアクセス許可を付与できるということです。 その後、同じユーザー名を使用できますが、Webサーバーに関連付けられ、WordPressに必要な権限のみを付与します。
これにより、データベースサーバーにログインしている間、重労働を行うことができますが、Webサーバーには、その仕事を遂行するために必要な最小限のアクセス許可しか与えられません。 これは、Webサーバーが危険にさらされた場合に、データベースサーバーを部分的に保護する優れたセキュリティポリシーです。
構成したrootアカウントと管理者パスワードを使用してMySQLに接続することから始めます。
mysql -u root -p
MySQLルートパスワードの入力を求められた後、MySQLプロンプトが表示されます。
これを始めるために、WordPressが使用するデータベースを作成しましょう。 これを単に呼びます wordpress
後で簡単に識別できるように:
CREATE DATABASE wordpress;
データベースができたので、ローカルユーザーを作成する必要があります。このユーザーは、必要に応じて、より強力なデータベース操作を実行するために使用されます。 このユーザーを呼び出します wordpressuser
このアカウントを、データベースサーバー自体から発信された接続試行とのみ一致させる localhost
宣言で:
CREATE USER 'wordpressuser'@'localhost' IDENTIFIED BY 'password';
先に進んで、このアカウントにデータベースへのフルアクセスを許可しましょう。
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'localhost';
このユーザーは、WordPressのデータベースで任意の操作を実行できるようになりましたが、このアカウントはローカルマシンからの接続とのみ一致するため、リモートで使用することはできません。
Webサーバーからの接続のみに一致するコンパニオンアカウントを作成しましょう。 このためには、WebサーバーのIPアドレスが必要です。 このアカウントには任意の名前を付けることができますが、より一貫性のあるエクスペリエンスを実現するために、ホスト部分のみを変更して、上記とまったく同じユーザー名を使用します。
で構成したのと同じネットワークを利用するIPアドレスを使用する必要があることに注意してください my.cnf
ファイル。 つまり、プライベートネットワークIPを使用した場合は、WebサーバーのプライベートIPを使用するために以下のルールを作成する必要があります。 パブリックインターネットを使用するようにMySQLを構成した場合は、それをWebサーバーのパブリックIPアドレスと一致させる必要があります。
CREATE USER 'wordpressuser'@'web_server_IP' IDENTIFIED BY 'password';
リモートアカウントができたので、WordPressが通常の状況で動作するために必要な利用可能な特権のサブセットをアカウントに与えることができます。 これらは select
, delete
, insert
、 と update
.
これが最終目標ですが、現時点では実際には実装できません。 これは、特定の操作中に、より多くのアクセスを許可するために一時的にアクセス許可を調整する必要があるためです。 これらの1つは、実際には初期インストールです。 現時点ではすべての権限を付与するのが最も簡単で、インストールが完了したらそれらを制限します。
参考までに、アカウントをロックダウンするために使用するコマンド(心配しないでください。必要なときにこのコマンドを再度提供します)は次のとおりです。
GRANT SELECT,DELETE,INSERT,UPDATE ON wordpress.* TO 'wordpressuser'@'web_server_ip';
ただし、現時点では、すべての特権を一時的に付与します。これにより、当面はローカルアカウントと実質的に同じになります。
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'web_server_ip';
WordPressを設定した後、これに戻ります。 実際にWordPressをインストールしておらず、このガイドを使用してWebサーバーをデータベースから分離する方法を学習している場合は、より制限の厳しい設定を使用できる可能性があります。 Webアプリケーションによって異なるため、アプリケーションに必要な最小限のデータベース権限を調べてください。
それらをディスクに書き込むための特権をフラッシュし、それらの使用を開始します。
FLUSH PRIVILEGES;
これで、次のように入力してMySQLプロンプトを終了できます。
exit
リモート接続とローカル接続をテストする
続行する前に、ローカルマシンとWebサーバーの両方からデータベースに接続できることを確認することをお勧めします。 wordpressuser
アカウント。
まず、新しいアカウントでログインして、データベースマシンからの接続をテストします。
mysql -u wordpressuser -p
プロンプトが表示されたら、このアカウントに設定したパスワードを入力します。
MySQLプロンプトが表示された場合、ローカル接続は成功しています。 次のように入力すると、再び終了できます。
exit
Webサーバーにログインして、リモート接続をテストします。
Webサーバーで、リモートデータベースにアクセスするには、MySQL用のクライアントツールをいくつかインストールする必要があります。 ローカルパッケージキャッシュを更新してから、クライアントユーティリティをインストールします。
sudo apt-get update
sudo apt-get install mysql-client
これで、次の構文を使用してデータベースサーバーに接続できます。
mysql -u wordpressuser -h database_server_IP -p
ここでも、データベースサーバーに正しいIPアドレスを使用していることを確認する必要があります。 プライベートネットワークでリッスンするようにMySQLを構成した場合は、データベースのプライベートネットワークIPを入力します。それ以外の場合は、データベースサーバーのパブリックIPアドレスを入力します。
あなたはあなたのパスワードを求められるべきです wordpressuser
アカウント、およびすべてがうまくいった場合は、MySQLプロンプトが表示されます。
これが成功した場合は、リモートで接続できることを確認したので、先に進んでプロンプトを終了できます。
追加のチェックとして、3番目のサーバーから同じことを実行して、この他のサーバーにアクセスが許可されていないことを確認できます。 ローカルアクセスとWebサーバーからのアクセスを確認しましたが、他の接続が拒否されることを確認していません。
先に進み、特定のユーザーアカウントを構成せず実行したサーバーで同じ手順を試してください。 上記のようにクライアントユーティリティをインストールする必要がある場合があります。
mysql -u wordpressuser -h database_server_IP -p
これは正常に完了しないはずです。 次のようなエラーが返されます。
ERROR 1130 (HY000): Host '11.111.111.111' is not allowed to connect to this MySQL server
これが私たちが期待していることであり、私たちが望んでいることです。
Webサーバーをセットアップする
WebサーバーがWordPressデータベースにアクセスできることを確認したので、Nginx、PHP、および必要なコンポーネントを構成して、これを実際にWebサーバーにする必要があります。
上記のテストを実行するためにパッケージインデックスを更新したので、再度実行する必要はありません。 必要なすべてのパッケージをインストールしましょう。
sudo apt-get install nginx php5-fpm php5-mysql
すべてがインストールされたら、ソフトウェアの構成を開始できます。
PHPを構成する
それは非常に簡単なので、PHPから始めましょう。
のPHP構成ファイルを開きます php-fpm
、動的コンテンツを処理します。 これで1つの値を変更する必要があります:
sudo nano /etc/php5/fpm/php.ini
を検索します cgi.fix_pathinfo
パラメータ。 「;」でコメントアウトされる可能性があります。 文字で「1」に設定します。 行のコメントを解除して「0」に設定することにより、これらの条件の両方を逆にする必要があります。
cgi.fix_pathinfo=0
これはセキュリティ対策です。 このオプションを設定することにより、完全に一致するものが見つからない場合にユーザーがアクセスしようとしたファイルを推測しようとしないようにPHPに指示します。 これを設定しなかった場合、悪意のあるユーザーがこの機会を利用して、サーバーに望まないコードを実行させる可能性があります。
終了したら、ファイルを保存して閉じます。
次に、別のファイルを開いて、PHPプロセッサとWebサーバーの通信方法を変更する必要があります。
sudo nano /etc/php5/fpm/pool.d/www.conf
探してください listen
ディレクティブ。次のように設定する必要があります 127.0.0.1:9000
. ポートを使用するのではなく、これをUNIXドメインソケットに設定します。
listen = /var/run/php5-fpm.sock
終了したら、ファイルを保存して閉じます。
値がわかったので、PHPプロセッサを再起動します。
sudo service php5-fpm restart
Nginxを構成する
これで、Nginxを構成する準備が整いました。 デフォルトの仮想ホストファイルを、作業可能な新しいファイルにコピーすることから始めることができます。 これは、サイトのドメインにちなんで名付けます。 プレースホルダー「example.com」を使用します。
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com
次に、コピーしたファイルを開きます。
sudo nano /etc/nginx/sites-available/example.com
内部では、サーバーブロックを変更します( server
角かっこ)。 ポート80をリッスンするディレクティブのコメントを解除することから始めます。 また、ルートディレクトリを変更し、NginxがデフォルトでPHPインデックスファイルを提供するようにします。
server {
listen 80;
root /var/www/example.com;
index index.php index.hmtl index.htm;
次に、 server_name
ドメイン名を使用するためのディレクティブ、 try_files
が正しく設定されており(ファイルが見つからない場合はPHPにリクエストを渡します)、エラーページが構成されています。
server {
listen 80;
root /var/www/example.com;
index index.php index.hmtl index.htm;
server_name example.com;
location / {
try_files $uri $uri/ /index.php?q=$uri&$args;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/www;
}
最後に、すべてのPHPリクエストに一致するロケーションブロックを使用して、実際のPHP処理を設定する必要があります。 完全に一致するものが見つからない場合は、すぐに404を返します。 PHP用に構成したソケットも使用します。
server {
listen 80;
root /var/www/example.com;
index index.php index.hmtl index.htm;
server_name example.com;
location / {
try_files $uri $uri/ /index.php?q=$uri&$args;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/www;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
}
これでサーバーブロック構成は終了です。 ファイルを保存して閉じます。
ここで、これを「有効な」ディレクトリにリンクし、デフォルトのサーバーブロックファイルのリンクを削除します。
sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
Nginxを再起動して、次の変更を行います。
sudo service nginx restart
WordPressをインストールする
これで、WebサーバーがPHP処理でセットアップされ、データベースサーバーが作成されたので、これを利用してデータベースに接続するためのアプリケーションをインストールする必要があります。 ご存知のように、このチュートリアルでは、WordPressを使用してこの機能のデモを行っています。
最新のWordPresstarballをホームディレクトリにダウンロードします。
cd ~
wget http://wordpress.org/latest.tar.gz
ファイルを抽出します。これにより、ホームディレクトリに「wordpress」というディレクトリが作成されます。
tar xzvf latest.tar.gz
WordPressにはサンプルの構成ファイルが含まれていますが、すぐに使用できるわけではありません。 このファイルの名前を変更して正しく読み取れるようにしてから、テキストエディタで開いて変更を加えます。
cp ~/wordpress/wp-config-sample.php ~/wordpress/wp-config.php
nano ~/wordpress/wp-config.php
内部に、リモートデータベースの正しい値を入力する必要があります。 以前にリモートデータベーステストで使用したものと同じIPアドレスを使用することを忘れないでください。
/** 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', 'database_server_ip');
終了したらファイルを閉じます。 これは、実際には、Webサーバーとデータベースサーバーを明示的にリンクする構成全体の唯一の部分です。
次に、Nginxサーバーブロック構成で設定したディレクトリ構造を作成する必要があります。 思い出してください。私はデモに「example.com」を使用していますが、Nginx構成で指定したものを使用する必要があります。
sudo mkdir -p /var/www/example.com
次に、で見つかったファイルとディレクトリをコピーします ~/wordpress
作成したばかりの新しいドキュメントルートへのディレクトリ:
sudo cp -r ~/wordpress/* /var/www/example.com
これで、すべてのファイルが配置されました。 あとは、権限とファイルの所有権を少し変更するだけです。 まず、サーバーのドキュメントルートに移動する必要があります。
cd /var/www/example.com
このディレクトリ内のすべてのファイルをWebサーバーユーザーに渡します。 www-data
:
sudo chown -R www-data:www-data *
ただし、これらのファイルを通常の非rootユーザーとして編集できるようにしたいので、Webサーバー上の通常の非rootアカウントをWebサーバーグループに追加できます。 次に、そのグループにこのディレクトリ内のファイルを変更する権限を与えることができます。
sudo usermod -a -G www-data your_user
sudo chmod -R g+rw /var/www/example.com
Webインターフェイスを介してサイトを設定する
今、あなたがする必要があるのは、ウェブインターフェースを通してインストールを完了することです。
Webサーバーに関連付けられているドメイン名(またはパブリックIPアドレス)に移動します。
http://example.com
関連情報を入力する必要があるWordPressのインストール画面が表示されます。
構成を設定したら、作成したアカウントを使用してアプリケーションにログインする必要があります。
管理ダッシュボードが表示され、サイトの構成を開始できます。
リモートデータベースのアクセス許可を制限する
WordPressの設定が終了したら、戻ってリモートデータベースユーザーの権限の一部を取り消す必要があります。
ほとんどのデータベース権限は日常の操作には必要なく、更新中またはプラグインのインストール時にのみ有効にする必要があります。 これらの手順を実行した後に管理アクションを実行するときにエラーが発生した場合に備えて、このことに注意してください。
特定のプラグインには、追加の権限が必要な場合もあります。 各プラグインを調べて必要なものを確認し、追加アクセスの必要性が最も少ないプラグインの選択を検討してください。
データベースサーバーにログインします。 その後、MySQLルートアカウントを使用してMySQLにログインします。
mysql -u root -p
プロンプトにアクセスするには、パスワードを入力してください。
次のように入力すると、リモートユーザーの現在の権限を確認できます。
show grants for 'wordpressuser'@'web_server_IP';
+---------------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected] |
+---------------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wordpressuser'@'xx.xxx.xxx.xxx' IDENTIFIED BY PASSWORD '*5FD2B7524254B7F81B32873B1EA6D681503A5CA9' |
| GRANT ALL PRIVILEGES ON `wordpress`.* TO 'wordpressuser'@'xx.xxx.xxx.xxx' |
+---------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
「使用」権限は実際には実際の特権がないことを意味するため、それについて心配する必要はありません。 2番目の特権行は、最初に設定したものであり、 wordpress
データベース。
現在の特権よりも制限の厳しい新しい特権を適用する手順は、実際には2つのステップです。
まず、現在のすべての特権を取り消す必要があります。 次のように入力してこれを行います。
REVOKE ALL PRIVILEGES on wordpress.* FROM 'wordpressuser'@'web_server_IP';
今、現在の助成金を要求すると、2行目がなくなっていることがわかります。
show grants for 'wordpressuser'@'web_server_IP';
+---------------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected] |
+---------------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wordpressuser'@'xx.xxx.xxx.xxx' IDENTIFIED BY PASSWORD '*5FD2B7524254B7F81B32873B1EA6D681503A5CA9' |
+---------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
これで、必要な権限をアカウントに追加できます。 必要です UPDATE
, INSERT
, SELECT
、 と DELETE
日常使用の特権:
GRANT SELECT,DELETE,INSERT,UPDATE ON wordpress.* TO 'wordpressuser'@'web_server_ip';
もう一度確認すると、きめ細かい権限が設定されていることがわかります。
MySQLに特権テーブルを再読み込みして変更を実装するように指示するには、次のように入力します。
FLUSH PRIVILEGES;
その後、MySQLを再度終了します。
exit
結論
フォローしている場合は、リモートデータベースがアプリケーションと通信する方法を十分に理解しているはずです。 WordPress固有の手順をいくつか説明しましたが、一般的な考え方、特にMySQLの構成とユーザー権限に関連する手順は、ほとんどのリモートMySQLの状況に適用できます。