如何在 Ubuntu 14.04 上将 Redis 服务器设置为 PHP 的会话处理程序
介绍
Redis 是一个开源键值缓存和存储系统,也称为数据结构服务器,因为它对多种数据类型(例如哈希、列表、集合和位图等)提供了高级支持。它还支持集群,这使得它经常用于高可用性和可扩展的环境。
在本教程中,我们将了解如何安装和配置外部 Redis 服务器以用作在 Ubuntu 14.04 上运行的 PHP 应用程序的会话处理程序。
会话处理程序负责存储和检索保存到会话中的数据——默认情况下,PHP 使用文件。外部会话处理程序可用于创建负载均衡器,其中所有应用程序节点将连接到中央服务器以共享会话信息。
先决条件
在本教程中,我们将使用两个不同的服务器。出于安全和性能原因,重要的是两个 Droplet 位于同一个数据中心并启用专用网络。这是您需要的:
- 在 Ubuntu 14.04 上运行 LEMP 的 PHP 网络服务器 - 我们将此服务器称为网络
- 将安装 Redis 的第二个干净的 Ubuntu 14.04 服务器 - 我们将此服务器称为 redis
您需要以具有 sudo 权限的普通用户身份对两台服务器进行适当的 SSH 访问。
对于 Redis 服务器,您也可以使用我们的第 2 步。
第 1 步 — 安装 Redis 服务器
我们需要做的第一件事是在我们的 redis Droplet 上启动并运行 Redis 服务器。
我们将使用常规的 Ubuntu 包管理器和 Chris Lea 提供的受信任的 PPA 存储库。这是确保我们获得最新稳定版本的 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 上的本地主机上运行的 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
如果您看到 127.0.0.1
而不是 localhost
,那很好;只需在已经存在的内容之后添加您的私有 IP。
现在您只需要重新启动 Redis 服务即可应用更改:
- sudo service redis-server restart
如果您使用我们的一键式应用程序安装 Redis,服务名称将是 redis 而不是 redis-server。要重新启动它,您应该运行: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)
此输出仅表示您的 Redis 服务器为空,这正是我们所期望的,因为 Web 服务器尚未配置为使用此 Redis 服务器作为会话处理程序。
在我们执行后续步骤时保持此 SSH 会话打开并连接到 redis-cli
- 我们将返回到 redis-cli
提示符以检查会话数据是否正确在我们对网络服务器进行必要的更改后,正确存储。
第 5 步 — 在 Web 服务器上安装 Redis 扩展
接下来的步骤应该在 Web 服务器上执行。我们需要安装 PHP Redis 扩展,否则 PHP 将无法连接到 Redis 服务器。
首先,通过运行更新你的包管理器缓存:
- sudo apt-get update
然后安装 php5-redis
包:
- sudo apt-get install php5-redis
您的 Web 服务器现在应该能够连接到 Redis。
第 6 步 — 将 Redis 设置为 Web 服务器上的默认会话处理程序
现在我们需要编辑 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()
。只需将以下代码放在您的网站根目录中名为 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 连接字符串。内容应遵循以下格式,全部在一行中: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 的会话处理程序,通过为会话存储提供分布式系统来实现可扩展的 PHP 环境。有关扩展 PHP 应用程序的更多信息,您可以查看这篇文章:Horizontally Scaling PHP Applications。