首页 > 代码库 > 如何在Ubuntu 16.04上将Redis服务器设置为PHP的会话处理程序

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

介绍

Redis是一个开源的键值缓存和存储系统,也称为数据结构服务器,因为它对几种数据类型(如散列,列表,集合和位图等)提供高级支持。它还支持集群,使其在高可用性和可扩展的环境中非常有用。

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

会话处理程序负责存储和检索保存到会话中的数据。默认情况下,PHP使用文件这一点。这对于单个服务器工作得很好,但是由于会话信息被绑定到单个服务器,所以具有一些显着的性能和可扩展性限制。

外部会话处理程序提供了可由多个应用程序服务器使用的共享会话数据的中央位置。创建时,这是重要的可扩展的PHP环境背后负载平衡器 ,因为相同的会话数据将可不管哪个应用服务器提供一个单独的请求。

先决条件

本教程将使用两个服务器配置会话处理。要跟进,您将需要:

  • 一个PHP Web服务器正在运行LAMP或LEMP在Ubuntu 16.04。 我们将把此服务器作为网络 。

  • 第二个,干净的Ubuntu 16.04服务器,其中将安装Redis。我们将把此服务器作为Redis的 。

你需要有一个非root用户sudo对每台服务器的配置权限。 我们还假设每个服务器都有一个基本的防火墙运行。 您可以按照我们设立这两个要求的Ubuntu 16.04服务器初始设置指南两台服务器上。

第1步:安装Redis服务器和客户端软件

我们的第一步是在我们的两台机器上安装必要的软件。我们Redis的机器需要一个Redis的服务器。 在我们的网络设备,我们将安装Redis的PHP扩展的会话处理和检测Redis的命令行客户端。

安装Redis服务器

我们需要做的第一件事就是让我们的Redis的机器上运行Redis的服务器。

我们将使用由Chris Lea提供的可信PPA存储库的常规Ubuntu软件包管理器。这是必要的,以确保我们得到最新的稳定版本的Redis。

注:由于安全建议的一般一块,你应该只使用从可信来源的PPA。

首先,通过运行以下命令来添加PPA存储库:

sudo apt-add-repository ppa:chris-lea/redis-server

ENTER确认。

接下来,更新软件包索引并通过键入以下命令安装Redis服务器:

sudo apt-get update
sudo apt-get install redis-server

Redis现在应该在您的服务器上安装并运行。通过键入以下内容测试服务正在运行并接受连接:

redis-cli ping
Redis server outputPONG

这将连接到端口6379上的本地主机上运行Redis的实例。 你应该得到PONG作为响应。

安装Redis客户端和PHP扩展

接下来,安装Redis的命令行客户端和Web服务器上的Redis的PHP扩展。我们将使用命令行客户端轻松测试连接和身份验证。我们将使用PHP扩展来存储会话数据。

更新本地包指数,并通过键入安装在Web服务器上的软件:

sudo apt-get update
sudo apt-get install redis-tools php-redis

你现在应该有访问redis-cli工具,虽然你还没有访问服务器进行测试。

第2步:配置Redis接受外部连接

默认情况下,Redis的只允许连接localhost ,这基本上意味着你只有从安装Redis的服务器内部的访问。我们需要更改此配置以允许来自其他服务器的连接。

Redis不提供本机加密选项,并假设它已部署到可信对等体的隔离网络。这意味着为了安全地允许外部连接,两个服务器都必须位于隔离网络上,或者您需要以另一种方式保护它们之间的流量。

如果Redis部署到隔离网络…

如果您的服务器在隔离网络中运行,您可能只需要调整Redis的配置文件以绑定到您的隔离网络IP地址。

Redis的服务器,备份和打开Redis的配置文件:

sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.bak
sudo nano /etc/redis/redis.conf

查找bind线和追加Redis的服务器的隔离网络IP地址:

/etc/redis/redis.conf

bind 127.0.0.1 isolated_IP_address

保存并关闭文件。键入以下命令重新启动服务:

sudo systemctl restart redis-server.service

打开对Redis端口的访问:

sudo ufw allow 6379

Redis现在能够接受来自您的隔离网络的连接。

如果Redis未部署到隔离网络…

对于不孤立或不控制的网络,务必通过其他方式确保流量。有许多选项可确保流量到Redis服务器,包括:

  • 隧道与安全通道 :您将需要设置来电隧道Redis的服务器和Web服务器上的传出通道上。 Web服务器将连接到本地端口,以便与远程Redis服务进行通信。

  • 隧道与spiped :Web服务器应该充当spiped客户机。您将需要在每个服务器上创建一个systemd单元文件。 Web服务器将连接到本地端口,以便与远程Redis服务进行通信。

  • 设置了一个PeerVPN VPN :两个服务器都将需要对VPN访问。 Web服务器将能够访问使用其私网IP地址的redis的服务器。

使用的方法之一以上,配置为您的Redis服务器从您的Web服务器的安全访问。 你需要知道IP地址和您的网络设备将使用连接到的Redis服务的远程计算机上的端口。

此时,您应该能够安全地从Web服务器访问Redis服务器。

第3步:设置Redis服务器的密码

要为Redis安装添加额外的安全性层次,建议您设置访问服务器数据的密码。我们将在编辑Redis的配置文件/etc/redis/redis.conf :

sudo nano /etc/redis/redis.conf

找到requirepass指令并将其设置为一个强大的密码。虽然您的Redis流量应该是安全的从外部方,这提供了认证Redis本身。由于Redis速度快,并且不会限制密码尝试,请选择一个强大的复杂密码,以防止强力尝试:

/etc/redis/redis.conf

requirepass yourverycomplexpasswordhere

保存并在完成后关闭文件。

重新启动Redis服务以实现更改:

sudo systemctl restart redis-server.service

您的Redis服务器现在应拒绝未经身份验证的请求。

第4步:测试Redis连接和验证

要测试你的变化预期的工作,连接到从网络机器Redis的服务。

默认情况下,Redis服务器在本地接口上监听6379,但是上面介绍的每个网络安全选项都以某种方式为外部方修改默认值。我们可以使用redis-cli客户端与-h选项来指定IP地址和-p选项来指定连接到远程服务所需的端口。如果他们使用默认选项(分别为127.0.0.1和6379),则可以省略其中任何一个。

您使用的值取决于您用于保护网络流量的方法:

  • 独立的网络 :使用Redis的服务器的隔离网络IP地址。 默认端口Redis的(6379)被使用,所以我们并不需要提到它: redis-cli -h redis_isolated_IP

  • 安全通道spiped:使用本地端口隧道远程的Redis服务: redis-cli -p 8000

  • PeerVPN:使用Redis的服务器的VPN IP地址: redis-cli -h 10.8.0. 1

一般形式是:

redis-cli -h ip_to_contact_redis -p port_to_contact_redis

你应该能够从web服务器连接到远程的Redis实例。

如果您定义了密码,现在尝试访问数据,您应该得到一个AUTH错误:

keys *
Web server output(error) NOAUTH Authentication required.

要验证,你只需要运行AUTH命令,为您提供的定义相同的密码/etc/redis/redis.conf文件:

AUTH yourverycomplexpasswordhere

你应该得到一个确定的答复,表明您的凭据被接受。

Web server outputOK

接下来,列出在Redis中设置的键:

keys *

如果这是一个新鲜的Redis服务器,输出应类似于:

Web server output(empty list or set)

这个输出只是意味着你的Redis服务器是空的,这正是我们所期望的。Web服务器尚未配置为使用此服务器的Redis作为会话处理程序。

通过键入以下命令返回到命令shell:

exit

现在我们已经验证了我们可以成功连接身份验证,我们可以使Redis成为默认会话处理程序。

第5步:将Redis设置为Web服务器上的默认会话处理程序

现在,我们需要编辑php.ini文件中的Web服务器上修改PHP的默认会话处理程序。此文件的位置将取决于您当前的。

从默认库安装在Ubuntu 16.04一的LAMP,这通常是/etc/php/7.0/apache2/php.ini 。 对于LEMP在Ubuntu 16.04,该路径通常是/etc/php/7.0/fpm/php.ini 。如果您已验证其中一个位置是正确的,请随时跳过下一部分。

(可选)查找正确的php.ini文件

如果你不确定你的主要位置php.ini文件,您可以通过使用发现phpinfo()函数。 你所谓的Web服务器上打开一个文件info.php在你的文档根目录,默认情况下会/var/www/html为LAMP和LEMP:

sudo nano /var/www/html/info.php

将以下代码放在文件中:

/var/www/html/info.php

<?php
phpinfo();

在浏览器中,然后访问你的服务器的域名或IP地址/info.php :

http://web_server_domain_or_IP/info.php

查找包含“加载配置文件”行,你应该找到主要的确切位置php.ini加载。

完成后删除文件,因为它显示有关您的环境的敏感信息:

sudo rm /var/www/html/info.php

现在你知道文件所在的位置,你可以移动到编辑。

修改配置

打开php.ini文件进行编辑。

如果您正在使用其默认配置中的LAMP,则需要在命令是:

sudo nano /etc/php/7.0/apache2/php.ini

如果您正在使用其默认配置LEMP栈,则需要在命令是:

sudo nano /etc/php/7.0/fpm/php.ini

如果您发现使用不同的路径phpinfo()上述方法,在这里代替那个路径。

里面的php.ini文件中,搜索包含行session.save_handler 。 默认值是files 。 更改为redis使用Redis的PHP扩展。

php.ini

 session.save_handler = redis

接下来,找到包含行session.save_path 。您需要取消注释它并更改值,以便它包含您的Redis连接字符串。

可以使用以下格式构建连接字符串,所有格式在一行中:

tcp://IP_address:port?auth=redis_password

同样,正确的值将取决于您选择的安全网络策略。使用您所提供的相同值redis-cli命令前面。 例如,如果您正在使用stunnelspipedsession.save_path可能会是这个样子:

php.ini

 session.save_path = "tcp://127.0.0.1:8000?auth=yourverycomplexpasswordhere"

保存并在完成后关闭文件。接下来,重新启动PHP服务以实现更改。

LAMP环境下,键入:

sudo systemctl restart apache2

LEMP环境中,键入:

sudo systemctl restart php7.0-fpm

现在应该将PHP配置为使用Redis作为会话处理程序。

第6步:测试Redis会话处理

为了确保您的会话现在由Redis处理,您将需要一个PHP脚本或应用程序,用于在会话中存储信息。我们将使用一个实现计数器的简单脚本。每次重新加载页面时,打印的数字将增加。

创建一个文件名为test.php文件根目录文件夹中的Web服务器上:

sudo nano /var/www/html/test.php

在里面,粘贴以下代码:

/var/www/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;

保存并关闭文件。

将浏览器指向Web服务器的公网IP地址,然后/test.php为了访问脚本:

http://web_server_public_IP/test.php

它应该增加您每次重新加载页面时看到的数字。

现在,你的Redis的机器上,使用redis-cli来打开会话。由于我们正在连接到本地实例,因此我们不必提供IP地址或端口:

redis-cli

使用Redis密码进行身份验证:

AUTH yourverycomplexpasswordhere
Redis server outputOK

现在,检查现有键:

keys *

您应该看到我们的PHP会话的一个新条目:

Redis server output1) "PHPREDIS_SESSION:2ofnvhhr6gdvp88u0c4e7kb800"

如果要求键的值,您应该能够看到当前的计数器值:

get PHPREDIS_SESSION:2ofnvhhr6gdvp88u0c4e7kb800
Redis server output"count|i:6;"

这表明会话信息存储在Redis服务器上。您可以将其他Web服务器连接到Redis服务器以进行集中式会话管理。

结论

Redis是一个强大而快速的键值存储服务,也可以用作PHP的会话处理程序,通过为会话存储提供分布式系统来实现可扩展的PHP环境。有关扩展的PHP应用程序的更多信息,你可以查看这篇文章: 水平扩展PHP应用程序 。


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