はじめに
自宅で立てている 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 はグレーのまま活性化されず!
- Redis Not available:https://wordpress.org/support/topic/redis-not-available/
調べてみると流石にそんな簡単には済まなかった。考えてみると当たり前か。
上記を自動翻訳して読んでみると「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 が出力されまくっている事に気付いた。あれ……?
- WordPress Optimizations with Redis and W3 Total Cache:
https://kb.mochahost.com/docs/wordpress-optimizations-with-redis-and-w3-total-cache
上記サイトを見ると、まだ追加の設定が必要なようだ。
Redis hostname:port / IP:port:
「パフォーマンス」→「ページキャッシュ」→「詳細」を見ると、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 アドレスを指定する事にした。
- docker-composeで固定IPアドレス指定:https://qiita.com/xanadou/items/3abd3d28214dea526084
上記サイトを参考にして、明示的に 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」を叩くと、無事にキャッシュが作られている事が確認できた。ヤッタネ!