ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CentOS 7手动编译安装Redis 7.2.4超详细指南与避坑实践

CentOS 7手动编译安装Redis 7.2.4超详细指南与避坑实践

1. 项目概述与核心价值

最近在给一个线上服务做架构优化,发现不少同事在本地开发或者测试环境搭建Redis时,总是会遇到各种“拦路虎”。要么是编译报错,要么是启动失败,要么是配置不对导致连接不上。虽然网上教程很多,但要么步骤跳跃太大,要么环境依赖没讲清楚,照着做很容易掉坑里。所以,我决定结合自己多次在CentOS 7上部署Redis的经验,写一份从零开始、手把手式的超详细指南。这份指南的目标很明确:让一个对Linux操作只有基础了解的朋友,也能一次成功地把Redis跑起来

Redis,这个高性能的键值对内存数据库,如今已经是后端开发的标配了。无论是做会话缓存、消息队列,还是实现排行榜、计数器这类功能,它都能大显身手。而CentOS 7,作为一款经典、稳定的企业级Linux发行版,至今仍在大量生产环境中服役。因此,掌握在CentOS 7上手动编译安装Redis这项技能,不仅有助于你理解Redis的构成,更能让你在服务器没有外网、或需要特定版本时游刃有余。整个过程会涉及系统更新、编译工具安装、源码下载、编译、安装、配置、服务化以及基础测试。我会把每一步的意图、可能遇到的坑以及解决方案都讲透,确保你“亲测可行”。

2. 环境准备与依赖安装

在开始编译Redis之前,我们必须为它准备好一个“干净且强壮”的编译环境。这就像盖房子前要先打好地基、备齐建材一样。很多安装失败的问题,根源都出在这一步。

2.1 系统更新与基础检查

首先,我们需要确保系统是最新的,并且获取必要的软件源信息。使用yum包管理器来完成这个任务是最佳选择。

sudo yum update -y

这条命令会更新系统中所有已安装的软件包到最新版本。-y参数表示自动确认所有提示,让过程无需人工干预。虽然对于安装Redis来说,不更新系统也可能成功,但保持系统更新是一个好习惯,可以修复已知的安全漏洞和软件缺陷。

接下来,检查一下系统版本,确认我们确实在CentOS 7上操作:

cat /etc/redhat-release

预期的输出应该是类似CentOS Linux release 7.9.2009 (Core)这样的信息。

注意:整个安装过程建议在具有sudo权限的普通用户下进行,而非直接使用root用户,这符合最小权限原则,更安全。如果某些命令需要root权限,我会在前面加上sudo

2.2 安装编译工具链(GCC, Make)

Redis是使用C语言编写的,因此我们需要C语言的编译器——GCC(GNU Compiler Collection),以及项目管理工具——Make。CentOS 7最小化安装默认是不包含这些开发工具的。

安装命令非常简单:

sudo yum install -y gcc make

执行这条命令,yum会自动解决依赖关系,将gccmake以及它们所需的一系列库(如glibc-devel)一并安装好。

这里有一个至关重要的“坑”需要提前预警:CentOS 7默认仓库中的GCC版本是4.8.5。这个版本对于编译Redis 6.0及以上版本是不够的!Redis 6.0开始默认使用_Atomic关键字等C11标准特性,而GCC 4.8.5对C11的支持不完整,会导致编译失败,报错信息可能包含“_Atomic”未定义等。

解决方案有两种:

  1. 安装高版本GCC(推荐):我们可以通过Developer Toolset来安装更新的GCC,例如版本7或8。

    # 安装Software Collections仓库,它提供了更新的开发工具 sudo yum install -y centos-release-scl # 安装Developer Toolset 8(包含GCC 8) sudo yum install -y devtoolset-8-gcc devtoolset-8-gcc-c++ devtoolset-8-make # 临时启用GCC 8环境(仅对当前会话有效) scl enable devtoolset-8 bash

    启用后,你可以通过gcc --version验证版本是否已变为8.x。请注意scl enable命令的效果是临时的。如果你断开SSH连接再重新登录,环境会恢复默认。为了持久化,可以将scl enable devtoolset-8 bash添加到你的用户~/.bashrc文件中。

  2. 安装较低版本的Redis:如果你坚持使用系统自带的GCC 4.8.5,那么你需要下载Redis 5.x版本(例如5.0.14)的源码进行编译,这个版本对编译器要求较低。

为了教程的通用性和前瞻性,后续步骤将基于已启用GCC 8(或更高)的环境进行。这是目前在新服务器上安装Redis更推荐的方式。

2.3 其他可能需要的依赖

除了GCC和Make,根据实际情况,可能还需要安装tcl组件,因为Redis源码包中的make test命令需要它来运行测试套件(虽然我们通常不强制要求运行测试,但安装上也无妨)。

sudo yum install -y tcl

至此,我们的编译“地基”已经打牢。可以进入下一步,获取Redis的“蓝图”——源代码。

3. 获取Redis源码与编译安装

有了坚实的编译环境,我们现在可以开始处理Redis本体了。手动编译安装的好处在于,我们可以自由选择版本,并且安装目录清晰可控。

3.1 下载Redis源码包

我们将从Redis的官方Github仓库下载稳定版本的源码。这里以写作时的最新稳定版7.2.4为例。通常,我们会将源码下载到/usr/local/src目录,这是一个存放本地软件源码的惯例位置。

# 进入源码目录 cd /usr/local/src # 使用wget下载Redis源码压缩包 sudo wget https://github.com/redis/redis/archive/refs/tags/7.2.4.tar.gz

如果服务器没有wget,可以先安装它:sudo yum install -y wget。也可以使用curl -O命令来下载。

下载完成后,使用tar命令解压:

sudo tar -xzvf 7.2.4.tar.gz

解压后会生成一个名为redis-7.2.4的目录。我们进入这个目录开始编译:

cd redis-7.2.4

3.2 编译源码

编译过程非常简单,就是标准的make命令。这个命令会读取目录下的Makefile文件,自动执行编译、链接等一系列操作。

sudo make

如果一切顺利,你会看到大量的编译输出信息,最后没有报错即表示编译成功。这个过程可能会持续几分钟,取决于服务器的CPU性能。

实操心得make命令默认会使用所有可用的CPU核心进行并行编译以加快速度。如果你想指定核心数,可以使用-j参数,例如make -j4表示使用4个核心。但有时并行编译可能会因依赖问题出错,如果遇到奇怪的编译错误,可以尝试不加-j参数,单线程编译:make MALLOC=libc。这里的MALLOC=libc是另一个有用的选项,它指定Redis使用系统的libc内存分配器,而不是它自带的jemalloc。在某些特定环境下(比如 Alpine Linux),使用jemalloc可能会出问题,这时就可以用这个参数。

3.3 运行测试(可选但建议)

编译完成后,强烈建议运行Redis自带的测试套件,以确保编译出的二进制文件在你的系统上能正常工作。

sudo make test

测试过程会比较长,可能需要十几分钟到半小时。你会看到很多[ok]的测试通过信息。如果最终出现\o/ All tests passed without errors!的提示,那就恭喜你,Redis编译得非常健康。

注意事项:运行make test需要之前安装的tcl组件。如果测试过程中有少量非关键性测试失败(通常与系统负载、内存或特定功能相关),有时也可以忽略,Redis基本功能可能仍是正常的。但如果出现大量失败或关键模块失败,就需要回头检查编译环境或源码完整性了。

3.4 安装到系统目录

测试通过后,就可以将编译好的Redis文件安装到系统的指定目录了。标准的安装路径是/usr/local

sudo make install

这条命令会将Redis的几个关键可执行文件(如redis-serverredis-cli)复制到/usr/local/bin/目录下。这个目录通常已经包含在系统的PATH环境变量中,这意味着你可以在任何位置直接运行redis-server来启动Redis了。

至此,Redis的编译和安装已经完成。你可以通过以下命令验证安装是否成功:

redis-server --version redis-cli --version

它们应该能正确输出对应的版本信息。

4. Redis服务配置与优化

直接运行redis-server会以前台模式启动,并使用默认配置。这适合临时测试,但对于生产或长期运行的服务,我们需要对其进行配置,并设置为后台服务(守护进程)。

4.1 创建专属目录与配置文件

为了管理清晰,我们为Redis创建专属的工作目录,并放置配置文件。

# 创建配置、数据、日志和进程文件目录 sudo mkdir -p /etc/redis sudo mkdir -p /var/lib/redis sudo mkdir -p /var/log/redis sudo mkdir -p /var/run/redis # 从源码目录复制一份默认配置文件到/etc/redis sudo cp /usr/local/src/redis-7.2.4/redis.conf /etc/redis/6379.conf

这里以端口号6379作为配置文件名,这是一种常见的做法,方便同一台机器上运行多个Redis实例。

4.2 编辑主配置文件

接下来,我们需要修改/etc/redis/6379.conf中的一些关键配置项。使用vimnano进行编辑:

sudo vim /etc/redis/6379.conf

需要修改或确认的配置项如下(找到对应行并修改):

  1. 守护进程模式:让Redis在后台运行。
    daemonize yes
  2. 监听地址:默认只监听127.0.0.1,意味着只能本机访问。如果希望其他服务器也能连接,可以改为0.0.0.0注意安全风险,务必配合密码和防火墙),或者指定服务器内网IP。
    bind 127.0.0.1 -::1 # 保持只监听本地回环地址,最安全 # 或 bind 0.0.0.0 # 监听所有网络接口
  3. 保护模式:如果bind设置为非本地地址,且未设置密码,保护模式会拒绝外部连接。根据你的bind设置调整。
    protected-mode yes # 如果bind是127.0.0.1,这个保持yes即可
  4. 端口号:默认端口。
    port 6379
  5. 数据持久化目录:指定RDB和AOF文件存放位置。
    dir /var/lib/redis
  6. 日志文件:指定日志输出文件。
    logfile /var/log/redis/redis-6379.log
  7. 进程ID文件:指定存储PID的文件位置。
    pidfile /var/run/redis/redis-6379.pid
  8. 设置访问密码(强烈建议生产环境设置):取消requirepass的注释,并设置一个强密码。
    requirepass YourStrongPassword123!
  9. 最大内存限制:根据服务器物理内存设置,防止Redis占用过多内存导致系统崩溃。例如,给一台8G内存的服务器上的Redis分配4G。
    maxmemory 4gb maxmemory-policy allkeys-lru # 内存满时的淘汰策略

配置心得:修改配置文件时,建议一次只修改几个关键项,然后启动测试,避免因配置错误导致无法启动。对于不理解的配置项,最好先查阅官方文档的注释(配置文件本身注释非常详细),不要盲目修改。

4.3 创建Systemd服务单元文件(服务化)

为了让Redis能像系统服务一样通过systemctl命令管理(启动、停止、重启、开机自启),我们需要创建一个systemd服务文件。

创建文件:

sudo vim /etc/systemd/system/redis.service

将以下内容写入该文件:

[Unit] Description=Redis In-Memory Data Store After=network.target [Service] Type=forking User=redis Group=redis ExecStart=/usr/local/bin/redis-server /etc/redis/6379.conf ExecStop=/usr/local/bin/redis-cli -p 6379 shutdown PIDFile=/var/run/redis/redis-6379.pid Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target

关键点解析

  • User=redisGroup=redis:为了安全,我们不建议以root身份运行Redis服务。接下来我们需要创建一个名为redis的专属系统用户和组。
  • Type=forking:因为我们在配置文件中设置了daemonize yes,Redis会以守护进程(fork)方式启动,所以这里要指明类型。
  • ExecStop:定义了如何优雅地停止服务,这里使用redis-cli发送shutdown命令。
  • Restart=on-failure:当服务异常退出时自动重启。
  • LimitNOFILE=65536:提高Redis进程可打开的文件描述符数量限制,对于高并发连接很重要。

4.4 创建Redis专属用户并授权

创建redis用户和组,并将相关目录的所有权赋予该用户。

# 创建redis系统用户组和用户,且不创建家目录 sudo groupadd -r redis sudo useradd -r -g redis -s /bin/false -M redis # 将数据、日志、运行目录的所有权给redis用户 sudo chown -R redis:redis /var/lib/redis sudo chown -R redis:redis /var/log/redis sudo chown -R redis:redis /var/run/redis # 配置文件目录,redis用户需要读权限 sudo chown redis:redis /etc/redis/6379.conf sudo chmod 640 /etc/redis/6379.conf # 配置文件权限收紧,只允许redis用户读写,同组用户只读

5. 启动、验证与基础操作

所有配置完成后,我们就可以启动Redis服务并验证其运行状态了。

5.1 启动并设置开机自启

首先,重新加载systemd配置,使其识别新创建的redis.service文件。

sudo systemctl daemon-reload

启动Redis服务:

sudo systemctl start redis

检查服务运行状态:

sudo systemctl status redis

如果看到绿色的active (running)字样,说明服务已成功启动。

设置Redis开机自动启动:

sudo systemctl enable redis

5.2 使用redis-cli连接测试

现在,使用Redis自带的命令行客户端redis-cli进行连接测试。

# 如果未设置密码,直接连接 redis-cli # 如果设置了密码,使用-a参数连接(不推荐,密码会出现在历史命令中) # redis-cli -a YourStrongPassword123! # 更安全的带密码连接方式:先连接,再认证 redis-cli 127.0.0.1:6379> AUTH YourStrongPassword123! OK

连接成功后,可以执行一些基本命令测试:

127.0.0.1:6379> PING PONG 127.0.0.1:6379> SET mykey "Hello, Redis!" OK 127.0.0.1:6379> GET mykey "Hello, Redis!" 127.0.0.1:6379> INFO server # 这里会输出一大堆服务器信息,看开头部分确认版本和运行时间即可

看到PONG回应和正常的键值操作,说明Redis服务完全正常。

5.3 防火墙配置(如果需远程连接)

如果你的服务器开启了防火墙(如firewalld),并且你需要从其他机器连接这个Redis,那么需要开放对应的端口(默认6379)。

# 查看防火墙状态 sudo systemctl status firewalld # 如果防火墙是active状态,添加端口规则 sudo firewall-cmd --permanent --add-port=6379/tcp sudo firewall-cmd --reload # 验证端口是否开放 sudo firewall-cmd --list-ports

再次强调:开放端口到公网(bind 0.0.0.0)且仅使用密码保护风险依然很高。生产环境务必考虑结合SSL/TLS加密、IP白名单(通过防火墙或Redis的bind指令精细控制)等多重安全措施。

6. 常见问题排查与解决实录

即便按照详细步骤操作,由于系统环境的细微差异,也可能遇到问题。这里记录几个我亲自踩过或帮同事解决过的典型问题。

6.1 编译阶段问题

问题1:make命令失败,提示/bin/sh: cc: command not found或类似错误。

  • 原因:GCC编译器没有正确安装。cc通常是GCC的软链接。
  • 解决:重新执行sudo yum install -y gcc make确保安装成功。安装后可以用gcc --versioncc --version验证。

问题2:编译Redis 6+时,出现关于_Atomic的编译错误。

  • 原因:GCC版本过低(<4.9),不支持C11标准。
  • 解决:按照本文2.2节的方法,安装并启用devtoolset-8或更高版本。或者,降级安装Redis 5.x版本。

问题3:make test时大量测试失败,尤其是OOM(内存不足)错误。

  • 原因:测试套件需要消耗较多内存,如果虚拟机或云主机内存分配过小(如小于1GB),可能导致测试失败。
  • 解决:可以忽略测试,直接进行sudo make install。对于生产环境,只要基础编译通过,且后续功能测试正常,可以接受。如果条件允许,给测试环境分配更多内存再运行测试是更好的选择。

6.2 启动阶段问题

问题4:使用systemctl start redis失败,status显示failed

  • 排查:这是最常见的问题。首先查看Redis的日志文件,这是定位问题的第一现场。
    sudo tail -f /var/log/redis/redis-6379.log
  • 常见日志错误及解决
    • Creating Server TCP listening socket *:6379: bind: Address already in use:端口6379已被其他进程占用。用sudo ss -tlnp | grep :6379查找并结束占用进程,或修改Redis配置文件中的port
    • Fatal error, can‘t open config file ‘/etc/redis/6379.conf‘:配置文件路径错误或权限不足。检查文件是否存在,并确保redis用户有读取权限(sudo chmod 640 /etc/redis/6379.conf)。
    • Permission denied关于/var/lib/redis或日志文件:目录或文件的所有权/权限不对。确保这些目录的所有者是redis:redis(参考4.4节)。
    • Can‘t chdir to ‘/var/lib/redis‘: No such file or directory:配置文件中dir指定的目录不存在。手动创建它并赋予正确权限。

问题5:服务能启动,但redis-cli连接不上,提示Could not connect to Redis at 127.0.0.1:6379: Connection refused

  • 排查
    1. 确认服务真的在运行:sudo systemctl status redis
    2. 确认Redis监听的地址:检查配置文件中的bind设置。如果是127.0.0.1,那么只能从本机连接。如果你在服务器本机执行redis-cli,那应该没问题。如果是从其他机器连接,需要将bind改为服务器内网IP或0.0.0.0(并处理好安全)。
    3. 确认防火墙是否拦截:在服务器本机用redis-cli -h 127.0.0.1连接试试,如果本机能连但外部不能,就是防火墙或bind设置问题。

6.3 性能与配置问题

问题6:Redis响应变慢,INFO命令显示used_memory接近maxmemory

  • 原因:触发了配置的内存上限,Redis可能在进行频繁的内存淘汰(eviction)或写操作被阻塞。
  • 解决:检查maxmemory-policy设置是否合理(如allkeys-lru)。考虑是否需要对数据进行分片(使用Redis Cluster),或者升级服务器内存。同时,检查是否有内存泄漏(不合理的键值增长),优化业务代码。

问题7:发现服务器内存被大量占用,但Redis的used_memory并不高。

  • 原因:可能是Redis使用的内存分配器(如jemalloc)的内存碎片问题,或者系统缓存(Cache)占用了大量内存。Linux系统会利用空闲内存做磁盘缓存,这是正常且有益的。
  • 排查:使用free -h命令查看内存,关注available列,它表示应用程序可用的内存。如果available内存充足,则无需担心cache/buffer占用的部分。

手动编译安装Redis的过程,就像亲手组装一台精密的仪器。虽然比直接用yum install redis步骤多,但你能清晰地知道每一个文件在哪,每一项配置起什么作用,出了问题也知道从何查起。这份掌控感,对于运维和开发来说都非常宝贵。尤其是在定制化需求高、网络受限或需要特定版本的环境下,这项技能更是必不可少。希望这份超详细的指南,能帮你扫清所有障碍,一次搞定Redis的安装与配置。如果在操作中遇到本指南未覆盖的奇怪问题,多看看/var/log/redis/redis-6379.log文件,那里通常藏着答案。

返回列表