前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Ubuntu 16.04上将Redis服务器设置为PHP的会话处理程序

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

原创
作者头像
风研雨墨
修改2018-10-22 11:26:13
1.4K0
修改2018-10-22 11:26:13
举报

介绍

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

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

会话处理程序负责存储和检索保存到会话中的数据。默认情况下,PHP使用文件。这对于单个服务器来说效果很好,但由于会话信息与单个服务器相关联,因此具有一些重要的性能和可伸缩性限制。

外部会话处理程序为多个应用程序服务器可以使用的共享会话数据提供中心位置。在负载均衡器后面创建可扩展的PHP环境时,这一点很重要,因为无论哪个应用程序服务器为单个请求提供服务,都可以使用相同的会话数据。

准备

本教程将使用两个服务器配置会话处理,您需要具备以下条件:

  • 在Ubuntu 16.04上运行LAMP或LEMP的PHP Web服务器。我们将此服务器称为Web
  • 在第二个Ubuntu 16.04服务器上安装Redis。我们将此服务器称为redis

您需要准备一个具有sudo权限的非root用户,我们还假设每台服务器都运行基本防火墙。您可以按照我们在两台服务器上的Ubuntu 16.04初始服务器设置指南来设置这两个要求。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器

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

我们的第一步是在我们的两台机器上安装必要的软件。我们的redis机器需要一台Redis服务器。在我们的Web机器上,我们将安装用于会话处理的Redis PHP扩展和用于测试的Redis命令行客户端。

安装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

这将连接到localhost6379端口上运行的Redis实例。你应该得到PONG的回应。

安装Redis客户端和PHP扩展

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

通过输入以下内容更新本地程序包索引并在Web服务器上安装该软件:

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

您现在应该可以访问该redis-cli工具,但您还无权访问要测试的服务器。

第二步:配置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地址:

bind 127.0.0.1 isolated_IP_address

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

sudo systemctl restart redis-server.service

打开对Redis端口的访问:

sudo ufw allow 6379

Redis现在可以接受来自隔离网络的连接。

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

对于非隔离或您无法控制的网络,必须通过其他方式保护流量。有许多选项可以保护Redis服务器的流量,包括:

  • 使用stunnel进行隧道:您需要在redis服务器上设置传入通道,并在Web服务器上设置传出通道。Web服务器将连接到本地端口以与远程Redis服务进行通信。
  • 使用spiped进行隧道传输:Web服务器应该用作spiped客户端计算机。您需要在每台服务器上创建systemd单元文件。Web服务器将连接到本地端口以与远程Redis服务进行通信。
  • 使用PeerV**设置V**:需要在V**上访问这两个服务器。该网站服务器将能够访问Redis的使用它的V**服务器IP地址。

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

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

第三步:为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服务器现在应该拒绝未经身份验证的请求。

第四步:测试Redis连接和身份验证

要测试您的更改是否按预期工作,请从Web计算机连接到Redis服务。

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

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

  • 隔离网络:使用Redis服务器的隔离网络IP地址。使用默认的Redis端口(6379),因此我们不需要提及它:redis-cli -h redis_isolated_IP
  • stunnelspiped:使用通道连接到远程Redis服务的本地端口:redis-cli -p 8000
  • PeerV**:使用Redis服务器的V** 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

您应该得到一个OK的响应,表明您的密码已被接受。

Web server outputOK

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

keys *

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

Web server output(empty list or set)

此输出仅表示您的Redis服务器为空,这正是我们所期望的。该网站服务器尚未配置为使用此服务器的Redis作为会话处理程序。

输入以下命令退回命令shell:

exit

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

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

现在我们需要在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文件

如果您不确定主文件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命令的相同值。例如,如果您正在使用stunnelspiped,则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会话处理

为了确保您的会话现在由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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 准备
  • 第一步:安装Redis服务器和客户端软件
    • 安装Redis服务器
      • 安装Redis客户端和PHP扩展
      • 第二步:配置Redis以接受外部连接
        • 如果将Redis部署到隔离网络......
          • 如果Redis未部署到隔离网络......
          • 第三步:为Redis服务器设置密码
          • 第四步:测试Redis连接和身份验证
          • 第五步:将Redis设置为Web服务器上的默认会话处理程序
            • (可选)查找正确的php.ini文件
              • 修改配置
              • 第六步:测试Redis会话处理
              • 结论
              相关产品与服务
              云数据库 Redis
              腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档