介绍
Redis是一个开源的键值缓存和存储系统,也称为数据结构服务器,用于对几种数据类型(例如散列,列表,集合和位图等)的高级支持。 它还支持集群,这使得它经常用于高可用性和可扩展的环境。
在本教程中,我们将看到如何安装和配置一个外部Redis服务器,用作在Ubuntu 14.04上运行的PHP应用程序的会话处理程序。
会话处理程序负责存储和检索保存到会话中的数据-在默认情况下,PHP使用文件的。 外部会话处理器可以用于创建可缩放的PHP环境后面的负载均衡器 ,其中,所有的应用程序的节点将连接到中央服务器共享会话信息。
先决条件
在本教程中,我们将使用两个不同的服务器。 出于安全和性能方面的原因,但重要的是这两个Droplet都位于同一个数据中心与专用网络启用。 这是你需要的:
你需要正确的SSH访问两个服务器与一个普通用户sudo的权限 。
对于Redis的服务器,也可以使用我们的Redis一点击应用 ,然后跳到第2步 。
第1步 - 安装Redis服务器
我们需要做的第一件事就是让Redis的服务器运行起来,我们Redis的Droplet。
我们将使用由Chris Lea提供的可信PPA存储库的常规Ubuntu软件包管理器。 这是必要的,以确保我们得到最新的稳定版本的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上的本地主机上运行一个Redis的实例。 你应该得到一个PONG作为回应。
第2步 - 配置Redis接受外部连接
默认情况下,Redis的只允许连接localhost
,这基本上意味着you'll只能从安装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)
外观为inet_addr
分配到eth1接口。 在这种情况下,它是10.133.14.9
-这是我们将使用后连接到从Web服务器的redis的服务器的IP地址。
使用您喜欢的命令行编辑器,打开文件/etc/redis/redis.conf
并查找包含该行bind
定义。 你应该添加你的专用网络IP地址线,如下所示:
sudo vim /etc/redis/redis.conf
bind localhost 10.133.14.9
如果你看到127.0.0.1
而不是localhost
那很好; 只是添加你的私人IP之后已经有。
现在你只需要重新启动Redis服务来应用更改:
sudo service redis-server restart
如果你使用我们的一键式应用程序安装的Redis,服务名称将是Redis的 ,而不是Redis的服务器 。 重新启动它,你应该运行: sudo service redis restart
。
通过此更改,同一专用网络中的任何服务器也将能够连接到此Redis实例。
第3步 - 为Redis服务器设置密码
要为Redis安装添加额外的安全性层次,建议您设置访问服务器数据的密码。 我们将编辑从以前的工序中,相同的配置文件/etc/redis/redis.conf
:
sudo vim /etc/redis/redis.conf
现在,取消包含行requirepass
,并设置强密码:
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
你应该得到一个确定的答复。 现在如果你运行:
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服务器上的默认会话处理程序
现在,我们需要编辑php.ini
文件中的Web服务器上修改PHP的默认会话处理程序。 此文件的位置将取决于您当前的。 对于在Ubuntu 14.04一的LAMP,这通常是/etc/php5/apache2/php.ini
。 对于LEMP在Ubuntu 14.04,该路径通常是/etc/php5/fpm/php.ini
。
如果你不确定你的主要位置php.ini
文件,一个简单的方法来找出是使用函数phpinfo()
。 只要将一个文件名为下面的代码info.php
Web根目录下:
<?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
session.save_handler = redis
现在,你应该找到包含该行session.save_path
。 取消注释它并更改值,使其包含Redis连接字符串。 内容应符合下列格式,都在同一个行: tcp://IPADDRESS:PORT?auth=REDISPASSWORD
session.save_path = "tcp://10.133.14.9:6379?auth=yourverycomplexpasswordhere"
你只需要提供参数AUTH如果你没有配置Redis的时候设置一个密码。
保存文件并重新启动PHP服务。
在LAMP环境:
sudo service apache2 restart
在LEMP环境:
sudo service php5-fpm restart
第7步 - 测试Redis会话处理
为了确保您的会话现在由Redis处理,您需要一个PHP脚本或应用程序来存储有关会话的信息。 我们将使用一个简单的脚本来实现一个计数器 - 每次重新加载页面,打印的数字都会增加。
创建一个文件名为test.php
Web服务器上,并把它放在你的文档根目录文件夹中:
sudo vim /usr/share/nginx/html/test.php
不要忘了更改/usr/share/nginx/html
,以反映您的文档根路径。
<?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服务器上。 为了验证,回到你的SSH会话Redis的机器,我们以前连接到使用Redis的服务上redis-cli
。 再次与获取内容keys *
:
keys *
你应该得到类似这样的输出:
Output1) "PHPREDIS_SESSION:j9rsgtde6st2rqb6lu5u6f4h83"
这表明会话信息存储在Redis服务器上。 您可以以类似的方式将其他Web服务器连接到Redis服务器。
结论
Redis是一个强大而快速的键值存储服务,也可以用作PHP的会话处理程序,通过为会话存储提供分布式系统来实现可扩展的PHP环境。 有关扩展的PHP应用程序的更多信息,你可以查看这篇文章: 水平扩展PHP应用程序 。