2026年7月13日
2026年7月13日
WordPressのRedis接続エラーを解決する方法
はじめに
WordPressの管理画面でRedis Object Cacheプラグインのステータスが「接続不可」になっている・wp-config.phpにRedis設定を追加したのにwp_using_ext_object_cache()がfalseを返す・Redisサーバーを再起動するとWordPressがエラーになってサイトが一時的にダウンする・Redis認証(requirepass)を設定した後からRedisに接続できなくなったといった問題は、Redis設定の不備・object-cache.phpの配置忘れ・ファイアウォールによる接続ブロック・Redisのメモリ枯渇が原因です。
症状・原因
redis-cli pingはPONGを返すがWordPressからRedisに接続できない- Redis Object CacheプラグインのStatus画面に
Connection refusedまたはAuthentication failedと表示される - Redisが
maxmemoryに達してメモリポリシーにより全データがフラッシュされた object-cache.phpがwp-content/に配置されているがWP_REDIS_HOST定数が未設定
解決手順
ステップ1:Redis接続状態を診断する
# Redisサービスの状態確認
redis-cli ping # PONG が返れば正常
redis-cli info server | head -10
redis-cli info memory # メモリ使用状況
# WordPressからのRedis接続テスト
wp eval "
// 直接Redisに接続テスト
if (class_exists('Redis')) {
try {
\$redis = new Redis();
\$host = defined('WP_REDIS_HOST') ? WP_REDIS_HOST : '127.0.0.1';
\$port = defined('WP_REDIS_PORT') ? WP_REDIS_PORT : 6379;
\$redis->connect(\$host, \$port, 1.0);
if (defined('WP_REDIS_PASSWORD') && WP_REDIS_PASSWORD) {
\$redis->auth(WP_REDIS_PASSWORD);
}
echo 'Redis connected: ' . \$redis->ping() . PHP_EOL;
echo 'Redis version: ' . \$redis->info('server')['redis_version'] . PHP_EOL;
echo 'Used memory: ' . \$redis->info('memory')['used_memory_human'] . PHP_EOL;
echo 'Max memory: ' . \$redis->info('memory')['maxmemory_human'] . PHP_EOL;
} catch (Exception \$e) {
echo 'Redis error: ' . \$e->getMessage() . PHP_EOL;
}
} else {
echo 'PHP Redis extension not installed' . PHP_EOL;
}
"
# object-cache.phpの存在確認
wp eval "
\$oc = WP_CONTENT_DIR . '/object-cache.php';
echo 'object-cache.php: ' . (file_exists(\$oc) ? 'exists' : 'MISSING') . PHP_EOL;
echo 'Using ext cache: ' . (wp_using_ext_object_cache() ? 'yes (Redis/Memcached)' : 'no (internal)') . PHP_EOL;
"
ステップ2:wp-config.phpのRedis設定を修正する
// wp-config.php: Redis設定(DB_HOSTの前に追加)
// 基本設定
define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);
define('WP_REDIS_DATABASE', 0);
define('WP_REDIS_TIMEOUT', 1); // 接続タイムアウト(秒)
define('WP_REDIS_READ_TIMEOUT', 1); // 読み取りタイムアウト(秒)
// 認証が必要な場合
// define('WP_REDIS_PASSWORD', 'your_redis_password');
// Redisソケット接続(同一サーバーの場合、TCPより高速)
// define('WP_REDIS_SCHEME', 'unix');
// define('WP_REDIS_PATH', '/var/run/redis/redis.sock');
// Redisフォールバック(Redis障害時にサイトをダウンさせない)
define('WP_REDIS_GRACEFUL_FAILURES', true);
define('WP_REDIS_MAXTTL', 86400); // キャッシュの最大TTL(秒)
// サイト固有のキャッシュキー(マルチサイトや複数WPで同一Redisを使う場合)
define('WP_REDIS_PREFIX', 'mysite_');
# Redis Object Cache プラグインでobject-cache.phpを設置
wp plugin install redis-cache --activate
wp redis enable
# 設置後に確認
wp redis status
wp redis info
ステップ3:Redis認証エラーを解決する
# Redis設定ファイルを確認(/etc/redis/redis.conf)
# requirepass を確認
redis-cli CONFIG GET requirepass
redis-cli CONFIG GET bind
# 認証付きで接続
redis-cli -a 'your_password' ping
# WordPressのRedisパスワード設定を確認
wp eval "echo defined('WP_REDIS_PASSWORD') ? 'Password set' : 'No password';"
# ACL(Redis 6.0+)を使う場合
# redis-cli ACL LIST
# redis-cli ACL WHOAMI
// wp-config.php: Redis 6.0+ ACL認証
define('WP_REDIS_USERNAME', 'wp_user'); // ACLユーザー名
define('WP_REDIS_PASSWORD', 'acl_password');
ステップ4:Redisのメモリ設定を最適化する
# Redisのmaxmemory設定を確認・変更
redis-cli CONFIG GET maxmemory
redis-cli CONFIG GET maxmemory-policy
# メモリポリシーを設定(WordPressに最適)
redis-cli CONFIG SET maxmemory 256mb
redis-cli CONFIG SET maxmemory-policy allkeys-lru
# 設定を永続化(/etc/redis/redis.conf)
# maxmemory 256mb
# maxmemory-policy allkeys-lru
# キャッシュの使用状況を確認
redis-cli info keyspace
redis-cli dbsize # キャッシュされているキー数
redis-cli info stats | grep evicted # エビクション数
// functions.php: Redis障害時のフォールバック処理
add_action('redis_object_cache_error', function(Exception $e): void {
// Redis接続エラーをログに記録
error_log('[Redis Error] ' . $e->getMessage());
// 管理者にメール通知(連続エラーの場合のみ)
$error_count = (int) get_transient('redis_error_count') + 1;
set_transient('redis_error_count', $error_count, 300); // 5分間カウント
if ($error_count === 5) {
wp_mail(
get_option('admin_email'),
'Redis接続エラーが発生しています',
"サイト: " . home_url() . "\nエラー: " . $e->getMessage()
);
}
});
ステップ5:Redisキャッシュの効果を測定する
# キャッシュのヒット率を確認
redis-cli info stats | grep -E 'keyspace_hits|keyspace_misses'
# ヒット率 = hits / (hits + misses) × 100
# WordPressのキャッシュテスト
wp eval "
// キャッシュの書き込み・読み込みテスト
\$key = 'redis_test_' . time();
\$value = 'test_value_' . rand(1000, 9999);
wp_cache_set(\$key, \$value, 'test', 60);
\$result = wp_cache_get(\$key, 'test');
echo 'Cache test: ' . (\$result === \$value ? 'PASS' : 'FAIL') . PHP_EOL;
echo 'Using Redis: ' . (wp_using_ext_object_cache() ? 'yes' : 'no') . PHP_EOL;
// キャッシュの統計
\$stats = wp_cache_get_stats();
if (\$stats) {
echo 'Cache hits: ' . (\$stats['hits'] ?? 'N/A') . PHP_EOL;
echo 'Cache misses: ' . (\$stats['misses'] ?? 'N/A') . PHP_EOL;
}
"
# Redisのキー一覧(デバッグ用)
wp eval "
global \$wp_object_cache;
if (method_exists(\$wp_object_cache, 'redis')) {
\$redis = \$wp_object_cache->redis;
\$keys = \$redis->keys('*');
echo 'Total cached keys: ' . count(\$keys) . PHP_EOL;
foreach (array_slice(\$keys, 0, 5) as \$k) {
echo ' ' . \$k . PHP_EOL;
}
}
"
注意事項
WP_REDIS_GRACEFUL_FAILURESをtrueに設定することを強く推奨します。Redisがダウンした際にWordPressがPHPの内部キャッシュにフォールバックするため、サイトが完全にダウンすることを防げますmaxmemory-policyをnoeviction(デフォルト)に設定するとメモリが満杯になったとき新しいキャッシュが書き込めなくなりWordPressがエラーを返します。allkeys-lruにしてメモリが満杯になったら古いキャッシュから削除するよう設定してください- Redisを複数のWordPressサイトで共有する場合は
WP_REDIS_PREFIXかWP_REDIS_DATABASEで名前空間を分離してください
まとめ
WordPress Redisエラーの解決は①redis-cli pingでサービス確認・PHP Redisクラスで接続テスト・object-cache.phpの存在とwp_using_ext_object_cache()確認、②wp-config.phpにWP_REDIS_HOST/PORT/TIMEOUT設定・WP_REDIS_GRACEFUL_FAILURES=trueでフォールバック有効化・wp redis enableでobject-cache.phpを設置、③redis-cli CONFIG GET requirepassで認証設定確認・WP_REDIS_PASSWORD定数を設定・Redis 6.0+のACL認証はWP_REDIS_USERNAMEも設定、④CONFIG SET maxmemory-policy allkeys-lruでエビクションポリシー設定・maxmemoryを256MB以上に設定・redis-cli info keyspaceでヒット率を確認、⑤キャッシュの書き込み読み込みテスト・ヒット率keyspace_hits/(hits+misses)を80%以上に・Redis接続エラーをredis_object_cache_errorフックで検知してメール通知の手順で解決します。