介绍
Redis 是一个开源的关键值缓存和存储系统,也被称为数据结构服务器,因为它对多个数据类型(如哈希、列表、集和比特图)的先进支持。
在本教程中,我们将看到如何安装和配置外部 Redis 服务器,以作为运行在 Ubuntu 14.04 的 PHP 应用程序的会话处理器。
会话处理器负责存储和检索在会话中保存的数据 - 默认情况下,PHP用于此,可以使用外部会话处理器创建可扩展的PHP环境(https://www.digitalocean.com/company/blog/horizontally-scaling-php-applications/)在负载平衡器(https://andsky.com/tech/tutorials/an-introduction-to-haproxy-and-load-balancing-concepts)后面,所有应用程序节点将连接到中央服务器以共享会话信息。
前提条件
在本教程中,我们将使用两个不同的服务器。出于安全性和性能原因,这很重要,这两个Droplets位于同一个数据中心,启用了 私人网络。
- 在 Ubuntu 14.04 上运行的 PHP 网页服务器 LAMP或 LEMP - 我们将把这个服务器称为 web
- 安装 Redis 的第二个清洁 Ubuntu 14.04 服务器 - 我们将把这个服务器称为 redis
您将需要适当的 SSH 访问到两个服务器作为一个常规用户与 sudo 许可。
<$>[注] 对于 Redis 服务器,您也可以使用我们的 Redis One-Click Application并跳到 Step 2。
步骤1:安装 Redis 服务器
我们需要做的第一件事是让 Redis 服务器启动并运行,在我们的 redis Droplet 上。
我们将使用常规的Ubuntu包管理器与由Chris Lea提供的可信的PPA存储库,这是必要的,以确保我们得到最新的稳定版本的Redis。
<$>[注] 作为一般的安全建议,您只应该使用来自可信来源的PPA。
首先,通过运行添加 PPA 存储库:
1sudo add-apt-repository ppa:chris-lea/redis-server
点击进入
来确认。
现在您需要更新包管理器缓存:
1sudo apt-get update
最后,让我们通过运行来安装Redis:
1sudo apt-get install redis-server
Redis 现在应该安装在您的服务器上. 要测试安装,请尝试以下命令:
1redis-cli ping
这将连接到运行在 localhost 端口 6379上的 Redis 实例。
步骤 2 — 配置 Redis 以接受外部连接
默认情况下,Redis只允许连接到Localhost
,这基本上意味着您只能从安装Redis的服务器内部获得访问,我们需要更改此配置以允许来自同一个私人网络上的其他服务器的连接。
我们需要做的第一件事是找出 Redis 机器的私人网络 IP 地址,然后在 redis 服务器上执行以下步骤。
运行ifconfig
,获取有关您的网络接口的信息:
1sudo ifconfig
你应该得到一个类似于此的输出:
1[secondary_label Output]
2 eth0 Link encap:Ethernet HWaddr 04:01:63:7e:a4:01
3 inet addr:188.166.77.33 Bcast:188.166.127.255 Mask:255.255.192.0
4 inet6 addr: fe80::601:63ff:fe7e:a401/64 Scope:Link
5 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
6 RX packets:3497 errors:0 dropped:0 overruns:0 frame:0
7 TX packets:3554 errors:0 dropped:0 overruns:0 carrier:0
8 collisions:0 txqueuelen:1000
9 RX bytes:4895060 (4.8 MB) TX bytes:619070 (619.0 KB)
10
11 eth1 Link encap:Ethernet HWaddr 04:01:63:7e:a4:02
12 inet addr:10.133.14.9 Bcast:10.133.255.255 Mask:255.255.0.0
13 inet6 addr: fe80::601:63ff:fe7e:a402/64 Scope:Link
14 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
15 RX packets:8 errors:0 dropped:0 overruns:0 frame:0
16 TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
17 collisions:0 txqueuelen:1000
18 RX bytes:648 (648.0 B) TX bytes:578 (578.0 B)
在这种情况下,它是10.133.14.9
- 这是我们以后将使用的IP地址连接到网络服务器的 redis服务器。
使用您最喜欢的命令行编辑器,打开文件 /etc/redis/redis.conf
并寻找包含 bind
定义的行。
1sudo vim /etc/redis/redis.conf
1[label /etc/redis/redis.conf]
2bind localhost 10.133.14.9
如果你看到127.0.0.1
而不是本地主机
,那就很好;只需在已经存在的东西之后添加你的私人IP。
现在您只需要重新启动 Redis 服务来应用这些更改:
1sudo service redis-server restart
<$>[注] 如果您使用我们的单击应用程序安装了 Redis,服务名称将是 redis而不是 redis-server。
随着这种变化,同一私人网络中的任何服务器也将能够连接到这个Redis实例。
步骤 3 – 为 Redis 服务器设置密码
为了为您的 Redis 安装添加一个额外的安全层,建议您为访问服务器数据设置密码. 我们将从前一步中编辑相同的配置文件, /etc/redis/redis.conf
:
1sudo vim /etc/redis/redis.conf
现在,删除包含requirepass
的行,并设置一个强有力的密码:
1[label /etc/redis/redis.conf]
2requirepass yourverycomplexpasswordhere
重新启动 Redis 服务,以便更改生效:
1sudo service redis-server restart
步骤 4 – 测试 Redis 连接和身份验证
要测试您的所有更改是否按预期工作,请从 redis 机器内部连接到 Redis 服务:
1redis-cli -h 10.133.14.9
1[secondary_label Output]
210.133.14.9:6379>
<$>[注]
虽然在这里指定主机
参数不是强制性的(因为我们正在从本地主机
连接),但我们这样做是为了确保Redis服务将接受针对私人网络接口的连接。
如果您定义了密码,现在尝试访问数据,您应该收到 AUTH 错误:
1keys *
1[secondary_label Output]
2(error) NOAUTH Authentication required.
要验证,您只需要运行AUTH
命令,提供您在/etc/redis/redis.conf
文件中定义的相同密码:
1AUTH yourverycomplexpasswordhere
你应该得到一个 OK作为答案. 现在如果你运行:
1keys *
结果应该是这样的:
1[secondary_label Output]
2(empty list or set)
此输出仅意味着您的 Redis 服务器是空的,这正是我们所期望的,因为 web 服务器尚未配置为使用 Redis 服务器作为会话处理器。
保持这个SSH会话打开并连接到redis-cli
当我们执行下一步 - 我们将返回redis-cli
提示,以检查会话数据是否被正确存储,在我们对 web服务器进行必要的更改后。
步骤 5 — 在 Web 服务器上安装 Redis 扩展
我们需要安装 PHP Redis 扩展,否则 PHP 将无法连接到 Redis 服务器。
首先,更新您的包管理器缓存,运行:
1sudo apt-get update
然后安装php5-redis
包:
1sudo apt-get install php5-redis
您的 Web 服务器现在应该能够连接到 Redis。
步骤 6 – 将 Redis 设置为 Web 服务器上的默认会话处理器
现在我们需要在 web服务器上编辑 php.ini
文件,以更改 PHP 的默认会话处理器. 此文件的位置将取决于您当前的堆栈. 在 Ubuntu 14.04 上使用一个 LAMP 堆栈,这通常是 /etc/php5/apache2/php.ini
. 在 Ubuntu 14.04 上使用一个 LEMP 堆栈,路径通常是 /etc/php5/fpm/php.ini
。
如果您不確定您的主要「php.ini」檔案的位置,一個簡單的方法是使用「phpinfo()」函數,只需將下列代碼放入名為「info.php」的檔案中:
1<?php
2phpinfo();
当您从浏览器访问脚本时,请寻找包含加载配置文件
的行,您应该找到加载的主要php.ini
的确切位置。
<$>[注]
不要忘记在以后删除info.php
文件,因为它包含有关您的环境的敏感信息。
打开php.ini
文件并搜索包含session.save_handler
的行。默认值为files
。你应该将其更改为redis
。
关于灯
的环境:
1sudo vim /etc/php5/apache2/php.ini
在轻松
的环境中:
1sudo vim /etc/php5/fpm/php.ini
1[label /etc/php5/fpm/php.ini]
2session.save_handler = redis
现在你应该找到包含 session.save_path
的行。 删除它并更改值,以便包含 Redis 连接字符串。 内容应该按照这个格式,在一个行中: tcp://IPADDRESS:PORT?auth=REDISPASSWORD
1[label /etc/php5/fpm/php.ini]
2session.save_path = "tcp://10.133.14.9:6379?auth=yourverycomplexpasswordhere"
<$>[注] 您只需在配置 Redis 时设置密码时提供参数 auth。
保存文件并重新启动 php服务。
关于灯
的环境:
1sudo service apache2 restart
在轻松
的环境中:
1sudo service php5-fpm restart
步骤7 - 测试 Redis 会议处理
为了确保您的会话现在由Redis处理,您将需要一个PHP脚本或应用程序,存储有关会话的信息. 我们将使用一个简单的脚本,实现计数 - 每次你重新加载页面,印刷的数字增加。
在 web 服务器上创建一个名为 test.php
的文件,并将其放置在您的文档根文件夹中:
1sudo vim /usr/share/nginx/html/test.php
<$>[注]
不要忘了更改 /usr/share/nginx/html
以反映您的文档根路径。
1[label /usr/share/nginx/html/test.php]
2<?php
3//simple counter to test sessions. should increment on each page reload.
4session_start();
5$count = isset($_SESSION['count']) ? $_SESSION['count'] : 1;
6
7echo $count;
8
9$_SESSION['count'] = ++$count;
点击您的浏览器到http://web/test.php
,以便访问脚本. 它应该增加每次重新加载页面的数量。
现在,您应该在 Redis 服务器上存储会话信息。 要验证,请返回您在 redis 机器上的 SSH 会话,我们之前使用redis-cli
连接到 Redis 服务。
1keys *
你应该得到一个类似于此的输出:
1[secondary_label Output]
21) "PHPREDIS_SESSION:j9rsgtde6st2rqb6lu5u6f4h83"
这表明会话信息正在存储在Redis服务器上,您可以以类似的方式连接额外的Web服务器到Redis服务器。
结论
Redis是一个强大而快速的关键值存储服务,也可以作为PHP的会话处理器使用,通过提供会话存储的分布式系统来实现可扩展的PHP环境。