如何在Ubuntu14.04上将Redis服务器设置为PHP的会话处理程序
介绍
Redis 是一个开源的键值缓存和存储系统,也称为数据结构服务器,因为它对多种数据类型(例如哈希、列表、集合和位图等)提供了高级支持。 它还支持集群,这使得它经常用于高可用性和可扩展的环境。
在本教程中,我们将了解如何安装和配置外部 Redis 服务器以用作在 Ubuntu 14.04 上运行的 PHP 应用程序的会话处理程序。
会话处理程序负责存储和检索保存到会话中的数据 - 默认情况下,PHP 使用 files 来实现。 外部会话处理程序可用于在 负载平衡器 后面创建 可扩展的 PHP 环境,其中所有应用程序节点将连接到中央服务器以共享会话信息。
先决条件
在本教程中,我们将使用两个不同的服务器。 出于安全和性能原因,两个 Droplet 都位于启用了 私有网络 的同一数据中心中,这一点很重要。 这就是您需要的:
- 在 Ubuntu 14.04 上运行 LAMP 或 LEMP 的 PHP Web 服务器 - 我们将此服务器称为 web
- 第二个干净的 Ubuntu 14.04 服务器将安装 Redis - 我们将此服务器称为 redis
您需要以具有 sudo 权限 的普通用户身份对两台服务器进行适当的 SSH 访问。
Redis服务器也可以使用我们的【X43X】Redis一键式应用【X74X】,直接跳到【X92X】Step 2【X102X】。
第 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 上运行在 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
如果你看到 127.0.0.1
而不是 localhost
那很好; 只需在已经存在的内容之后添加您的私有 IP。
现在您只需要重新启动 Redis 服务即可应用更改:
sudo service redis-server restart
如果您使用我们的 One-click 应用程序安装 Redis,则服务名称将为 redis 而不是 redis-server。 要重新启动它,您应该运行: 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)
这个输出只是意味着你的 Redis 服务器是空的,这正是我们所期望的,因为 web 服务器还没有配置为使用这个 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 步 — 将 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()
。 只需将以下代码放入 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 连接字符串。 内容应该遵循这种格式,都在一行中: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 应用程序的信息,可以查看这篇文章:水平扩展 PHP 应用程序。