前書き

Redisはオープンソースのキーと値のキャッシュおよびストレージシステムであり、ハッシュ、リスト、セット、ビットマップなどのいくつかのデータタイプの高度なサポートにより、データ構造サーバーとも呼ばれます。 また、クラスタリングもサポートしているため、可用性が高くスケーラブルな環境で役立ちます。

このチュートリアルでは、Ubuntu 16.04で実行されているPHPアプリケーションのセッションハンドラーとして使用される外部Redisサーバーをインストールして構成する方法を説明します。

セッションハンドラーは、セッションに保存されたデータを保存および取得します。 デフォルトでは、PHPはこれに*ファイル*を使用します。 これは単一のサーバーでは十分に機能しますが、セッション情報は単一のサーバーに関連付けられているため、パフォーマンスとスケーラビリティの制限がいくつかあります。

外部セッションハンドラは、複数のアプリケーションサーバーで使用できる共有セッションデータの中心的な場所を提供します。 これは、https://www.digitalocean.com/community/tutorials/an-の背後にhttps://www.digitalocean.com/company/blog/horizo​​ntally-scaling-php-applications/ [スケーラブルPHP環境]を作成する場合に重要です。これは、どのアプリケーションサーバーが個々のリクエストを処理するかに関係なく、同じセッションデータが利用可能になるためです。

前提条件

このチュートリアルでは、2つのサーバーを使用してセッション処理を構成します。 従うには、次のものが必要です。

  • LAMPまたはhttpsを実行しているPHP Webサーバー//www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-in-ubuntu-16-04[LEMP] Ubuntu 16.04で。 このサーバーを* web *と呼びます。

  • Redisがインストールされる2番目のクリーンなUbuntu 16.04サーバー。 このサーバーを* redis *と呼びます。

これらの各サーバーで設定された `+ sudo +`権限を持つ非rootユーザーが必要です。 また、各サーバーで基本的なファイアウォールが実行されていると仮定します。 これらの要件の両方を設定するには、両方のサーバーでhttps://www.digitalocean.com/community/articles/initial-server-setup-with-ubuntu-16-04[Ubuntu 16.04初期サーバーセットアップガイド]に従ってください。

ステップ1:Redisサーバーとクライアントソフトウェアをインストールする

最初のステップは、両方のマシンに必要なソフトウェアをインストールすることです。 * redis *マシンにはRedisサーバーが必要です。 * web *マシンに、セッション処理用のRedis PHP拡張機能とテスト用のRedisコマンドラインクライアントをインストールします。

Redisサーバーのインストール

最初に行う必要があるのは、* redis *マシンでRedisサーバーを実行することです。

Chris Leaが提供する信頼できるPPAリポジトリで、通常のUbuntuパッケージマネージャーを使用します。 これは、Redisの最新の安定バージョンを確実に取得するために必要です。

まず、次を実行してPPAリポジトリを追加します。

sudo apt-add-repository ppa:chris-lea/redis-server

「+ ENTER」を押して確認します。

次に、次のように入力してパッケージインデックスを更新し、Redisサーバーをインストールします。

sudo apt-get update
sudo apt-get install redis-server

これで、Redisがサーバーにインストールされ実行されているはずです。 次のように入力して、サービスが実行され、接続を受け入れていることをテストします。

redis-cli ping
Redis server outputPONG

これは、ポート* 6379 localhost で実行されているRedisインスタンスに接続します。 応答として PONG *を取得する必要があります。

RedisクライアントとPHP拡張機能のインストール

次に、RedisコマンドラインクライアントとRedis PHP拡張機能を* web *サーバーにインストールします。 コマンドラインクライアントを使用して、接続と認証を簡単にテストします。 セッションデータを保存するには、PHP拡張機能を使用します。

次を入力して、ローカルパッケージインデックスを更新し、* web *サーバーにソフトウェアをインストールします。

sudo apt-get update
sudo apt-get install redis-tools php-redis

これで、テストするサーバーにまだアクセスできませんが、 `+ redis-cli +`ツールにアクセスできるはずです。

ステップ2:外部接続を受け入れるようにRedisを構成する

デフォルトでは、Redisは `+ localhost +`からの接続のみを許可します。これは基本的に、Redisがインストールされているサーバー内からのみアクセスできることを意味します。 他のサーバーからの接続を許可するには、この構成を変更する必要があります。

Redisはネイティブ暗号化オプションを提供せず、信頼できるピアの隔離されたネットワークにデプロイされていると想定しています。 つまり、外部接続を安全に許可するには、両方のサーバーが分離されたネットワーク上にあるか、別の方法でサーバー間のトラフィックを保護する必要があります。

Redisが分離されたネットワークに展開されている場合…

サーバーが分離されたネットワークで動作している場合、おそらく分離されたネットワークIPアドレスにバインドするようにRedisの構成ファイルを調整するだけで済みます。

  • redis *サーバーで、Redis構成ファイルをバックアップして開きます。

sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.bak
sudo nano /etc/redis/redis.conf

「+ bind +」行を見つけて、Redisサーバーの分離されたネットワークIPアドレスを追加します。

/etc/redis/redis.conf

bind 127.0.0.1

ファイルを保存して閉じます。 次を入力してサービスを再起動します。

sudo systemctl restart redis-server.service

Redisポートへのアクセスを開きます。

sudo ufw allow 6379

Redisは、分離されたネットワークからの接続を受け入れることができるようになりました。

Redisが分離されたネットワークに展開されていない場合…

分離されていないネットワークや制御できないネットワークの場合、トラフィックを他の手段で保護することが不可欠です。 Redisサーバーへのトラフィックを保護するには、次のような多くのオプションがあります。

  • stunneling with stunnel:を設定する必要があります* redis サーバー上の着信トンネルと web *サーバー上の発信トンネル。 Webサーバーは、ローカルポートに接続して、リモートRedisサービスと通信します。

  • Tunneling with spiped:* web *サーバーは機能するはずです`+ spiped +`クライアントマシンとして。 各サーバーにsystemdユニットファイルを作成する必要があります。 Webサーバーは、ローカルポートに接続して、リモートRedisサービスと通信します。

  • PeerVPNを使用したVPNのセットアップ:両方のサーバーが必要になりますVPNでアクセスできるようにします。 * web サーバーは、VPN IPアドレスを使用して redis *サーバーにアクセスできます。

上記のいずれかの方法を使用して、* web サーバーから redis *サーバーへの安全なアクセスを設定します。 * web *マシンがリモートマシンのRedisサービスへの接続に使用するIPアドレスとポートを知る必要があります。

この時点で、WebサーバーからRedisサーバーに安全にアクセスできるはずです。

ステップ3:Redisサーバーのパスワードを設定する

Redisインストールにセキュリティのレイヤーを追加するには、サーバーデータにアクセスするためのパスワードを設定することをお勧めします。 `+ / etc / redis / redis.conf +`のRedis設定ファイルを編集します:

sudo nano /etc/redis/redis.conf

`+ requirepass +`ディレクティブを見つけて、強力なパスフレーズに設定します。 Redisトラフィックは外部からのセキュリティで保護されている必要がありますが、これによりRedis自体への認証が提供されます。 Redisは高速であり、パスワード試行を制限しないため、ブルートフォース攻撃から保護するために強力で複雑なパスフレーズを選択します。

/etc/redis/redis.conf

requirepass

完了したら、ファイルを保存して閉じます。

Redisサービスを再起動して、変更を実装します。

sudo systemctl restart redis-server.service

これで、Redisサーバーは認証されていないリクエストを拒否するはずです。

ステップ4:Redis接続と認証をテストする

変更が期待どおりに機能するかどうかをテストするには、* web *マシンからRedisサービスに接続します。

デフォルトでは、Redisサーバーはローカルインターフェースで6379をリッスンしますが、上記で説明した各ネットワークセキュリティオプションは、外部の関係者のデフォルトを何らかの方法で変更します。 `+ redis-cli `クライアントと ` -h `オプションを使用してIPアドレスを指定し、 ` -p +`オプションでリモートサービスへの接続に必要なポートを指定できます。 デフォルトのオプション(それぞれ127.0.0.1と6379)を使用する場合、これらのいずれかを省略できます。

使用する値は、ネットワークトラフィックを保護するために使用した方法によって異なります。

  • 隔離されたネットワーク:Redisサーバーの隔離されたネットワークIPアドレスを使用します。 デフォルトのRedisポート(6379)が使用されるため、言及する必要はありません: + redis-cli -h +

  • * stunnel または spiped *:リモートRedisサービスにトンネリングするローカルポートを使用します: + redis-cli -p +

  • * PeerVPN *:RedisサーバーのVPN IPアドレスを使用します: + redis-cli -h 10.8.0。+

一般的な形式は次のとおりです。

redis-cli -h  -p
  • web *サーバーからリモートRedisインスタンスに接続できるはずです。

パスワードを定義してからデータにアクセスしようとすると、AUTHエラーが発生するはずです。

keys *
Web server output(error) NOAUTH Authentication required.

認証するには、 `+ AUTH `コマンドを実行するだけで、 ` / etc / redis / redis.conf +`ファイルで定義したものと同じパスワードを指定できます。

AUTH

資格情報が受け入れられたことを示す応答として* OK *を取得する必要があります。

Web server outputOK

次に、Redis内で設定されているキーをリストします。

keys *

これが新しいRedisサーバーの場合、出力は次のようになります。

Web server output(empty list or set)

この出力は、Redisサーバーが空であることを意味しているだけであり、まさにそれが予想されています。 * web *サーバーは、このRedisサーバーをセッションハンドラーとして使用するようにまだ構成されていません。

次のように入力して、コマンドシェルに戻ります。

exit

認証で正常に接続できることを確認したので、Redisをデフォルトのセッションハンドラーにできます。

手順5:RedisをWebサーバーのデフォルトセッションハンドラーとして設定する

ここで、* web *サーバー上の `+ php.ini`ファイルを編集して、PHPのデフォルトのセッションハンドラーを変更する必要があります。 このファイルの場所は、現在のスタックによって異なります。

デフォルトのリポジトリからインストールされたUbuntu 16.04上の* LAMP *スタックの場合、これは通常 `+ / etc / php / 7.0 / apache2 / php.ini `です。 Ubuntu 16.04の* LEMP *スタックの場合、パスは通常 ` / etc / php / 7.0 / fpm / php.ini +`です。 これらの場所のいずれかが正しいことを確認したら、次のセクションをスキップしてください。

(オプション)正しいphp.iniファイルを見つける

メインの + php.ini`ファイルの場所がわからない場合は、 + phpinfo()+ `関数を使用して確認できます。 ドキュメントルートの `+ info.php `という* web *サーバーでファイルを開きます。デフォルトでは、LAMPとLEMPの両方で ` / var / www / html +`になります。

sudo nano /info.php

ファイルに次のコードを配置します。

/var/www/html/info.php

<?php
phpinfo();

ブラウザで* web *サーバーのドメイン名またはIPアドレスにアクセスし、続いて `+ / info.php +`にアクセスします。

http:///info.php

「Loaded Configuration File」を含む行を探します。ロードされたメインの `+ php.ini +`の正確な場所を見つける必要があります。

環境に関する機密情報が表示されるため、完了したらファイルを削除します。

sudo rm /info.php

ファイルの場所がわかったので、編集に移ります。

構成の変更

編集のために `+ php.ini`ファイルを開きます。

デフォルト構成で* LAMP *スタックを使用している場合、必要なコマンドは次のとおりです。

sudo nano /etc/php/7.0/apache2/php.ini

デフォルト構成で* LEMP *スタックを使用している場合、必要なコマンドは次のとおりです。

sudo nano /etc/php/7.0/fpm/php.ini

上記の `+ phpinfo()+`メソッドを使用して別のパスを発見した場合は、代わりにそのパスをここで置き換えます。

+ php.ini`ファイル内で、 + session.save_handler`を含む行を検索します。 デフォルト値は `+ files `です。 Redis PHP拡張モジュールを使用するには、これを「 redis +」に変更します。

php.ini

session.save_handler =

次に、 `+ session.save_path +`を含む行を見つけます。 コメントを解除し、Redis接続文字列が含まれるように値を変更する必要があります。

接続文字列は、次の形式を使用してすべて1行で作成できます。

tcp://:?auth=

繰り返しますが、適切な値は、選択した安全なネットワーク戦略によって異なります。 前に `+ redis-cli `コマンドに指定したものと同じ値を使用します。 たとえば、「 stunnel 」または「 spiped 」を使用している場合、「 session.save_path +」は次のようになります。

php.ini

session.save_path = "tcp://:?auth="

完了したら、ファイルを保存して閉じます。 次に、PHPサービスを再起動して、変更を実装します。

  • LAMP *環境では、次を入力します。

sudo systemctl restart apache2
  • LEMP *環境では、次を入力します。

sudo systemctl restart php7.0-fpm

これで、セッションハンドラーとしてRedisを使用するようにPHPを構成する必要があります。

ステップ6:Redisセッションの処理をテストする

セッションがRedisによって処理されるようにするには、セッションに情報を保存するPHPスクリプトまたはアプリケーションが必要です。 カウンターを実装する簡単なスクリプトを使用します。 ページをリロードするたびに、印刷された数字が増加します。

ドキュメントルートフォルダ内の* web *サーバーに `+ test.php +`という名前のファイルを作成します。

sudo nano test.php

内部に、次のコードを貼り付けます。

/var/www/html/test.php

<?php
//simple counter to test sessions. should increment on each page reload.
session_start();
$count = isset($_SESSION['count']) ? $_SESSION['count'] : 1;

echo $count;

$_SESSION['count'] = ++$count;

ファイルを保存して閉じます。

スクリプトにアクセスするには、ブラウザで* web *サーバーのパブリックIPアドレスに続けて `+ / test.php +`を指定します。

http:///test.php

ページをリロードするたびに表示される数値が増加します。

  • redis *マシンで、 `+ redis-cli +`を使用してセッションを開きます。 ローカルインスタンスに接続しているため、IPアドレスやポートを指定する必要はありません。

redis-cli

Redisパスワードを使用して認証します。

AUTH
Redis server outputOK

次に、既存のキーを確認します。

keys *

PHPセッションの新しいエントリが表示されます。

Redis server output1) "PHPREDIS_SESSION:"

キーの値を要求すると、現在のカウンター値を確認できるはずです。

get PHPREDIS_SESSION:
Redis server output"count|i:;"

これは、セッション情報がRedisサーバーに保存されていることを示しています。 セッションを一元管理するために、追加のWebサーバーをRedisサーバーに接続できます。

結論

Redisは強力で高速なキー値ストレージサービスであり、PHPのセッションハンドラーとしても使用でき、セッションストレージ用の分散システムを提供することでスケーラブルなPHP環境を実現します。 PHPアプリケーションのスケーリングの詳細については、https://www.digitalocean.com/company/blog/horizo​​ntally-scaling-php-applications/ [PHPアプリケーションの水平スケーリング]の記事をご覧ください。