maemaewaterの日記

エンジニア兼ゲーマーの人の日記です。PHP/Python/JavaScript/C#/C++などによるプログラムに関することを主に書いています。

Wordpressを間接的に呼び出して高速化+wp-adminの直接呼び出しを防ぐ

Wordpressを運用するときに直接PHPで処理を行うのではなくキャッシュなどを経由して利用してみようということで試してみました。 サイトのレスポンスも高速になります。検証した環境ではざっくりですがおおよそ33msかかっているものがおおよそ12msまで短縮できました。 今回は、なるべく利用するサービスなどは増やさないでできないかどうかとう点と手軽に実現できる方法をということで探って検証してみました。 OSはLinuxDebian 10を使用しています。HTTPサーバーにはNginxを使用しました(Wordpressを動かすのにはPHP-FPMを使用しています)。

今回は1台のサーバーで、運用する方針で進めていきますが2つのアドレスでアクセスする形式をとります。

  • 1つ目: https://source.domain.com
  • 2つ目: https://www.domain.com

(domain.comなどは環境に合わせて変更。DNSのAレコードには同じIPアドレスを指定します。)

の2つに対してそれぞれ設定をします。

1つ目のhttps://source.domain.comは管理画面などで記事を更新するために用意します。 こちらの方では、PHPを直接動かす方になりますので今回は外部からのアクセスを限定します。 外部からのアクセスの制限でIPアドレスで制限をかける場合には、このサーバーのIPアドレスからのアクセスは許可するように しておきます。 また、PHPの設定などは通常どおり行います。Wordpressに設定するWordPress Address(URL)とSite Address(URL)はこの https://source.domain.comにします。)

2つ目のhttps://www.domain.comの方は一般に公開するためのアドレスです。こちらのほうはNginxで80/443(HTTP/HTTPS)を受けつけて キャッシュした内容を返すのが役割です。キャッシュがない場合にはhttps://source.domain.comにアクセスしてコンテンツを 取得します。

/var/www/dataディレクトリを作成してwww-dataが書き込み出来るように設定します。

cd /var/www
sudo mkdir data
chown www-data data

Nginxの設定のそれぞれの箇所に次を付け足します。

http {
  proxy_cache_path /var/www/data levels=1:2 keys_zone=cache-zone:512m inactive=10m;
  proxy_cache_valid 200 2h;
  proxy_cache_valid any 1m;
}

proxy_cache_pathでキャッシュの保存先とこの保存先の名前(keys_zone)を設定しています。 proxy_cache_validはレスポンスコードごとのキャッシュ時間を設定しています。

server {
   server_name www.domain.com;

  location / {
          limit_except GET { deny all; }
          sub_filter 'source.domain.com' 'www.domain.com';
          sub_filter_once off;
          proxy_pass https://source.domain.com/;
          proxy_cache cache-zone;
  }
}
limit_except:

基本的にGETのリクエストになりますのでGET以外は許可しないようにします。/wp-admin/からログインできないようにします。

sub_filter:

Wordpressは、画像やCSSをパスではなくhttp(s)://~から始まるアドレスで指定しているためこれを書き換える必要ありました。そこで、Nginxのsub_filterを使用しています。

このsub_filterはsudo apt install nginxのように通常のインストールだと含まれておりませんのでnginx-extrasを指定します。

sudo apt install nginx-extras
proxy_pass:

proxy_passで元となるコンテンツにアクセスしています。

proxy_cache:

proxy_cacheにhttp {}のところで記述したキャッシュの保存先を指定しています(cache-zoneという名前です)。

参考にさせていただいたサイト:

nginx.org server-setting.info nginx.org macotasu.hatenablog.jp nginx.org stackoverflow.com qiita.com serverfault.com nginx.org nginx.org