尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Linux 下 Redis 安装全流程:源码编译、配置调优与安全加固

Linux 下 Redis 安装全流程:源码编译、配置调优与安全加固 在 Linux 上折腾过几回 Redis 之后我有个很直接的感受这东西入门门槛极低但真正装得干净、配得稳、后面不闹心其实挺讲究。缓存、会话共享、排行榜、轻量消息队列、分布式锁这些高频场景绕来绕去最后基本都落到 Redis 头上而绝大多数生产环境的宿主机又是 Linux所以「在 Linux 里把 Redis 装好」几乎成了后端、运维、测试甚至前端同学都绕不开的一步。我见过太多人照着某篇教程三条命令敲完redis-server一启动就觉得完事结果第二天发现外网裸奔、重启后进程消失、配置文件改了不生效。这篇就把我自己在几台不同发行版机器上装 Redis 的完整过程原样记录下来从环境确认、源码编译、包管理器安装、容器部署一路到验证和排错按步骤走基本不会翻车新手可以照着抄有经验的同学也能在配置和安全那几段里捡到点东西。1. 安装前必须先搞清楚的三件事1.1 先确认发行版、内核和 glibc别急着敲命令很多人打开终端第一件事就是复制粘贴wget和make结果在编译阶段报一堆看不懂的错。其实花两分钟做环境确认能省掉后面半小时的排错。先搞清楚你的系统底子主要看三个维度发行版类型决定用apt还是yum/dnf、有没有可用的编译器、以及 glibc 版本决定能不能直接跑官方预编译包。cat /etc/os-release # 看发行版和版本号 uname -r # 看内核版本 ldd --version # 看 glibc 版本 gcc --version || echo 没有gcc这几条命令跑完你心里就有数了。发行版是 Ubuntu/Debian 系还是 CentOS/RHEL 系直接决定你后面软件包安装命令怎么写内核版本意义不大但如果是在很老的内核上跑新版本 Redis个别特性会有限制glibc 版本则主要影响你能否使用某些系统自带的包。举几个我实际踩过的典型场景在 CentOS 7 这种老系统上默认 gcc 是 4.8装 Redis 6 以上版本时会直接编译报错提示某些 C 标准特性不支持这时候要么升级 gcc要么退回装 Redis 5在极小化的容器镜像里连wget和make都没有得先用包管理器补上。还有一种情况是公司内网机器DNS 配置有问题wget官网域名直接卡住这种跟 Redis 本身无关但会浪费你大量时间排查。所以这一步的核心逻辑是把「环境问题」和「Redis 问题」提前分开后面出错了才知道往哪个方向想。提示如果你只是本地学习容器或虚拟机都行但如果是生产环境务必先确认这台机器是不是还有别的服务在跑端口 6379 是否被占用别装完才发现冲突。1.2 三种安装路径哪种适合你Linux 上装 Redis 主流就三条路源码编译安装、系统包管理器安装、容器化部署。这三条路没有绝对优劣只有适不适合你的场景我把它们放在一张表里对比你看完基本就能拍板。安装方式版本新旧可控性操作复杂度典型场景源码编译想装哪个版本都行最高中等生产环境、需要指定版本包管理器apt/yum跟随发行版偏旧一般最低快速验证、学习测试容器Docker镜像版本自由高中等微服务、需要多实例我先说源码编译为什么值得优先考虑。包管理器装的默认版本往往滞后好几个大版本比如某些系统的源里还是 Redis 4 或 5而官方稳定版早就更新到 7.x数据结构、持久化、集群能力差一大截。源码编译的优势是版本完全由你控制编译参数、安装目录、配置文件都是你自己定的出了问题也好定位。它的成本是要自己解决依赖、自己写服务托管配置但这份成本换来的掌控感在生产环境里很值。包管理器安装的优势就是一个字快apt install redis-server下去服务、配置、开机自启全给你安排明白适合临时起个环境跑测试。容器方式则介于两者之间镜像本身就是官方编译好的省去了编译过程又有不错的隔离性特别适合在一台机器上跑多个 Redis 实例、或者配合编排工具使用。我的建议是学习阶段用包管理器或容器先跑通手感真要上生产就用源码编译把版本和配置捏在自己手里。1.3 安装前的目录与用户规划正式动手前我习惯先规划好两件事用哪个用户跑 Redis、数据文件放哪。很多教程图省事直接用 root 跑测试无所谓生产环境这是大忌——一旦 Redis 被攻击这个后面讲root 权限意味着对方能拿到整台机器。所以我一般在安装前就创建一个专用账号比如就叫redis让它只对自己相关的目录有权限。# 创建专用用户禁止登录 sudo useradd -r -s /sbin/nologin redis # 规划目录 sudo mkdir -p /opt/redis/{conf,data,logs} sudo chown -R redis:redis /opt/redis这几步看着不起眼但它是后面服务托管和权限隔离的基础。目录规划的直接好处是升级时源码目录可以随便删数据目录和配置目录独立保留不会误删自己的数据。我见过有人把 dump 文件放在源码目录里清理旧版本时一删几天的缓存全没了。这类问题不是技术难点纯粹是习惯问题但代价往往是真实的。2. 源码编译安装全流程拆解2.1 装依赖、下源码把地基打牢源码编译的第一步是补依赖。Redis 用 C 写的编译需要 gcc、make 这些基础工具不同发行版命令不一样# Debian/Ubuntu 系 sudo apt update sudo apt install -y gcc make wget tar pkg-config build-essential # CentOS/RHEL 系 sudo yum install -y gcc make wget tar如果你用的是 CentOS 7 这种 gcc 偏老的系统建议升级到 gcc 9 以上再编 Redis 6否则会卡在编译中段报错。升级方式一般是通过 scl 或者手动装 devtoolset不同环境细节不一样核心思路就是让编译器认识新版本 Redis 用到的 C 语言特性。依赖装好后去官方渠道下载源码包注意认准官方域名避免下到不干净的包。cd /usr/local/src wget https://download.redis.io/releases/redis-7.2.4.tar.gz tar -xzf redis-7.2.4.tar.gz cd redis-7.2.4这里有个小提醒下载前先看一眼官网当前的稳定版号别用几年前的老教程里的版本号那些地址可能都失效了。解压后进入目录你应该能看到src、deps、redis.conf这些东西如果tar解压时报「归档文件损坏」多半是下载没完成或者网络中断重新下就行跟系统编码没关系顺带说一句有些同学在 Windows 解压再传到 Linux 会出现文件名乱码所以推荐全程在 Linux 里操作。2.2 编译与安装看懂参数再动手依赖和源码都齐了直接 make 就能编但我想让你理解几个参数别只当黑盒敲。make -j$(nproc) # 并行编译加快速度 make PREFIX/opt/redis install-j$(nproc)的意思是让 make 用上所有 CPU 核心并行编译nproc会自动返回你机器的核数四核机器速度能快四倍左右。不加这个参数也能编就是慢Redis 本身代码量不大单核编也就一两分钟但养成并行编译的习惯没坏处。PREFIX/opt/redis则决定了安装到哪个目录不指定的话默认装到/usr/local/bin下面把可执行文件散落在系统目录里我个人不太喜欢统一放/opt/redis后面管理起来清爽。编译过程中如果看到jemalloc相关的编译信息那是正常的Redis 默认用 jemalloc 做内存分配器它在高并发小对象场景下比系统自带分配器更省内存、碎片更少。如果你想换成 libc 分配器可以加MALLOClibc参数但除非有特殊理由否则保持默认就好jemalloc 是官方调优过的选择。编译完成后再执行 install把redis-server、redis-cli、redis-benchmark这些二进制复制到指定目录。装完后你可以在/opt/redis/bin下看到它们ls /opt/redis/bin # redis-cli redis-benchmark redis-check-aof redis-check-rdb redis-sentinel redis-server看到这一排文件就说明编译和安装这关过了。如果中途报错最常见的是缺依赖回去补 gcc/make和 gcc 版本过低升级编译器把报错信息原样搜一下基本都能对号入座。2.3 配置文件精调这一步决定后面稳不稳源码编译不会自动给你生成生产级配置得自己拿一份改。源码目录里自带的redis.conf就是模板我复制一份到之前规划好的配置目录然后重点改这几项cp redis.conf /opt/redis/conf/redis.conf然后用编辑器打开逐项对照下面这些关键点。绑定地址默认是bind 127.0.0.1只允许本机连接这是最安全的默认值如果你要外部访问改成bind 0.0.0.0或者指定具体网卡地址但改完必须配合密码和防火墙别裸奔。守护进程daemonize yes让它后台运行否则你关掉终端服务就没了。保护模式protected-mode yes这个很重要它会在没有密码且绑定全网卡时拒绝外部连接算是一道兜底。端口默认 6379改不改看需求。密码requirepass务必设一个强密码不设密码的 Redis 在公网上撑不过几个小时就会被人写进定时任务。bind 0.0.0.0 port 6379 daemonize yes protected-mode yes requirepass 你的强密码 dir /opt/redis/data logfile /opt/redis/logs/redis.log appendonly yes appendfsync everysec这里解释两个容易忽略的点。dir决定持久化文件的落盘位置一定要指到刚才你 chown 给 redis 用户的目录否则会因为权限问题启动失败日志里会写「Permission denied」很多人卡在这里找不到原因。appendonly yes是开启 AOF 持久化配合appendfsync everysec每秒刷盘一次能在性能和可靠性之间取一个平衡如果你更看重性能、能接受断电丢少量数据用默认的 RDB 也行但生产环境我一般建议开 AOF至少灾难恢复时数据更完整。改配置这事不要照抄网上的理解每一项是干嘛的再改不然出了问题你都不知道从哪看。2.4 用 systemd 托管让 Redis 跟着系统走源码装完如果你直接./redis-server /opt/redis/conf/redis.conf启动进程是起来了但机器一重启就没了而且没有日志轮转、没有自动拉起管理全靠手敲。正确做法是写一个 systemd 服务单元交给系统托管。# /etc/systemd/system/redis.service [Unit] DescriptionRedis In-Memory Data Store Afternetwork.target [Service] Userredis Groupredis ExecStart/opt/redis/bin/redis-server /opt/redis/conf/redis.conf ExecStop/opt/redis/bin/redis-cli -a 你的强密码 shutdown Restartalways [Install] WantedBymulti-user.target写完之后走一遍标准流程sudo systemctl daemon-reload sudo systemctl enable redis sudo systemctl start redis sudo systemctl status redis这里有几个细节值得说一下。Userredis让它以专用账号运行安全。Restartalways表示进程意外退出时自动拉起这对缓存服务很实用偶发崩溃能自愈。ExecStop用 redis-cli 的 shutdown 命令优雅关闭比直接 kill 更安全能让 Redis 把内存里的数据刷到磁盘再退出。systemctl status看到绿色的active (running)并且日志里没有报错才算真正装好。如果有问题用journalctl -u redis -n 50看最近 50 行日志比对着屏幕瞎猜高效得多。3. 包管理器与容器安装对照实操3.1 apt 与 yum 一键安装的正确姿势如果你不需要指定版本包管理器方式是真的省事。Debian/Ubuntu 系sudo apt update sudo apt install -y redis-server sudo systemctl enable --now redis-serverCentOS/RHEL 系则要先加 EPEL 源再装sudo yum install -y epel-release sudo yum install -y redis sudo systemctl enable --now redis装完立刻验证一下版本和状态别以为命令没报错就成了redis-server --version redis-cli ping # 期望返回 PONG包管理器装的坑主要在两点。第一是版本偏旧前面说过很多源里的 Redis 停留在 5 甚至 4你要用新特性会发现命令不存在这时只能老老实实源码编译。第二是它默认的配置可能跟你预期不一样比如某些发行版默认只监听 127.0.0.1、默认不开密码很多人装完不做检查结果一直以为服务是通的外网实际连不上。我的习惯是包管理器装完后一定去/etc/redis/找到它的配置文件确认一遍关键项跟源码安装的标准对齐。3.2 Docker 装 Redis挂载和持久化别搞错容器方式我平时用得也不少尤其是本地要同时跑好几个实例做测试的时候。基本命令很简单docker run -d --name redis \ -p 6379:6379 \ -v /opt/redis/data:/data \ -v /opt/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \ redis:7.2 redis-server /usr/local/etc/redis/redis.conf \ --requirepass 你的强密码 \ --appendonly yes这条命令有几个点要看懂。-v /opt/redis/data:/data是把宿主机目录挂进容器保证容器删了数据还在不挂载的话容器一删数据全丢这是容器用 Redis 最常见的翻车点。第二个-v把配置文件也挂进去改配置不用进容器。--requirepass和--appendonly yes是启动参数会覆盖配置文件里的对应项灵活但要注意别和配置文件里的值冲突否则以命令行参数为准排查时容易懵。容器的优势是干净、可复制、方便起多实例换个端口和目录就是第二个 Redis。代价是网络和存储都多了一层抽象出问题时定位链路变长。比如容器里bind 0.0.0.0是必须的不然容器外部访问不到再比如挂载目录的权限宿主机目录如果属于 root容器里以非 root 跑就可能写不进去。所以用容器部署时我会额外确认三件事端口映射对不对、挂载目录权限对不对、命令行参数有没有意外覆盖配置。这三条都过了容器版其实很稳。4. 装完之后怎么验证才算数4.1 redis-cli 连通与服务状态实测装好不等于能用我一般按顺序做四步验证。第一步连通性redis-cli -h 127.0.0.1 -p 6379 -a 你的强密码 ping返回PONG就说明服务活着、密码也对。如果报NOAUTH Authentication required是没带密码报Could not connect说明服务没起或端口不对报Connection refused基本是服务没在监听或防火墙拦了。第二步看基本信息redis-cli -a 你的强密码 info server | grep redis_version redis-cli -a 你的强密码 config get dir确认版本和持久化目录跟你的预期一致。第三步测读写随便 set 一个再 get 出来redis-cli -a 你的强密码 set test_key hello redis-cli -a 你的强密码 get test_key # 期望返回 hello第四步如果你是在云主机或者有防火墙的机器上从另一台机器用redis-cli -h 你的IP连一下确认外部可达性符合预期。注意-a参数会把密码明文出现在命令历史里生产环境更推荐用--no-auth-warning配合环境变量或者连上后用auth命令输入避免密码泄露到 history 文件。4.2 五大数据结构逐个验证连通之后我习惯顺手把五大数据结构都点一遍一来确认功能正常二来给自己或团队留个快速参考。字符串就不用说了set/get最基础。列表用lpush和lrangeredis-cli -a 密码 lpush mylist a b c redis-cli -a 密码 lrange mylist 0 -1哈希适合存对象比如用户资料redis-cli -a 密码 hset user:1 name tom age 20 redis-cli -a 密码 hgetall user:1集合sadd适合去重场景有序集合zadd适合排行榜redis-cli -a 密码 zadd rank 100 tom 90 jerry redis-cli -a 密码 zrevrange rank 0 -1 withscores这五种结构覆盖了 Redis 日常 90% 以上的用法全部跑通基本可以确认安装没有问题。这里顺带提一句redis序列化这个高频疑问Redis 本身只存字节你在应用里通过客户端存对象序列化的活是客户端干的比如 Java 的 JDK 序列化、JSON、Protobuf不是 Redis 的功能很多人把这两件事混在一起排查数据「乱码」时方向就找错了。4.3 可视化管理工具连接配置命令行玩熟了很高效但要看数据分布、排查 key 的时候图形工具还是直观。常用的可视化客户端连接时填写主机 IP、端口 6379、密码就能连上。连接失败的常见原因就三个网络不通先 ping 一下、密码错确认 requirepass 的值、以及 bind 和 protected-mode 限制服务只监听本机或者拒绝外部连接。把这三个检查完图形工具基本都能连上。我个人的习惯是命令行用来做运维操作启动、停止、查 info、慢查询图形工具用来做数据查看和临时调试。两者配合比只靠一种方式舒服。另外提醒一句图形工具连接生产 Redis 前最好确认它有只读模式别手滑删了 key这种事故我也见过真实的。5. 高频故障排查实录5.1 编译、启动、连接三类问题速查装 Redis 遇到的问题九成以上落在三类里。我整理成一张表出问题时对着找。现象可能原因排查与解决make 编译中途报错gcc 版本过低或缺依赖升级 gcc 到 9补装 build-essential启动即退出日志 Permission denied数据目录属主不对chown -R redis:redis /opt/redisredis-cli 报 Connection refused服务没起或端口被占看 systemctl statusss -lntp查端口外部连不上本机能连bind 只监听 127.0.0.1改 bind 0.0.0.0 并配置防火墙报 NOAUTH没带密码连接时加 -a 或连上后 auth重启后进程消失没做开机自启systemctl enable redis改了配置不生效配置未被加载或命令行覆盖确认启动时指定的配置文件路径这张表基本能覆盖新手会碰到的大部分情况。用它的关键不是背下来而是养成「先看日志再动手」的习惯。journalctl -u redis、tail -f /opt/redis/logs/redis.log、systemctl status这三板斧能帮你定位 80% 的问题比盲目改配置有效得多。5.2 安全基线与几个生产经验最后这段是我踩坑之后最想强调的。Redis 默认设计是给可信内网用的一旦暴露到公网且没设密码被攻击只是时间问题。我总结了几条生产环境必做项。第一一定设强密码requirepass不要用 123456 这种第二能用内网就别开公网如果必须外部访问配合防火墙只放行特定来源 IP第三别用 root 跑服务用专用账号第四把危险命令禁用或重命名比如flushall、flushdb、keys、config可以在配置文件里用rename-command处理防止误操作或被利用第五定期备份AOF 和 RDB 文件都要有异地副本。rename-command FLUSHALL rename-command FLUSHDB rename-command KEYS 把危险命令重命名成空字符串等于直接禁用需要用时再临时开。这一招在多人共用的环境里尤其有用能防住手滑也能防住一部分自动化攻击脚本。再补一个经验升级 Redis 版本前先在测试机把新版本跑一遍确认你的客户端和命令都兼容再动生产。Redis 大版本之间偶有行为变化直接升级引发的故障并不少见。这些事都不难难的是养成习惯——装好那一刻多花十分钟做安全配置能省掉后面无数的麻烦。我个人在实际操作中的体会是Redis 的安装从来不是「敲几条命令」那么简单真正决定它后面稳不稳的是编译前的环境确认、配置文件的逐项理解、以及上线前的安全加固这三件事。把这套流程跑顺一遍之后你会发现换台机器、换个版本、甚至换成容器部署套路都是通的这种「迁移能力」比记住某一条命令有用得多。
返回列表