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.phpwp-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_FAILUREStrueに設定することを強く推奨します。Redisがダウンした際にWordPressがPHPの内部キャッシュにフォールバックするため、サイトが完全にダウンすることを防げます
  • maxmemory-policynoeviction(デフォルト)に設定するとメモリが満杯になったとき新しいキャッシュが書き込めなくなりWordPressがエラーを返します。allkeys-lruにしてメモリが満杯になったら古いキャッシュから削除するよう設定してください
  • Redisを複数のWordPressサイトで共有する場合はWP_REDIS_PREFIXWP_REDIS_DATABASEで名前空間を分離してください

まとめ

WordPress Redisエラーの解決は①redis-cli pingでサービス確認・PHP Redisクラスで接続テスト・object-cache.phpの存在とwp_using_ext_object_cache()確認、②wp-config.phpWP_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フックで検知してメール通知の手順で解決します。

お気軽にご相談ください

お見積りへ お問い合わせへ