优化会话管理:如何使用 Nginx + PHP + Redis 替代 Memcached 实现高效的 Session 存储
目录
1.在你的 Web 根目录(通常是 /var/www/html)创建一个 PHP 文件(例如 index.php),并加入以下代码:
2.通过浏览器访问 http://localhost/index.php,你应该看到输出:
3.使用 Redis CLI 查看 Session 是否已经被存储在 Redis 中:
在现代 Web 开发中,Session 管理是一个非常重要的部分。传统的 Memcached 通常被用作会话存储,但随着 Redis 的流行,许多开发者选择用 Redis 来替代 Memcached,以便提升性能和可扩展性。本篇博客将详细讲解如何在 Nginx、PHP 和 Redis 环境中配置 Session 存储,并解决可能遇到的重复登录等问题。
一、Memcached vs Redis: 主要区别
| 特性 | Memcached | Redis |
|---|---|---|
| 数据结构 | 仅支持键值对(key-value),数据类型非常简单。 | 支持多种数据结构,如字符串、列表、集合、哈希表、排序集合等。 |
| 数据持久化 | 不支持持久化。数据存储是内存中的缓存。 | 支持持久化(RDB快照和AOF日志),可以将数据保存到磁盘。 |
| 内存管理 | 使用 LRU(Least Recently Used)算法来驱逐数据。 | 支持多种内存管理方式,如 LRU、LFU、最大内存限制等。 |
| 数据过期 | 支持设置数据过期时间,但没有高级的过期策略。 | 支持键过期和高级过期策略(如定时任务、延迟删除等)。 |
| 高可用性与集群支持 | Memcached 本身不支持高可用,通常需要外部工具。 | Redis 支持集群模式,可以实现自动分片,提供高可用和容错能力。 |
| 扩展性 | 非常简单,适用于单节点或外部系统实现分布式。 | 支持水平扩展(Redis Cluster),提供更好的分布式架构。 |
| 性能 | 在读取频繁且数据结构简单的场景中非常高效。 | 在复杂数据操作和大数据量场景下也表现优秀,但可能稍微慢于 Memcached。 |
| 支持的客户端 | 广泛支持多种编程语言和客户端库。 | 同样支持多种编程语言,但由于更多的功能,可能需要更复杂的客户端实现。 |
| 数据安全 | 无内置加密或安全机制,主要依赖于应用层来加密。 | 提供了简单的密码保护和更复杂的 ACL(访问控制列表)功能,安全性更强。 |
二、环境要求
-
操作系统: Centos 或 Ubuntu/Debian(其他 Linux 系统也适用)
-
Web 服务器:Nginx
-
后端语言:PHP7.4
-
缓存与会话存储:Redis
目标
-
将 PHP 的 Session 存储机制替换为 Redis。
-
配置 Nginx 作为 Web 服务器,并使用 PHP-FPM 处理 PHP 请求。
-
使用 Redis 存储 Session 数据,实现会话管理。
三、安装 Redis
在 Centos 上安装 Redis
首先,我们需要在服务器上安装 Redis。执行以下命令来安装 Redis 服务:
直接将下载好后的tar包传到服务器的/root目录下,然后解压
tar -xf redis-4.0.8.tar.gz
cd redis-4.0.8
yum -y install gcc
make && make install
cd utils/
./install_server.sh
然后一直enter就行



安装完成后,默认 Redis 服务自动启动了;
四、安装 Nginx
接下来,我们需要安装 Nginx,作为 Web 服务器来处理 PHP 请求。
我写了一个一键部署nginx的环境,可以直接执行脚本就实现了nginx的环境;
#!/bin/bash
#一键部署nginx
blue='\e[34m]'
green='\e[32m]'
yellow='\e[33m]'
echo -e "${yellow} 安装编译依赖包...${bllue}"
yum -y install gcc make zlib-devel pcre-devel openssl-devel bash-completion net-tools psmisc
if [ $? -ne 0 ]; then
echo -e "${yellow}安装依赖包失败,请检查yum源后重试${blue}"
exit 1
fi
echo -e "${yellow}依赖包安装完成${blue}"
echo -e "${yellow}解压Nginx源码...${blue}"
tar -xf lnmp_soft.tar.gz
cd lnmp_soft
tar -xf nginx-1.16.1.tar.gz
cd nginx-1.16.1
useradd nginx
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module #配置编译选项
make && make install #编译安装
cd ~
setenforce 0
systemctl stop firewalld.service
sed -i -r '65,71s/^[[:space:]]*#//' /usr/local/nginx/conf/nginx.conf
sed -i '70s/.*/include fastcgi.conf;/' /usr/local/nginx/conf/nginx.conf
sed -i '69d' /usr/local/nginx/conf/nginx.conf
/usr/local/nginx/sbin/nginx #启动服务
yum -y install mariadb mariadb-server mariadb-devel php php-mysql php-fpm
systemctl restart mariadb
systemctl enable mariadb
systemctl restart php-fpm
systemctl enable php-fpm
ss -utnalp | grep :3306
ss -utnalp | grep :9000
ss -utnalp | grep :80
# echo "<?php $i=33;echo $i; ?>" > /usr/local/nginx/html/test.php
cat > /usr/local/nginx/html/test.php << 'EOF'
<?php
$i=33;
echo $i;
?>
EOF
/usr/local/nginx/sbin/nginx -s reload
vim nginx.sh
chmod +x nginx.sh
./nginx.sh

能够监听到这三个端口就说明安装完成了;

五、安装 PHP Redis 扩展
为了让 PHP 能够与 Redis 进行通信,我们需要安装 PHP Redis 扩展。
yum -y install php-pecl-redis
或者yum install php-redis
需要联网进行下载,可以下载阿里云的镜像或者清华源
和之前 Memcached 的设置类似,现在我们将 session.save_handler 设置为 Redis,并指定 Redis 的服务器地址和端口。
修改 PHP 配置文件:
vim /etc/php.ini
找到并修改以下两行配置:
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"

重启 PHP-FPM 服务:
systemctl restart php-fpm
六、配置 Nginx 支持 PHP
Nginx 本身不直接支持 PHP,因此我们需要通过 PHP-FPM 来处理 PHP 请求。以下是如何配置 Nginx 以支持 PHP。
配置 Nginx 处理 PHP 请求
打开 Nginx 配置文件,通常位于 /etc/nginx/nginx.conf
做到这里我发现redis扩展需要升级到 PHP 7.x 或 8.x 版本,然后我进行了更新
yum install -y yum-utils
yum-config-manager --enable remi-php74
yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum-config-manager --enable remi-php74
yum install php php-cli php-fpm php-mysqlnd php-pear php-devel

打开 Nginx 配置文件,通常位于/usr/local/nginx/conf/nginx.conf
在 server 块中添加以下内容来处理 PHP 请求:
server {
listen 80;
server_name localhost;
root /var/www/html; # 你的网站根目录,确保存在 index.php
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}


snippets/fastcgi-php.conf这个文件默认是没有的,需要添加一个这个文件
mkdir /usr/local/nginx/conf/snippets/
vim /usr/local/nginx/conf/snippets/fastcgi-php.conf
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
在这里,fastcgi_pass 指定了 PHP-FPM 的 socket 地址。根据你的系统和 PHP 版本,路径可能有所不同。
七、测试 PHP 使用 Redis 存储 Session
现在,一切都已配置完成。接下来,我们来测试 PHP 是否成功使用 Redis 存储 Session。
1.在你的 Web 根目录(通常是 /var/www/html)创建一个 PHP 文件(例如 index.php),并加入以下代码:
<?php
session_start();
// 设置 Session
if (!isset($_SESSION['username'])) {
$_SESSION['username'] = 'user123';
}
echo 'Hello, ' . $_SESSION['username'];
?>
2.通过浏览器访问 http://localhost/index.php,你应该看到输出:
curl http://localhost/index.php

3.使用 Redis CLI 查看 Session 是否已经被存储在 Redis 中:
redis-cli
keys PHPREDIS_SESSION:* # 查看所有 Redis 中的 PHP Session
get PHPREDIS_SESSION:<session_id> # 查看某个 Session 数据
浏览器也可以访问


八、总结
通过本篇教程,你已经成功配置了 Nginx + PHP + Redis 来存储 PHP 的 Session 数据。关键步骤如下:
-
安装并启动 Redis。
-
安装并配置 Nginx 与 PHP-FPM,确保 PHP 能正确处理请求。
-
配置 PHP 使用 Redis 存储 Session 数据。
-
使用 Redis CLI 确认 Session 是否已正确存储。
更多推荐
所有评论(0)