目录

一、Memcached vs Redis: 主要区别

二、环境要求

目标

三、安装 Redis

四、安装 Nginx

五、安装 PHP Redis 扩展

修改 PHP 配置文件:

六、配置 Nginx 支持 PHP

配置 Nginx 处理 PHP 请求

七、测试 PHP 使用 Redis 存储 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,以便提升性能和可扩展性。本篇博客将详细讲解如何在 NginxPHPRedis 环境中配置 Session 存储,并解决可能遇到的重复登录等问题。

一、Memcached vs Redis: 主要区别

特性MemcachedRedis
数据结构仅支持键值对(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 数据。关键步骤如下:

  1. 安装并启动 Redis

  2. 安装并配置 NginxPHP-FPM,确保 PHP 能正确处理请求。

  3. 配置 PHP 使用 Redis 存储 Session 数据。

  4. 使用 Redis CLI 确认 Session 是否已正确存储。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐