今回はインメモリデータベースのRedisのインストール手順を学習していきます。Redisサーバ用とRedisクライアントサーバ用にEC2インスタンスを2台使用して、TLSで通信できるところまで確認していきます。
AWS EC2インスタンスの作成ができてSSH接続できている前提で解説をしていきます。学習がまだの方は「EC2インスタンスの作成手順」と「WindowsからSSH接続を行う方法」の学習を先に済ませてからこちらの記事に戻ってきてください。
Redisサーバのインストール
このセクションではEC2インスタンスにRedisサーバのインストールと設定ファイルの変更をしていきます。
Redisサーバのセキュリティーグループの設定
RedisサーバのEC2インスタンスには以下の2つのセキュリティーグループを設定する必要があります。
- ssh
- redis
セキュリティーグループの詳細については以下の記事を参考に作成してEC2インスタンスに設定してください。

Resisのインストール
【Redisパッケージの確認】
dnf list | grep redis
dnf info redis6
【Redisのインストール】
sudo dnf install redis6 -y
【インストールの確認】
redis6-server --version
【Redisサーバの起動】
sudo systemctl start redis6
【Redisサーバの起動確認】
systemctl status redis6
systemdコマンドの詳細については「Linux | systemdのサービス管理とユニットファイルの設定」を参照して下さい。
Redis CLI(基本的なコマンドの確認)
ここでEC2インスタンス内のローカルからRedisサーバにアクセスしてみましょう。
【Redis CLIを起動】
redis6-cli
【反応の確認】
127.0.0.1:6379> ping
-> PONGが表示されればOK
【キーと値のインサート】
127.0.0.1:6379> set test-key Hello
OK
【値の読み出し】
127.0.0.1:6379> get test-key
"Hello"
【すべてのキーの表示】
127.0.0.1:6379> KEYS *
1) "test-key"
【Redis CLIの終了】
exit または Ctlr + C
Redisの設定ファイル
Redisの設定ファイルは以下の場所にあります。
/etc/redis6/redis6.conf
外部からのアクセスを受け付けるために以下の変更をします。
sudo vi /etc/redis6/redis6.conf
-
#bind 127.0.0.1 -::1
bind 0.0.0.0
-
保存後はRedisを再起動します。
sudo systemctl restart redis6
Redisクライアントサーバの設定
このセクションでは上記のRedisサーバにアクセスするEC2インスタンスのサーバの設定をしていきます。このクライアントサーバにはApacheとPHPをインストールして、ブラウザ上にRedisから取得したデータを表示してみます。
セキュリティーグループの設定
RedisクライアントサーバのEC2インスタンスには以下の2つのセキュリティーグループを設定する必要があります。
- ssh
- www
前述のRedisサーバ同様、セキュリティーグループの設定の詳細は以下の記事を参考にして下さい。

Apacheのインストール
まずはWebサーバをインストールします。以下の記事を参考にApacheをインストールしてください。ここではPHPからRedisサーバへのアクセスにフォーカスするのでApacheのHTTPS化は任意です。

PHPのインストール
次にPHPをインストールします。以下の記事を参考にPHPをインストールしてください。

Gitのインストール
次項でRedisクライアントの共有ライブラリのソースコードをGitHubから取得するので、先にGitをインストールしておきます。
sudo dnf install git -y
Redisクライアント共有ライブラリのインストール
以下の手順に従って、ソースからphpredisの共有ライブラリを作成します。
【ホームディレクトリに移動】
cd /home/ec2-user
【phpredisのコンパイルに必須となるファイルを先にインストール】
sudo dnf install php8.3-devel -y
【phpredisのソースコードを取得】
git clone https://github.com/phpredis/phpredis.git
【ダウンロードしたphpredisのディレクトリに移動】
cd phpredis
【ビルド環境をセットアップ】
sudo phpize
【configureの実行】
sudo ./configure
【ビルドとインストール】
sudo make && sudo make install
【インストール後】
以下の場所に redis.so ファイルが作成されます。
/home/ec2-user/phpredis/modules/redis.so
また、インストール後には以下が表示されるので redis.so ファイルが以下の場所にインストールされたのが確認できます。
Installing shared extensions: /usr/lib64/php8.3/modules/
PHPの拡張機能用ディレクトリにもマッチしています
php -i | grep extension_dir
-
extension_dir => /usr/lib64/php8.3/modules => /usr/lib64/php8.3/modules
-
ll /usr/lib64/php8.3/modules/ | grep redis
-> redis.so
php.iniファイルの設定
PHPでコンパイルしたredis.soを使えるようにするため、php.iniファイルに設定を追記します。
【ディレクトリの移動】
cd /etc
【php.iniファイルの編集】
sudo vi php.ini
> 以下のあたりに extension=redis を追記します。
-
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
extension=redis
-
【PHPを再起動】
sudo systemctl restart php-fpm
参考URL:https://github.com/phpredis/phpredis/blob/develop/INSTALL.md
Composerをインストール
次項でComposerを使用してphpredisを
sudo dnf install composer -y
composer --version
ComposerパッケージのPHPRedisをインストール
【パーミッションの変更】
sudo chown ec2-user:ec2-user /var/www
【ディレクトリの移動】
cd /var/www
【ディレクトリ作成】
mkdir phpredis
【作成したディレクトリに移動】
cd phpredis
【redisパッケージをインストール】
composer require phpredis/phpredis
RedisクライアントWebサーバからRedisサーバに接続
以下のPHPコードを作成し、ブラウザからアクセスしてみてください。
sudo vi /var/www/html/index.php
<?php
error_reporting(E_ERROR);
ini_set('display_errors', 1);
require '../phpredis/vendor/autoload.php';
$redis = new Redis();
$redis->connect('RedisサーバIP又はドメイン', 6379);
$redis->set('test-key', 'Hello World!');
$value = $redis->get('test-key');
echo "Stored value: " . $value;
「Stored value: Hello World!」と表示されたらRedisサーバへのアクセスは成功です。
RedisサーバとRedisクライアントサーバ間でmTLS(Mutual TLS: 双方向 TLS)を試す
プライベートCAを作成してRedisサーバとクライアント双方向でTLS通信ができるように設定します。
Redisサーバ側の設定
Redisサーバをプライベート認証局(CA)として認証局用のプライベートキーと自己証明書を発行した後、このRedisサーバ用のプライベートキーと証明書、そしてRedisクライアントサーバ用のプライベートキーと証明書をそれぞれ作成していきます。
プライベート認証局の作成
【作業ディレクトリを作成して移動】
sudo mkdir /usr/local/etc/openssl
cd /usr/local/etc/openssl
【認証局用のプライベートキーを作成】
sudo openssl genpkey -algorithm RSA -out ca.key -aes256 -pkeyopt rsa_keygen_bits:4096
> この認証局用のプライベートキーにパスワードを設定します。
【認証局用の証明書を作成】
sudo openssl req -x509 -new -nodes -key ca.key -sha256 -days 365 -out ca.crt -subj "/C=US/CN=Root-CA"
> 認証局のキー使用時にはパスワードが聞かれます。上記で設定したパスワードを入力します。
Redisサーバ用の証明書を発行
前項で作成した認証局の証明書とプライベートキーを使用してRedisサーバ用の証明書を発行します。
【Redisサーバ用のプライベートキーを作成】
sudo openssl genpkey -algorithm RSA -out server-redis-rsa.key -pkeyopt rsa_keygen_bits:4096
【Redisサーバ用の証明書への署名リクエスト(CSR:Certificate Signing Request)】
sudo openssl req -new -key server-redis-rsa.key -out server-redis-rsa.csr -subj "/C=US/CN=Redisサーバ用ドメイン名"
【証明書の発行】
sudo openssl x509 -req -in server-redis-rsa.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server-redis-rsa.crt -days 365
次に、Redisクライアントサーバ用の証明書を発行します。
【Redisクライアントサーバ用のプライベートキーを作成】
sudo openssl genpkey -algorithm RSA -out client-redis-rsa.key -pkeyopt rsa_keygen_bits:4096
【Redisサーバ用の証明書への署名リクエスト】
sudo openssl req -new -key client-redis-rsa.key -out client-redis-rsa.csr -subj "/C=US/CN=Redisクライアントサーバ用ドメイン名"
【証明書の発行】
sudo openssl x509 -req -in client-redis-rsa.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client-redis-rsa.crt -days 365
最後にディレクトリとファイルのパーミッションの変更を行います。
sudo chown -R redis6:redis6 /usr/local/etc/openssl
Redisサーバの設定ファイルの変更
Redisサーバの設定ファイルを変更してTLSを有効にします。
sudo vi /etc/redis6/redis6.conf
#protected-mode yes
protected-mode no
#port 6379
port 0
# tls-port 6379
tls-port 6379
# tls-cert-file redis.crt
# tls-key-file redis.key
tls-cert-file /usr/local/etc/openssl/server-redis-rsa.crt
tls-key-file /usr/local/etc/openssl/server-redis-rsa.key
# tls-ca-cert-file ca.crt
tls-ca-cert-file /usr/local/etc/openssl/ca.crt
# tls-auth-clients no
tls-auth-clients yes
# tls-protocols "TLSv1.2 TLSv1.3"
tls-protocols "TLSv1.2 TLSv1.3"
変更が終わったらRedisを再起動します。
sudo systemctl restart redis6
Redisの再起動に失敗する場合は上記で設定したopensslディレクトリのパーミッションを確認して下さい。
Redisクライアント側の設定
上記Redisサーバ側で作成した、Redisクライアントサーバ用のプライベートキーと証明書を、ディレクトリを作成して同じ場所に配置します。
【作業ディレクトリを作成して移動】
mkdir /usr/local/etc/openssl
cd /usr/local/etc/openssl
証明書ディレクトリのパーミッションを変更します。
sudo chown -R apache:apache /usr/local/etc/openssl
index.phpの変更
sudo vi /var/www/html/index.php
<?php
error_reporting(E_ERROR);
ini_set('display_errors', 1);
require '../phpredis/vendor/autoload.php';
$redis = new Redis([
'host' => 'tls://Redisサーバのドメイン名',
'port' => 6379,
'connectTimeout' => 2.5,
// 'auth' => ['phpredis', 'phpredis'],
'database' => 0,
'ssl' => [
'local_cert' => '/usr/local/etc/openssl/client-redis-rsa.crt',
'local_pk' => '/usr/local/etc/openssl/client-redis-rsa.key',
'cafile' => '/usr/local/etc/openssl/ca.crt',
// 'verify_peer' => false,
'verify_peer' => true,
'verify_peer_name' => true,
'allow_self_signed' => true
],
'backoff' => [
'algorithm' => Redis::BACKOFF_ALGORITHM_DECORRELATED_JITTER,
'base' => 500,
'cap' => 750,
],
]);
$redis->set('test-key', 'Hello World!');
$value = $redis->get('test-key');
echo "Stored value: " . $value;
「Stored value: Hello World!」と表示されたら成功です。
まとめ
今回の記事ではRedisサーバとRedisクライアントサーバの設定手順を学習しました。redis.soの共有ライブラリのコンパイルとComposerのphpredisパッケージのインストールをしましたね。最初はTLSなしでクライアントサーバからRedisに接続できることを確認しました。認証局を立ててRedisサーバとクライアントサーバそれぞれに証明書の発行する手順を学びました。最後には双方向のTLS通信ができました。設定項目が多いのでもらがないように今後も注意して作業しましょう。