序章

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

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

セッションハンドラーは、セッションに保存されたデータの保存と取得を担当します。デフォルトでは、PHPはそのためにファイルを使用します。 外部セッションハンドラーを使用して、ロードバランサーの背後にスケーラブルなPHP環境を作成できます。この場合、すべてのアプリケーションノードが中央サーバーに接続してセッション情報を共有します。

前提条件

このチュートリアルでは、2つの異なるサーバーを使用します。 セキュリティとパフォーマンスの理由から、両方のドロップレットがプライベートネットワークが有効になっている同じデータセンターに配置されていることが重要です。 これはあなたが必要とするものです:

  • Ubuntu14.04でLAMPまたはLEMPを実行しているPHPWebサーバー-このサーバーをwebと呼びます。
  • Redisがインストールされる2番目のクリーンなUbuntu14.04サーバー-このサーバーをredisと呼びます。

sudo権限を持つ通常のユーザーとして、両方のサーバーへの適切なSSHアクセスが必要です。

Redisサーバーの場合は、 Redisワンクリックアプリケーションを使用して、ステップ2にスキップすることもできます。

ステップ1—Redisサーバーをインストールします

最初に行う必要があるのは、redisドロップレットでRedisサーバーを起動して実行することです。

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

一般的なセキュリティアドバイスとして、信頼できるソースからのPPAのみを使用する必要があります。

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

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

ENTERを押して確認します。

次に、パッケージマネージャーのキャッシュを更新する必要があります。

  1. sudo apt-get update

最後に、次のコマンドを実行してRedisをインストールしましょう。

  1. sudo apt-get install redis-server

これで、Redisがサーバーにインストールされます。 インストールをテストするには、次のコマンドを試してください。

  1. redis-cli ping

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

ステップ2—外部接続を受け入れるようにRedisを設定する

デフォルトでは、Redisはlocalhostへの接続のみを許可します。つまり、基本的には、Redisがインストールされているサーバー内からのみアクセスできます。 redis サーバーと同じプライベートネットワーク上の他のサーバーからの接続を許可するには、この構成を変更する必要があります。

最初に行う必要があるのは、RedisマシンのプライベートネットワークIPアドレスを見つけることです。 次の手順は、redisサーバーで実行する必要があります。

ifconfigを実行して、ネットワークインターフェイスに関する情報を取得します。

  1. sudo ifconfig

次のような出力が得られるはずです。

Output
eth0 Link encap:Ethernet HWaddr 04:01:63:7e:a4:01 inet addr:188.166.77.33 Bcast:188.166.127.255 Mask:255.255.192.0 inet6 addr: fe80::601:63ff:fe7e:a401/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3497 errors:0 dropped:0 overruns:0 frame:0 TX packets:3554 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:4895060 (4.8 MB) TX bytes:619070 (619.0 KB) eth1 Link encap:Ethernet HWaddr 04:01:63:7e:a4:02 inet addr:10.133.14.9 Bcast:10.133.255.255 Mask:255.255.0.0 inet6 addr: fe80::601:63ff:fe7e:a402/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:7 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:648 (648.0 B) TX bytes:578 (578.0 B)

eth1インターフェースに割り当てられているinet_addrを探します。 この場合、それは10.133.14.9です。これは、webサーバーからredisサーバーに接続するために後で使用するIPアドレスです。

お気に入りのコマンドラインエディタを使用して、ファイル/etc/redis/redis.confを開き、bind定義を含む行を探します。 次のように、プライベートネットワークIPアドレスを回線に追加する必要があります。

  1. sudo vim /etc/redis/redis.conf
/etc/redis/redis.conf
bind localhost 10.133.14.9

localhostの代わりに127.0.0.1が表示されている場合は、問題ありません。 すでに存在するものの後にプライベートIPを追加するだけです。

次に、Redisサービスを再起動して変更を適用する必要があります。

  1. sudo service redis-server restart

ワンクリックアプリケーションを使用してRedisをインストールした場合、サービス名はredis-serverではなくredisになります。 再起動するには、sudo service redis restartを実行する必要があります。

この変更により、同じプライベートネットワーク内のすべてのサーバーもこのRedisインスタンスに接続できるようになります。

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

Redisインストールにセキュリティの層を追加するには、サーバーデータにアクセスするためのパスワードを設定することをお勧めします。 前の手順/etc/redis/redis.confと同じ構成ファイルを編集します。

  1. sudo vim /etc/redis/redis.conf

ここで、requirepassを含む行のコメントを解除し、強力なパスワードを設定します。

/etc/redis/redis.conf
requirepass yourverycomplexpasswordhere

変更が有効になるように、Redisサービスを再起動します。

  1. sudo service redis-server restart

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

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

  1. redis-cli -h 10.133.14.9
Output
10.133.14.9:6379>

ここでhostパラメーターを指定する必要はありませんが(localhostから接続しているため)、Redisサービスがプライベートネットワークインターフェイスを対象とした接続を確実に受け入れるようにしました。 。

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

  1. keys *
Output
(error) NOAUTH Authentication required.

認証するには、AUTHコマンドを実行し、/etc/redis/redis.confファイルで定義したものと同じパスワードを入力する必要があります。

  1. AUTH yourverycomplexpasswordhere

応答としてOKを取得する必要があります。 今実行する場合:

  1. keys *

出力は次のようになります。

Output
(empty list or set)

この出力は、 web サーバーがこのRedisサーバーをセッションハンドラーとして使用するようにまだ構成されていないため、Redisサーバーが空であることを意味します。これはまさに私たちが期待したことです。

次の手順を実行している間、このSSHセッションを開いたまま、redis-cliに接続します。redis-cliプロンプトに戻り、セッションデータが適切に保存されているかどうかを確認します。 webサーバーに必要な変更。

手順5—WebサーバーにRedis拡張機能をインストールする

次の手順は、webサーバーで実行する必要があります。 PHP Redis拡張機能をインストールする必要があります。そうしないと、PHPはRedisサーバーに接続できません。

まず、以下を実行してパッケージマネージャーのキャッシュを更新します。

  1. sudo apt-get update

次に、php5-redisパッケージをインストールします。

  1. sudo apt-get install php5-redis

これで、WebサーバーがRedisに接続できるようになります。

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

次に、 webサーバー上のphp.iniファイルを編集して、PHPのデフォルトのセッションハンドラーを変更する必要があります。 このファイルの場所は、現在のスタックによって異なります。 Ubuntu14.04のLAMPスタックの場合、これは通常/etc/php5/apache2/php.iniです。 Ubuntu14.04のLEMPスタックの場合、パスは通常/etc/php5/fpm/php.iniです。

メインのphp.iniファイルの場所がわからない場合は、関数phpinfo()を使用して簡単に見つけることができます。 Webルートディレクトリ内のinfo.phpという名前のファイルに次のコードを配置するだけです。

  1. <?php
  2. phpinfo();

ブラウザからスクリプトにアクセスするときは、「ロードされた構成ファイル」を含む行を探してください。ロードされたメインのphp.iniの正確な場所を見つける必要があります。

info.phpファイルには環境に関する機密情報が含まれているため、後で削除することを忘れないでください。

php.iniファイルを開き、session.save_handlerを含む行を検索します。 デフォルト値はfilesです。 redisに変更する必要があります。

LAMP 環境の場合:

  1. sudo vim /etc/php5/apache2/php.ini

LEMP 環境の場合:

  1. sudo vim /etc/php5/fpm/php.ini
[label /etc/php5/fpm/php.ini] 
session.save_handler = redis

これで、session.save_pathを含む行が見つかります。 コメントを外し、Redis接続文字列が含まれるように値を変更します。 コンテンツは、すべて1行で次の形式に従う必要があります:tcp://IPADDRESS:PORT?auth=REDISPASSWORD

[label /etc/php5/fpm/php.ini] 
session.save_path = "tcp://10.133.14.9:6379?auth=yourverycomplexpasswordhere"

Redisの設定時にパスワードを設定した場合にのみ、パラメーターauthを指定する必要があります。

ファイルを保存して、phpサービスを再起動します。

LAMP 環境の場合:

  1. sudo service apache2 restart

LEMP 環境の場合:

  1. sudo service php5-fpm restart

ステップ7—Redisセッション処理をテストする

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

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

  1. sudo vim /usr/share/nginx/html/test.php

ドキュメントのルートパスを反映するように/usr/share/nginx/htmlを変更することを忘れないでください。

  1. [label /usr/share/nginx/html/test.php]
  2. <?php
  3. //simple counter to test sessions. should increment on each page reload.
  4. session_start();
  5. $count = isset($_SESSION['count']) ? $_SESSION['count'] : 1;
  6. echo $count;
  7. $_SESSION['count'] = ++$count;

スクリプトにアクセスするには、ブラウザでhttp://web/test.phpを指定します。 ページをリロードするたびに番号が増えるはずです。

これで、Redisサーバーにセッション情報が保存されているはずです。 確認するには、 redis マシンでSSHセッションに戻ります。以前は、redis-cliを使用してRedisサービスに接続していました。 keys *を使用してコンテンツを再度フェッチします。

  1. keys *

そして、次のような出力が得られるはずです。

Output
1) "PHPREDIS_SESSION:j9rsgtde6st2rqb6lu5u6f4h83"

これは、セッション情報がRedisサーバーに保存されていることを示しています。 同様の方法で、追加のWebサーバーをRedisサーバーに接続できます。

結論

Redisは、PHPのセッションハンドラーとしても使用できる強力で高速なKey-Valueストレージサービスであり、セッションストレージ用の分散システムを提供することでスケーラブルなPHP環境を実現します。 PHPアプリケーションのスケーリングの詳細については、次の記事を確認してください:PHPアプリケーションの水平方向のスケーリング