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

介绍

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服务进行通信。
  • 使用PeerVPN设置VPN:需要在VPN上访问这两个服务器。该网站服务器将能够访问Redis的使用它的VPN服务器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
  • 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

您应该得到一个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》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯云Elasticsearch Service

Elasticsearch跨集群数据迁移之离线迁移

用户在腾讯云上自建的ES集群或者在其它云厂商购买的ES集群,如果要迁移至腾讯云ES,用户可以根据自己的业务需要选择适合自己的迁移方案。如果业务可以停服或者可以暂...

2.4K8
来自专栏Lambda

Ubuntu下SVN安装和配置

Ubuntu下SVN安装和配置 一、SVN安装 1.安装包 1.$ sudo apt-get install subversion 2.创建项目目...

2757
来自专栏我的小碗汤

vmware上安装linux过程记录

以前的电脑上安装过vmware+redhat,但是奈何电脑太老,配置太低,打开的时候超级卡,没法用。换了电脑后,再装上玩玩,故此记录一下安装过程。需要安装的小伙...

942
来自专栏雨过天晴

原 PHPStrom 9系列激活码

1764
来自专栏地方网络工作室的专栏

CentOS 7 配置 Nginx + php + mysql 搭建 lnmp 环境过程全纪录

CentOS 7 配置 Nginx + php + mysql 搭建 lnmp 环境过程全纪录 昨天搞了一个美国的便宜 VPS 给朋友搭建一个简单的 php+m...

1.5K9
来自专栏守望轩

Visual Studio 2008 每日提示(二十七)

#261、按Ctrl+Alt+B打开断点窗口 原文链接:You can press Ctrl+Alt+B to open the Breakpoint Win...

3186
来自专栏云计算教程系列

如何在Debian 8上用mod_proxy将Apache设置为反向代理

reverse proxy(反向代理)是一种代理服务器,它接收HTTP(S)请求并将它们透明地分发到一个或多个后端服务器。反向代理非常实用,因为许多现代Web应...

1163
来自专栏码神联盟

Nginx | Java工程师必备课 之 Linux下安装Nginx

2013
来自专栏JavaEdge

SpringBoot+Security 发送短信验证码在core模块下properties包中创建SmsCodeProperties在ValidateCodeProperties中new一个SmsCo

2906
来自专栏苦逼的码农

Linux达人养成计划2---虚拟机下的网络配置

当然也可以选择其他模式,不过这里,我们只讲桥接模式的,至于三种模式的区别,可以自行百度一下。

1153

扫码关注云+社区