Redisサーバとクライアント(phpredis)のインストールと設定

今回はインメモリデータベースのRedisのインストール手順を学習していきます。Redisサーバ用とRedisクライアントサーバ用にEC2インスタンスを2台使用して、TLSで通信できるところまで確認していきます。

AWS EC2インスタンスの作成ができてSSH接続できている前提で解説をしていきます。学習がまだの方は「EC2インスタンスの作成手順」と「WindowsからSSH接続を行う方法」の学習を先に済ませてからこちらの記事に戻ってきてください。

目次

Redisサーバのインストール

このセクションではEC2インスタンスにRedisサーバのインストールと設定ファイルの変更をしていきます。

Redisサーバのセキュリティーグループの設定

RedisサーバのEC2インスタンスには以下の2つのセキュリティーグループを設定する必要があります。

  • ssh
  • redis

セキュリティーグループの詳細については以下の記事を参考に作成してEC2インスタンスに設定してください。

あわせて読みたい
EC2セキュリティーグループの作成 セキュリティーグループとは、使用するポートのグループを定義したもので、EC2インスタンス(サーバ)に紐づけることで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サーバ同様、セキュリティーグループの設定の詳細は以下の記事を参考にして下さい。

あわせて読みたい
EC2セキュリティーグループの作成 セキュリティーグループとは、使用するポートのグループを定義したもので、EC2インスタンス(サーバ)に紐づけることでEC2インスタンスへのアクセス制限を制限できるよ...

Apacheのインストール

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

あわせて読みたい
Apache(アパッチ)サーバのインストールと設定、そしてHTTPS化 ブログなどをインターネットで公開するには、Webサーバが必要になります。Webサーバの代表的なプログラムにはApacheとNginxの2つがありますが、今回の記事ではApacheの...

PHPのインストール

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

あわせて読みたい
PHPをインストールしてコマンドラインとブラウザでPHPを実行する 今回はEC2インスタンス上にPHPをインストールする手順について学習していきます。AWSのEC2インスタンス(Amazon Linux 2023)にSSH接続ができていて、基本的なLinuxコマ...

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通信ができました。設定項目が多いのでもらがないように今後も注意して作業しましょう。

【関連記事】
PHP|Redisを使ったセッション管理(TLSなし・TLSあり)

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次