WordPressのW3 Total CacheプラグインにRedisを使う

技術メモ

はじめに

自宅で立てている WordPress のサーバ(つまり今ブラウザに表示されているこのサイトの事だ!)がどうにもクソ遅いので、少しでもマシになるかと考え、W3 Total Cacheプラグイン[公式] で Redis を使ってみようと思い立った。

W3 Totac Cacheプラグインは memcached[Wikipedia] にも対応している。それでも今回 Redis を選んだのは、仕事でちょうど AWS の Amazon ElastiCache[公式] を使っていたからである。単なるタイミングの問題だ。

日本語のサイトだと Docker + W3 Total Cache + Redis の組み合わせの解説をしているサイトが皆無に等しかったので、環境構築の際に少し苦労した。そもそも W3 Total Cache 自体について、日本語ではまともな解説サイトが少ないように感じた。誰かの何かの役に立てばと思いこうしてメモを残しておく。

現在の構成

現在の構成は以下の箇条書きの通りとなっている。

  • Windows11 Pro
  • nginx/1.24.0(on Windows11)
  • Docker Desktop(on Windows11)
  • WordPress 6.5.3(on Docker)
  • MySQL 5.7(on Docker)

リバースプロキシの nginx は理由があって Windows 上に置いている。理由は今回は無関係なので割愛。

MySQL 5.7 は WordPress を導入した際のものだ。今知ったがサポート期限が切れているようである。

Docker に Redis サーバを立てる

  redis:
    image: "redis:latest"
    container_name: redis_latest
    restart: always
    ports:
      - "6379:6379"
    volumes:
      - "./redis_data:/data"

docker-compose.yml に上記の設定を追加する。ポートは他と被っていないので 6379 のまま変えていない。

追加後に PowerShell から docker-compose up を実行すると、redis のイメージが pull された後、Docker Desktop で redis_latest コンテナが立ち上がってくる。当たり前だがここまでは特に問題は起きない。

redis-cli

# bash
root@63a3e28472c8:/data# redis-cli
127.0.0.1:6379> keys *
(empty array)

Docker Desktop から、docker-compose up で生成された redis_latest コンテナに Terminal から接続して redis-cli[公式] を叩いてみる。redis の公式イメージだけあって redis-cli が同梱されていたので助かる。

W3 Total Cache から redis が見えない

完全に勝ったな、と思い、意気揚々と WordPress の管理画面を開く。

「パフォーマンス」→「一般設定」をクリックして「ページキャッシュ」→「ページキャッシュ方法」のプルダウンを確認する……が、ダメッ!Redis はグレーのまま活性化されず!

調べてみると流石にそんな簡単には済まなかった。考えてみると当たり前か。

上記を自動翻訳して読んでみると「PHPの拡張を入れろ」と書いてる。

apt install redis-server → 失敗

root@39f7e8500226:/# apt install redis-server
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package redis-server

「using the apt-get install redis-server」と書いてあったので何も考えず apt をしてみたが失敗。

phpredis を入れる

phpredis の github のリポジトリに飛んでみるが、いまいちよく分からない。困ったぞ。困りながらルートにある INSTALL.md を自動翻訳して読んでみると、「最新の安定リリースバージョンを取得するには pecl install redis を打て」とある。

指示通り、WordPress のコンテナに Terminal で接続してコマンドを打つ。

pecl install redis

root@39f7e8500226:/# pecl install redis
WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update
downloading redis-6.0.2.tgz ...
Starting to download redis-6.0.2.tgz (365,966 bytes)
..........................................................................done: 365,966 bytes
43 source files, building

(中略)

Build process completed successfully
Installing '/usr/local/lib/php/extensions/no-debug-non-zts-20200930/redis.so'
install ok: channel://pecl.php.net/redis-6.0.2
configuration option "php_ini" is not set to php.ini location
You should add "extension=redis.so" to php.ini

PECL[Wikipedia] がダウンロードからビルドまで全部自動やってくれて、最終的に redis.so を生成してくれた。すげえや。PECL::Package::redis から redis-6.0.2.tgz をダウンロードしてコンパイルから必要なのかとビビってたのが馬鹿みたいだ。

最後に「You should add “extension=redis.so” to php.ini」とある。

find / -name php.ini

root@39f7e8500226:/var/www/html/wp# find / -name php.ini
/var/www/html/wp/php.ini

php.ini を発見した。このままコンソールで更新したかったが、接続している WordPress のコンテナには vim も vi も入っていなかった。素直に Windows 側で修正する。

追記後の php.ini

upload_max_filesize = 128M
post_max_size = 128M
memory_limit = 2048M
extension=redis.so

元から存在した php.ini に「extension=redis.so」を追記して、WordPress のコンテナを restart する。

W3 Total Cache が Redis を認識した

はい勝ち確。早速使ってみよう。

redis の IP アドレスを指定する

W3 Total Cache のページキャッシュに Redis を設定した後、Docker Desktop の WordPress コンテナのログを眺めていたのだが、何故か access refuse が出力されまくっている事に気付いた。あれ……?

上記サイトを見ると、まだ追加の設定が必要なようだ。

Redis hostname:port / IP:port:

redis の接続先としてループバックアドレスが指定されている。

「パフォーマンス」→「ページキャッシュ」→「詳細」を見ると、redis の接続先を設定する箇所があった。なお、この設定部分は「ページキャッシュ方法」で redis を選んだ後でないと表示されないようだ。

WordPress と同じサーバに redis をインストールしたのであればこれで問題ないが、今回は Docker で別の場所に redis サーバを立てている。そのため、明示的に IP アドレスを指定しないとだめだ。

「テスト」ボタンを押下すると、当たり前だが「テスト失敗。」と表示された。

明示的に IP アドレスを指定する

version: '3'

services:
  db:
    image: mysql:5.7
    container_name: mysql_5.7
# (中略)
    networks:
      wordpress_net:
        ipv4_address: 172.16.0.2
# (中略)
  redis:
    image: "redis:latest"
    container_name: redis_latest
    restart: always
    ports:
      - "6379:6379"
    volumes:
      - "./redis_data:/data"
    networks:
      wordpress_net:
        ipv4_address: 172.16.0.3
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    container_name: wordpress_latest
# (中略)
    networks:
      wordpress_net:
        ipv4_address: 172.16.0.4
# (中略)
networks:
  wordpress_net:
    driver: bridge
    ipam:
     driver: default
     config:
       - subnet: 172.16.0.0/24

中略が多いが、更新後の docker-compose.yml は上記の通り。マーカー箇所を追加。

WordPress から MySQL への接続は、WordPress のコンテナに環境変数 WORDPRESS_DB_HOST を与えて解決しているが、W3 Total Cache で上手く行くか不明だったので、ベタで IP アドレスを指定する事にした。

上記サイトを参考にして、明示的に IP アドレス v4 を設定する。

Redis hostname:port / IP:port:

redis の IP アドレスを指定して再テスト。テスト合格!

redis-cli

root@ab328fe2ea88:/data# redis-cli
127.0.0.1:6379> info keyspace
# Keyspace
db0:keys=27,expires=24,avg_ttl=1809800
db1:keys=1,expires=0,avg_ttl=0

redis 側のコンテナに接続して「info keyspace」を叩くと、無事にキャッシュが作られている事が確認できた。ヤッタネ!

タイトルとURLをコピーしました