如何在Ubuntu14.04上将Redis服务器设置为PHP的会话处理程序

来自菜鸟教程
跳转至:导航、​搜索

介绍

Redis 是一个开源的键值缓存和存储系统,也称为数据结构服务器,因为它对多种数据类型(例如哈希、列表、集合和位图等)提供了高级支持。 它还支持集群,这使得它经常用于高可用性和可扩展的环境。

在本教程中,我们将了解如何安装和配置外部 Redis 服务器以用作在 Ubuntu 14.04 上运行的 PHP 应用程序的会话处理程序。

会话处理程序负责存储和检索保存到会话中的数据 - 默认情况下,PHP 使用 files 来实现。 外部会话处理程序可用于在 负载平衡器 后面创建 可扩展的 PHP 环境,其中所有应用程序节点将连接到中央服务器以共享会话信息。

先决条件

在本教程中,我们将使用两个不同的服务器。 出于安全和性能原因,两个 Droplet 都位于启用了 私有网络 的同一数据中心中,这一点很重要。 这就是您需要的:

  • 在 Ubuntu 14.04 上运行 LAMPLEMP 的 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 应用程序