Redis是一个开源键值缓存和存储系统,由于其对多种数据类型(如散列,列表,集合和位图等)的高级支持,也称为数据结构服务器。它还支持群集,使其在高度可用和可扩展的环境中非常有用。
在本教程中,我们将了解如何安装和配置外部Redis服务器,以用作在Ubuntu 16.04上运行的PHP应用程序的会话处理程序。
会话处理程序负责存储和检索保存到会话中的数据。默认情况下,PHP使用文件。这对于单个服务器来说效果很好,但由于会话信息与单个服务器相关联,因此具有一些重要的性能和可伸缩性限制。
外部会话处理程序为多个应用程序服务器可以使用的共享会话数据提供中心位置。在负载均衡器后面创建可扩展的PHP环境时,这一点很重要,因为无论哪个应用程序服务器为单个请求提供服务,都可以使用相同的会话数据。
本教程将使用两个服务器配置会话处理,您需要具备以下条件:
您需要准备一个具有sudo
权限的非root用户,我们还假设每台服务器都运行基本防火墙。您可以按照我们在两台服务器上的Ubuntu 16.04初始服务器设置指南来设置这两个要求。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。
我们的第一步是在我们的两台机器上安装必要的软件。我们的redis机器需要一台Redis服务器。在我们的Web机器上,我们将安装用于会话处理的Redis PHP扩展和用于测试的Redis命令行客户端。
我们需要做的第一件事是让我们的redis机器上运行Redis服务器。
我们将使用常规Ubuntu包管理器和Chris Lea提供的可信PPA存储库。这是确保我们获得最新稳定版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
这将连接到localhost的6379端口上运行的Redis实例。你应该得到PONG的回应。
接下来,在Web服务器上安装Redis命令行客户端和Redis PHP扩展。我们将使用命令行客户端轻松测试连接和身份验证。我们将使用PHP扩展来存储会话数据。
通过输入以下内容更新本地程序包索引并在Web服务器上安装该软件:
sudo apt-get update
sudo apt-get install redis-tools php-redis
您现在应该可以访问该redis-cli
工具,但您还无权访问要测试的服务器。
默认情况下,Redis仅允许连接localhost
,这基本上意味着您只能从安装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地址:
bind 127.0.0.1 isolated_IP_address
保存并关闭文件。输入以下命令重启服务:
sudo systemctl restart redis-server.service
打开对Redis端口的访问:
sudo ufw allow 6379
Redis现在可以接受来自隔离网络的连接。
对于非隔离或您无法控制的网络,必须通过其他方式保护流量。有许多选项可以保护Redis服务器的流量,包括:
spiped
客户端计算机。您需要在每台服务器上创建systemd单元文件。Web服务器将连接到本地端口以与远程Redis服务进行通信。使用上述方法之一,配置从Web服务器到redis服务器的安全访问。您需要知道Web机将用于连接远程计算机上的Redis服务的IP地址和端口。
此时,您应该能够安全地从Web服务器访问Redis服务器。
要为Redis安装添加额外的安全层,建议您设置用于访问服务器数据的密码。我们将在/etc/redis/redis.conf
位置编辑Redis配置文件:
sudo nano /etc/redis/redis.conf
找到该requirepass
指令并将其设置为强密码。虽然您的Redis流量应该来自外部各方,但这为Redis本身提供了身份验证。由于Redis速度快且不限制密码尝试,因此请选择强大而复杂的密码以防止强力尝试:
requirepass yourverycomplexpasswordhere
完成后保存并关闭文件。
重新启动Redis服务以实现更改:
sudo systemctl restart redis-server.service
您的Redis服务器现在应该拒绝未经身份验证的请求。
要测试您的更改是否按预期工作,请从Web计算机连接到Redis服务。
默认情况下,Redis服务器在本地接口6379上监听,但我们上面介绍的每个网络安全选项都以某种方式修改了外部方的默认值。我们可以使用redis-cli
带有-h
选项的客户端指定IP地址,并使用-p
选项指定连接到远程服务所需的端口。如果他们使用默认选项(分别为127.0.0.1和6379),则可以省略其中任何一个。
您使用的值取决于您用于保护网络流量的方法:
redis-cli -h redis_isolated_IP
redis-cli -p 8000
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
您应该得到一个OK的响应,表明您的密码已被接受。
Web server outputOK
接下来,列出Redis中设置的键:
keys *
如果这是一个新的Redis服务器,输出应该类似于:
Web server output(empty list or set)
此输出仅表示您的Redis服务器为空,这正是我们所期望的。该网站服务器尚未配置为使用此服务器的Redis作为会话处理程序。
输入以下命令退回命令shell:
exit
现在我们已经验证了我们可以成功连接身份验证,我们可以将Redis作为默认会话处理程序。
现在我们需要在Web服务器上编辑php.ini
文件以更改PHP的默认会话处理程序。此文件的位置取决于您当前的堆栈。
对于从默认存储库安装的Ubuntu 16.04上的LAMP堆栈,通常在/etc/php/7.0/apache2/php.ini
里。对于Ubuntu 16.04上的LEMP堆栈,通常路径在/etc/php/7.0/fpm/php.ini
。如果您已确认其中一个位置正确无误,请跳过下一部分。
如果您不确定主文件php.ini
的位置,可以使用该phpinfo()
功能找到答案。在您的文档根目录中调用的Web服务器上打开一个info.php
文件,默认情况下该文件/var/www/html
适用于LAMP和LEMP:
sudo nano /var/www/html/info.php
将以下代码放在文件中:
<?php
phpinfo();
在浏览器中访问您的Web服务器的域名或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 PHP扩展的redis
。
session.save_handler = redis
接下来,找到包含session.save_path
的行。您需要取消注释并更改值,使其包含Redis连接字符串。
连接字符串可以使用以下格式构造,全部在一行中:
tcp://IP_address:port?auth=redis_password
同样,正确的值将取决于您选择的安全网络策略。使用您之前提供给redis-cli
命令的相同值。例如,如果您正在使用stunnel
或spiped
,则session.save_path
可能看起来像这样:
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作为会话处理程序。
为了确保您的会话现在由Redis处理,您将需要一个PHP脚本或应用程序来存储会话中的信息。我们将使用一个实现计数器的简单脚本。每次重新加载页面时,打印的数字都会递增。
在文档根文件夹中的Web服务器上创建一个名为test.php
的文件:
sudo nano /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环境。
想要了解更多关于Ubuntu的开源信息教程,请前往腾讯云+社区学习更多知识。
参考文献:《How to Set Up a Redis Server as a Session Handler for PHP on Ubuntu 16.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。