CentOS8にRedisをインストールする

RedisはKey-Value型のデータベースです。

Key-Value型はその名の通りKey(検索するのに使う情報)とValue(実際に必要な情報の中身)で構成されます。

KeyとValueは1対1ですが、実際にはValueに区切り文字を使って、複数の情報を格納したりします。

以下はKey-Value型のデータベースに天気を格納した例です。

9/20晴れ; 32℃; 24℃; 20%
9/21曇り; 30℃; 23℃; 40%
9/22雨; 28℃; 23℃; 80%
Key-Value型のValueには区切り文字で複数の情報が格納できる

この場合、ソフトウェアでKeyである日付を指定すると、Valueにある「;」で区切られた4つの情報「天気」「最高気温」「最低気温」「降水確率」を得ることが出来ます。

あとは、ソフトウェアの側で「;」で分解した情報を利用するという案配です。

なお、Key-Value型のデータベースではValueの値を検索するのは苦手です。上記の例では「最高気温が30℃以上の日」といった検索はかなり難しいです。

前回インストールしたMariaDBのようなリレーショナルデータベースであれば「日付」「天気」「最高気温」「最低気温」「降水確率」と5列作ればそれぞれで条件を付けて検索出来て便利なのに、なぜわざわざKey-Value型のデータベースを使うのでしょうか。

これはKey-Value型の構造が単純で高速化させやすいからです。

また、Redisも含めたKey-Value型のデータベースの多くはディスクドライブ(HDDやSSD)ではなく、メモリ上にデータを保持しているので、なお早いです。

実際に天気のデータを高速に書き換えたり読み出す必要はあまりないでしょうから天気のデータをKey-Value型にする意義は薄いです。

目まぐるしく書き換える必要のある情報、例えば3Dゲームでのキャラクターの座標を扱ったりする際には使えそうですね。

実際にはWebサービスでのキャッシュ(一度読み込まれた情報を高速に呼び出すために保持しておくもの)として使われる事が多く、PHPを使ったサービスの高速化でよく使われます。勿論、Wordpressも例外ではありません。

ちなみに、Key-Value型データベースのようなリレーショナルデータベース以外のデータベースをまとめてNoSQLと言います。SQLではないということです。どれだけデータベースと言えばリレーショナルデータベースとSQLというのが浸透しているかが表れていますね。

この記事で行うこと

  1. Redisのインストール
  2. 基本的な設定

1. Redisのインストール

RedisはCentOS8公式のAppStreamリポジトリからもインストールできますが、より新しいバージョンがRemi’s リポジトリにあるのでこちらをインストールしたいと思います。

Remi’s リポジトリを未だインストールしていない場合はこれをインストールします。

※ダウンロードURLが変わっている可能性もあるので、リポジトリの名称を検索するなどして公式ページから最新のURLを確認するようにしてください。

[root@localhost ~]# dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm

次に、Redisのモジュールのバージョンを確認して、最新バージョンをインストールします。

[root@localhost ~]# dnf module list redis

CentOS-8 - AppStream
Name                 Stream                  Profiles                  Summary
redis                5 [d]                   common [d]                Redis persistent key-value database

Remi's Modular repository for Enterprise Linux 8 - x86_64
Name                 Stream                  Profiles                  Summary
redis                remi-5.0                common [d]                Redis persistent key-value database
redis                remi-6.0                common [d]                Redis persistent key-value database

ここでは、6.0が最新なので、これをインストールします。


[root@localhost ~]# dnf module install redis:remi-6.0/common

2. 基本的な設定

Redisの設定ファイルは以下にあります。(インストールしたバージョン・インストール元リポジトリによっては別の場所にある可能性があります)

/etc/redis.conf

なお、 /etc/redis-sentinel.conf というファイルもありますが、これは複数のサーバでRedisを冗長化して可用性を高めるためのものです。自宅サーバで使う事はほぼ無いでしょう。

初期設定では、Redisは127.0.0.1:6379でアクセスすることが出来ます。これはサーバ自身の6379番ポートにTCPで接続するという事です。

php-fpmの説明の時にもお話ししましたが、TCP接続は遅いのでより早いUNIXドメインソケットで接続する設定にしたいと思います。

設定変更の前に、忘れずにバックアップを取るようにしてください。

編集する箇所は以下です。「-」は削除する行(変更前)、「+」は追加する行(変更後)となります。

- # unixsocket /tmp/redis.sock
+ unixsocket /run/redis/redis.sock
- # unixsocketperm 700
+ unixsocketperm 660

unixsocket の設定は /tmp/redis.sock のままでも構いませんが、今回はphp-fpmに合わせてみました。

また、unixsocketperm はコメントアウトするだけでなく、数字も660に変えるようにしましょう。

数字の意味は下ページの「ファイルのパーミッション」に記載されています。

設定を変更し終えたら、Redisの起動と有効化を行います。

これはSSHなどと同じく systemctl を使って行います。

[root@localhost ~]# systemctl enable redis --now

コマンドについては以下のページで解説されています。

さて、これでRedisが使えるようになったと言いたいところですが、このままではUNIXドメインソケットでnginxからRedisを使う事は出来ません。

以下はRedisのUNIXドメインソケットを確認したものです。

[root@localhost ~]# ls -l /run/redis/redis.sock
srw-rw----. 1 redis redis 0  9月 14 20:02 /run/redis/redis.sock

ファイルの所有者・グループが redis となっていて、更に読み書きできるのはファイルの所有者・グループだけとなっています。

nginxのユーザ・グループは nginx なので、これではnginxがRedisにアクセスすることは出来ません。

もちろん、先ほど設定した unixsocketperm666 などに変えれば誰でもアクセス出来るようになりますが、これはセキュリティ上あまり好ましくありません。

また、上記のファイルの所有者を nginx に変えると、今度はRedis自身がアクセスできなくなり本末転倒です。

なので、ここではnginxのユーザ nginxredis グループを付与することでnginxもRedisも上記のファイルにアクセス出来るようにします。

[root@localhost ~]# groupmems --add nginx --group redis
  • groupmems : グループに所属しているユーザを追加・削除・参照するためのコマンドです。
  • --add nginx : --add はユーザ追加のためのオプションです。他に --delete--list もあり、それぞれ削除・参照を表しています。続けて、対象のユーザ名を記述します。今回はnginxを指定しています。
  • --group redis : 対象となるグループを指定します。指定しない場合は、実行したユーザのメインとなるグループに追加されます。仮にrootで実行した場合 root グループに入ってしまいます。

次に nginxredis グループに入ったかを確認します。

[root@localhost ~]# groupmems --list --group redis
nginx
  • --list : 前述の通り、グループ内のユーザを参照する際のオプションです。このオプションではユーザ名は指定しません。

これで、 redis グループに nginx が入っているのを確認できます。ちなみに redis 自身は当然入っているのでわざわざ表示されません。

また、以下のコマンドで逆に nginx が入っているグループを参照できます。

[root@localhost ~]# groups nginx
nginx : nginx redis
  • groups : ユーザが入っているグループの一覧を確認できます。
  • nginx : groups コマンドに続けて対象となるユーザ名を指定します。指定しない場合は実行したユーザが入っているグループの一覧を確認できます。

最後に、php-fpmがRedisを使うにはSELinuxの設定を変更する必要があります。

[root@note ~]# setsebool -P daemons_enable_cluster_mode 1

Redisはクラスターモード(色々なサーバに分散して処理を行うモード)設定があるため、これに接続するためにはphp-fpmもクラスターモードを扱えるように設定する必要がある……んだとおもいます。

まとめ

今回はRedisのインストールとWebアプリで使えるようにするためにnginxからUNIXドメインソケットを使って接続する準備を行いました。

実際の設定は各Webアプリ内の設定で行うため、この記事では触れません。

大抵のWebアプリはRedisが無いならないで動くのですが、高速化の為に使う事が多いです。

必要になった際にインストールすると良いかと思います。

2020/10/15 SELinuxの設定について追記。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です