Ubuntu14.04でPHPのセッションハンドラーとしてRedisサーバーを設定する方法
序章
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リポジトリを追加します。
- 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
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
を含む行のコメントを解除し、強力なパスワードを設定します。
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アプリケーションの水平方向のスケーリング。