目录

一、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: 主要区别

特性 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 数据。关键步骤如下:

  1. 安装并启动 Redis

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

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

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

Logo

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

更多推荐