Ubuntu14.04でPHPのセッションハンドラーとしてRedisサーバーを設定する方法
序章
Redisは、オープンソースのKey-Valueキャッシュおよびストレージシステムであり、ハッシュ、リスト、セット、ビットマップなどのいくつかのデータ型を高度にサポートするため、データ構造サーバーとも呼ばれます。 また、クラスタリングをサポートしているため、可用性が高くスケーラブルな環境でよく使用されます。
このチュートリアルでは、Ubuntu14.04で実行されているPHPアプリケーションのセッションハンドラーとして使用される外部Redisサーバーをインストールして構成する方法を説明します。
セッションハンドラーは、セッションに保存されたデータの保存と取得を担当します。デフォルトでは、PHPはそのためにファイルを使用します。 外部セッションハンドラーを使用して、[X95X]スケーラブル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リポジトリを追加します。
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: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アドレスを回線に追加する必要があります。
sudo vim /etc/redis/redis.conf
/etc/redis/redis.conf
bind localhost 10.133.14.9
localhostの代わりに127.0.0.1が表示されている場合は、問題ありません。 すでに存在するものの後にプライベートIPを追加するだけです。
次に、Redisサービスを再起動して変更を適用する必要があります。
sudo service redis-server restart
ワンクリックアプリケーションを使用してRedisをインストールした場合、サービス名はredis-serverではなくredisになります。 再起動するには、sudo service redis restartを実行する必要があります。
この変更により、同じプライベートネットワーク内のすべてのサーバーもこのRedisインスタンスに接続できるようになります。
ステップ3—Redisサーバーのパスワードを設定する
Redisインストールにセキュリティの層を追加するには、サーバーデータにアクセスするためのパスワードを設定することをお勧めします。 前の手順/etc/redis/redis.confと同じ構成ファイルを編集します。
sudo vim /etc/redis/redis.conf
ここで、requirepassを含む行のコメントを解除し、強力なパスワードを設定します。
/etc/redis/redis.conf
requirepass yourverycomplexpasswordhere
変更が有効になるように、Redisサービスを再起動します。
sudo service redis-server restart
ステップ4—Redisの接続と認証をテストする
すべての変更が期待どおりに機能したかどうかをテストするには、redisマシン内からRedisサービスに接続します。
redis-cli -h 10.133.14.9
Output10.133.14.9:6379>
ここでhostパラメーターを指定する必要はありませんが(localhostから接続しているため)、Redisサービスがプライベートネットワークインターフェイスを対象とした接続を確実に受け入れるようにしました。 。
パスワードを定義してデータにアクセスしようとすると、AUTHエラーが発生するはずです。
keys *
Output(error) NOAUTH Authentication required.
認証するには、AUTHコマンドを実行し、/etc/redis/redis.confファイルで定義したものと同じパスワードを入力する必要があります。
AUTH yourverycomplexpasswordhere
応答としてOKを取得する必要があります。 今実行する場合:
keys *
出力は次のようになります。
Output(empty list or set)
この出力は、 web サーバーがこのRedisサーバーをセッションハンドラーとして使用するようにまだ構成されていないため、Redisサーバーが空であることを意味します。これはまさに私たちが期待したことです。
次の手順を実行している間、このSSHセッションを開いたまま、redis-cliに接続します。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のデフォルトのセッションハンドラーを変更する必要があります。 このファイルの場所は、現在のスタックによって異なります。 Ubuntu14.04のLAMPスタックの場合、これは通常/etc/php5/apache2/php.iniです。 Ubuntu14.04のLEMPスタックの場合、パスは通常/etc/php5/fpm/php.iniです。
メインのphp.iniファイルの場所がわからない場合は、関数phpinfo()を使用して簡単に見つけることができます。 Webルートディレクトリ内のinfo.phpという名前のファイルに次のコードを配置するだけです。
<?php phpinfo();
ブラウザからスクリプトにアクセスするときは、「ロードされた構成ファイル」を含む行を探してください。ロードされたメインのphp.iniの正確な場所を見つける必要があります。
info.phpファイルには環境に関する機密情報が含まれているため、後で削除することを忘れないでください。
php.iniファイルを開き、session.save_handlerを含む行を検索します。 デフォルト値はfilesです。 redisに変更する必要があります。
LAMP 環境の場合:
sudo vim /etc/php5/apache2/php.ini
LEMP 環境の場合:
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 環境の場合:
sudo service apache2 restart
LEMP 環境の場合:
sudo service php5-fpm restart
ステップ7—Redisセッション処理をテストする
セッションがRedisによって処理されるようにするには、セッションに関する情報を格納するPHPスクリプトまたはアプリケーションが必要になります。 カウンターを実装する簡単なスクリプトを使用します。ページをリロードするたびに、印刷された数値が増加します。
webサーバーにtest.phpという名前のファイルを作成し、ドキュメントのルートフォルダー内に配置します。
sudo vim /usr/share/nginx/html/test.php
ドキュメントのルートパスを反映するように/usr/share/nginx/htmlを変更することを忘れないでください。
[label /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://web/test.phpを指定します。 ページをリロードするたびに番号が増えるはずです。
これで、Redisサーバーにセッション情報が保存されているはずです。 確認するには、 redis マシンでSSHセッションに戻ります。以前は、redis-cliを使用してRedisサービスに接続していました。 keys *を使用してコンテンツを再度フェッチします。
keys *
そして、次のような出力が得られるはずです。
Output1) "PHPREDIS_SESSION:j9rsgtde6st2rqb6lu5u6f4h83"
これは、セッション情報がRedisサーバーに保存されていることを示しています。 同様の方法で、追加のWebサーバーをRedisサーバーに接続できます。
結論
Redisは、PHPのセッションハンドラーとしても使用できる強力で高速なKey-Valueストレージサービスであり、セッションストレージ用の分散システムを提供することでスケーラブルなPHP環境を実現します。 PHPアプリケーションのスケーリングの詳細については、次の記事を確認してください:PHPアプリケーションの水平方向のスケーリング。