Ubuntu 14.04でPHPのセッションハンドラーとしてRedisサーバーを設定する方法

前書き

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

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

セッションハンドラーは、セッションに保存されたデータの保存と取得を行います-デフォルトでは、PHPはそのために*ファイル*を使用します。 外部セッションハンドラを使用して、https://www.digitalocean.com/community/の背後にhttps://www.digitalocean.com/company/blog/horizo​​ntally-scaling-php-applications/ [スケーラブルPHP環境]を作成できます。 tutorials / an-introduction-to-haproxy-and-load-balancing-concepts [ロードバランサー]では、すべてのアプリケーションノードがセッション情報を共有するために中央サーバーに接続します。

前提条件

このチュートリアルでは、2つの異なるサーバーを使用します。 セキュリティとパフォーマンスの理由から、両方のドロップレットがhttps://www.digitalocean.com/community/tutorials/how-to-set-up-and-use-digitalocean-private-networking [プライベートネットワーク]を有効にしました。 これはあなたが必要とするものです:

  • LAMPまたはhttpsを実行しているPHP Webサーバー//www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-14-04[LEMP] Ubuntu 14.04-このサーバーを参照します* web *として

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

sudo permissionを使用して、通常のユーザーとして両方のサーバーへの適切なSSHアクセスが必要になります。

ステップ1-Redisサーバーのインストール

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

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

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

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

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

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

sudo apt-get update

最後に、次を実行してRedisをインストールします。

sudo apt-get install redis-server

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

redis-cli ping

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

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

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

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

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

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:  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アドレス*を行に追加する必要があります。

sudo vim /etc/redis/redis.conf

/etc/redis/redis.conf

bind localhost

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

変更を適用するには、Redisサービスを再起動するだけです。

sudo service redis-server restart

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

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

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

sudo vim /etc/redis/redis.conf

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

/etc/redis/redis.conf

requirepass

Redisサービスを再起動して、変更を有効にします。

sudo service redis-server restart

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

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

redis-cli -h
Output10.133.14.9:6379>

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

keys *
Output(error) NOAUTH Authentication required.

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

AUTH yourverycomplexpasswordhere

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

keys *

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

Output(empty list or set)

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

次の手順を実行する間、このSSHセッションを開いたまま `+ redis-cli +`に接続したままにします。 * web *サーバーに必要な変更。

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

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

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

sudo apt-get update

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

sudo apt-get install php5-redis

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

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

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

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

<?php
phpinfo();

ブラウザからスクリプトにアクセスする場合、「Loaded Configuration File」を含む行を探します。ロードされたメインの `+ php.ini +`の正確な場所を見つける必要があります。

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

  • LAMP *環境の場合:

sudo vim /etc/php5/apache2/php.ini
  • LEMP *環境の場合:

sudo vim /etc/php5/fpm/php.ini

/etc/php5/fpm/php.ini

session.save_handler = redis

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

/etc/php5/fpm/php.ini

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

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

  • LAMP *環境の場合:

sudo service apache2 restart
  • LEMP *環境の場合:

sudo service php5-fpm restart

ステップ7-Redisセッション処理のテスト

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

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

sudo vim test.php

/usr/share/nginx/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;

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

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

keys *

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

Output1) "PHPREDIS_SESSION:j9rsgtde6st2rqb6lu5u6f4h83"

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

結論

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

Related