💽

Docker コンテナを使った Redis による Laravel のSession 管理

2024/01/26に公開

PHPコンテナの設定は省略します。
Redisへ接続するに当たって、特別な設定はありません。

※ PhpRedis を 使う場合
https://readouble.com/laravel/10.x/ja/redis.html

PHP拡張機能が必要なので、PHP側のDockerfileでインストールしておくなど準備しておきましょう
今回の記事では predis での接続方法とします。

環境

  • Laravel 10
  • PHP 8.2
  • Redis 7.2

Redis側 の 設定

Dockerfile

FROM redis:7.2

COPY redis.conf /usr/local/etc/redis/redis.conf
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]

redis.conf (Dockerfile と 同ディレクトリに配置)

bind 0.0.0.0 # Dockerコンテナ内での接続を許可

protected-mode yes

port 6379

tcp-backlog 511

timeout 0

tcp-keepalive 300

daemonize no

pidfile /var/run/redis_6379.pid

loglevel notice
logfile ""

databases 16

always-show-logo no

set-proc-title yes

proc-title-template "{title} {listen-addr} {server-mode}"

locale-collate ""

stop-writes-on-bgsave-error yes

rdbcompression yes
rdbchecksum yes

dbfilename dump.rdb

rdb-del-sync-files no

dir ./

replica-serve-stale-data yes
replica-read-only yes

repl-diskless-sync yes
repl-diskless-sync-delay 5
repl-diskless-sync-max-replicas 0
repl-diskless-load disabled
repl-disable-tcp-nodelay no

replica-priority 100

acllog-max-len 128

requirepass foobared # 任意のパスワード

maxmemory 100M

lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no

lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no

oom-score-adj no
oom-score-adj-values 0 200 800

disable-thp yes

appendonly no
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
appendfsync everysec

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

aof-load-truncated yes
aof-use-rdb-preamble yes
aof-timestamp-enabled no

slowlog-log-slower-than 10000
slowlog-max-len 128

latency-monitor-threshold 0

notify-keyspace-events ""

hash-max-listpack-entries 512
hash-max-listpack-value 64

list-max-listpack-size -2
list-compress-depth 0

set-max-intset-entries 512
set-max-listpack-entries 128
set-max-listpack-value 64

zset-max-listpack-entries 128
zset-max-listpack-value 64

hll-sparse-max-bytes 3000

stream-node-max-bytes 4096
stream-node-max-entries 100

activerehashing yes

client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

hz 10

dynamic-hz yes

aof-rewrite-incremental-fsync yes

rdb-save-incremental-fsync yes

jemalloc-bg-thread yes

Laravel側の設定

predis の インストール

composer require predis/predis

.env

REDIS_HOST=redis
REDIS_PASSWORD=foobared # redis.conf で設定したパスワード
REDIS_PORT=6379
REDIS_CLIENT=predis

config/database.php

初期値から変更なしです。
参考までに 'redis' 部分のみ記載しておきます。

<?php

declare(strict_types=1);

use Illuminate\Support\Str;

return [
// ... 省略

    'redis' => [

        'client' => env('REDIS_CLIENT', 'phpredis'),

        'options' => [
            'cluster' => env('REDIS_CLUSTER', 'redis'),
            'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_') . '_database_'),
        ],

        'default' => [
            'url' => env('REDIS_URL'),
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'username' => env('REDIS_USERNAME'),
            'password' => env('REDIS_PASSWORD'),
            'port' => env('REDIS_PORT', '6379'),
            'database' => env('REDIS_DB', '0'),
        ],

        'cache' => [
            'url' => env('REDIS_URL'),
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'username' => env('REDIS_USERNAME'),
            'password' => env('REDIS_PASSWORD'),
            'port' => env('REDIS_PORT', '6379'),
            'database' => env('REDIS_CACHE_DB', '1'),
        ],

    ],

];

あとはコンテナを立ち上げて、Laravelの画面が正常表示されれば設定完了です。

まとめ

躓いた点は、redis.conf の設定値です。

  • bind 0.0.0.0
  • requirepass foobared

サンプルのconfファイルから上記部分を変更しました。
protected-modeno にすれば、パスワード接続は不要にできそうです。

接続有無と関係ありませんが、maxmemory 100M も追記しました。

Discussion