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

介绍

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 网页服务器 LAMPLEMP - 我们将把这个服务器称为 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环境。

Published At
Categories with 技术
Tagged with
comments powered by Disqus