Redis和Ruby on Rails的配合
操作系统: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 > Preferences > Privacy > Cookies and website data:
如果查看,可以看到保存了127.0.0.1网站的数据。(在本地开发时)
只要只是开发的话,那就好。但是在实际环境中,使用用户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服务器未启动,无法连接。
为了学习的目的,我想尝试使用Docker容器来设置Redis服务器。
关于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上进行拉取。
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
在NAMES中打印了由name指定的名称。(容器的名称)
确认能够连接。
redis-cli
127.0.0.1:6379>
输入“exit”并结束。
因为已经准备好了Redis服务器,所以需要将Rails的会话管理方式改为使用Redis。
为了使用redis,我们需要在Gemfile中添加redis-rails。
gem ‘redis-rails’
进行安装。
bundle install
执行Rails会话配置。
将会话信息存储到Redis中并写入config/initializers/session_store.rb。
如果没有任何设置,则需要创建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网站的信息。
在本地开发中,如果要做这个,每次都需要启动redis容器,否则会出错导致程序崩溃,因此我打算另外进行一些自动化处理。