環境
macOS Mojava 10.14.4
Docker 18.09.2
Rails 5.2.2
ruby 2.6.1p33
Webアプリケーションのセッション管理の方法はいくつかあるのですが、ruby on railsは特に指定しなければローカルのCookieにセッションが保存されます。
この状態でrailsを動作させるとCookieが作成されています。
Safariだと
Safari > 環境設定 > プライバシー > CookieとWebサイトのデータ:
を確認すると127.0.0.1のWebサイトのデータが保存されています。(ローカル開発時)
開発だけであればいいんですが、実際の環境でユーザーCookieでセッション情報を管理するのは問題があるのでredisで管理するようにしました。
redisをインストール
$brew install redis
・・・インストールログ・・・
==> Summary
🍺 /usr/local/Cellar/redis/5.0.4: 13 files, 3.1MB
なんかログにビールが出ました。多分成功の証です。
$redis-cli
Could not connect to Redis at 127.0.0.1:6379: Connection refused
インストールできていました。
redisサーバーが起動してないので接続できていません。
せっかくなんで学習のため、redisサーバーはDockerコンテナを使ってみようかと思います。
Dockerのインストールはこちらを参考にしました。
https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81
redisのDockerコンテナーの起動
停止したら削除するために--rmをつけます。
-pでコンテナのポートを公開します。(ホストのポート6379をコンテナのポート6379に接続)
$docker container run --name local-redis -d --rm -p 6379:6379 redis
Unable to find image 'redis:latest' locally
latest: Pulling from library/redis
27833a3ba0a5: Pull complete
cde8019a4b43: Pull complete
97a473b37fb2: Pull complete
c6fe0dfbb7e3: Pull complete
39c8f5ba1240: Pull complete
cfbdd870cf75: Pull complete
Digest: sha256:000339fb57e0ddf2d48d72f3341e47a8ca3b1beae9bdcb25a96323095b72a79b
Status: Downloaded newer image for redis:latest
cbc1a37039dab71ce996cecdae2cd7cbdbbb78cd76e281ff5837eac3113dd403
dockerイメージがローカルにない場合はDocker Hubから自動でPullしてくれます。
https://hub.docker.com
redisのコンテナが動作しているかの確認
$docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cbc1a37039da redis "docker-entrypoint.s…" 51 seconds ago Up 50 seconds 0.0.0.0:6379->6379/tcp local-redis
--nameで指定した名前がNAMESに出力されています。(コンテナの名称)
接続できることを確認します。
redis-cli
127.0.0.1:6379>
exitを入力し、終了
redisサーバーが用意できたので、railsのセッションをredisで管理するように変更します。
redisを使うためGemfileにredis-railsを追加します。
gem ‘redis-rails’
インストールを行います。
bundle install
railsのセッションの設定を行います。
config/initializers/session_store.rbにredisにセッション情報を格納することを記載します。
特に何も設定していない場合はsession_store.rbは存在しないので作成します。
Rails.application.config.session_store :redis_store, {
servers: [
{
host: ENV['REDIS_HOST'] || 'localhost',
port: ENV['REDIS_PORT'] || 6379,
db: 0,
namespace: 'session'
}
],
expire_after: 10.minutes
}
これでセッション情報はredisに記録されるようになります。
実際にredisコンテナを停止させてからrailsを起動するとredisに接続できないことによるエラーが発生します。
SafariでCookieを確認しても127.0.0.1のWebサイトの情報はなくなります。
ローカル開発でこれをやると、毎回redisコンテナを起動させないとエラーで落ちてしまうのでなにか自動化は別途しようと思います。