要約
Laravel(v11/v12)で408タイムアウトする原因は
config/database.phpの'scheme'が未指定だった
環境:SESSION_DRIVER=redis(Valkey/Redis)
現象
Laravel 12で .env
に以下のように設定して、Redis(正確にはAWSの Valkey Serverless)をセッション管理に使おうとしたところ、リクエストがタイムアウト(408) する問題が発生。
SESSION_DRIVER=redis
REDIS_CLIENT=phpredis
REDIS_HOST=valkey1-xxxx.cache.amazonaws.com
REDIS_PORT=6379
REDIS_USERNAME=my-user
REDIS_PASSWORD=secret
REDIS_TLS=true
REDIS_SCHEME=tls
REDIS_DB=0
REDIS_CACHE_DB=1
SESSION_CONNECTION=default
tinkerではcacheをRedisに配置できたとしても、ブラウザからアクセスするとNginxが408を返すだけでLaravelのログにも何も出ない。
原因:config/database.php の 'scheme' => 'tls' を default側に設定していなかった
// これだとSESSION_DRIVER=redisが動かない
'default' => [
'host' => env('REDIS_HOST'),
'username' => env('REDIS_USERNAME'),
'password' => env('REDIS_PASSWORD'),
'port' => env('REDIS_PORT'),
'database' => env('REDIS_DB'),
// ← 'scheme' がないとTLSで接続できない
],
→ Laravelの SESSION_DRIVER=redis は redis.default を使うため、ここに scheme => 'tls' を入れないと Laravel 12 では Redisに接続できず、無限リトライ→タイムアウトになります。
正しい設定例
'redis' => [
'client' => env('REDIS_CLIENT', 'phpredis'),
'default' => [
'host' => env('REDIS_HOST'),
'username' => env('REDIS_USERNAME'),
'password' => env('REDIS_PASSWORD'),
'port' => env('REDIS_PORT'),
'database' => env('REDIS_DB'),
'scheme' => 'tls', // ← これが必須!忘れてた
],
'cache' => [
'host' => env('REDIS_HOST'),
'username' => env('REDIS_USERNAME'),
'password' => env('REDIS_PASSWORD'),
'port' => env('REDIS_PORT'),
'database' => env('REDIS_CACHE_DB'),
'scheme' => 'tls', // cache側も必須!
],
],
そのほか注意点
- .env に SESSION_CONNECTION=default を入れておくと redis.default を明示的に使ってくれるのでより安全
- Laravel 12からは Redis の接続管理が厳密になっている
- phpredis + TLS 利用時は設定漏れに特に注意
まとめ
Laravelでは、phpredis + TLS構成で Redis に接続する場合、'scheme' => 'tls' の指定が必須です。これを省略すると、セッション取得時にLaravelがハングして応答が返らなくなります。