多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Linux下如何安装Redis:从源码编译到生产配置全解析

Linux下如何安装Redis:从源码编译到生产配置全解析 很多人的第一台Redis可能是在Windows桌面上装起来的。下载一个msi安装包一路Next服务就起来了。但等你真正进入开发或运维场景很快会发现一个事实生产环境、集群方案、容器镜像几乎清一色跑在Linux上。Windows下的Redis往往停留在旧版本社区主要精力也都在Linux平台很多新版本特性Windows根本尝不到。这篇文章就是一篇Linux下安装Redis的完整实操记录。我会尽量把每一步为什么这么做讲清楚而不只是甩给你一串命令。内容覆盖环境准备、源码下载、编译安装、配置调整、启动验证以及装的过程中最容易翻车的几个坑。无论你是刚接触Linux的小白还是已经有基本操作经验的开发同学照着走一遍应该都能把自己的Redis跑起来。1. 动手之前为什么Redis和Linux是官配1.1 底层原理Redis的IO模型决定了它对Linux更友好Redis是一个基于内存的键值数据库最核心的运行机制是单线程事件循环配合IO多路复用。在Linux上这个多路复用依赖的是epoll在macOS上是kqueue在Windows上因为没有原生epoll/kqueue这类高效事件通知机制Redis官方干脆不做Windows支持。微软曾经维护过一份Windows移植版但已经很久没有跟进新版本了。所以你打开Redis官方安装文档只能看到Linux、macOS等Unix-like系统的源码编译方案找不到Windows安装包。这不是故意设置门槛而是底层事件模型决定了这条路最顺。理解了这一点你就明白想在生产环境用好Redis绕不开Linux。这也是我建议新手直接学Linux安装的重要原因——你迟早要面对它不如一开始就进入正题。1.2 准备一台Linux机器虚拟机还是云服务器学习阶段我强烈建议用虚拟机好处是可以随便折腾拍个快照就能随便回滚不用担心把环境搞坏。具体准备方式下载VMware Workstation Player有免费版或VirtualBox二选一。下载Ubuntu Server 22.04 LTS镜像或者CentOS Stream 9选一个就行。本文示例以Ubuntu为主CentOS的命令差异我会在对应位置标注。虚拟机分配2核CPU、2GB内存、20GB磁盘就完全够用Redis本身不大主要是系统占用。如果你用云服务器流程更简单买一台最低配的Linux实例用SSH客户端连上去操作即可。唯一要注意的是云服务器的安全组需要放行对应端口这个后面专门讲。第一次装Linux就遇到蓝屏或者卡在安装界面的情况也不少见。拿VMware举例多半是虚拟化设置问题虚拟机类型选对了吗BIOS里Intel VT-x/AMD-V开没开CPU虚拟化不开启64位Linux系统很容易启动失败。网上搜虚拟机安装linux蓝屏大部分人的原因都出在这。1.3 安装前的系统检查登录系统后先做几个常规检查确认环境干净可用whoami cat /etc/os-release free -h df -hwhoami确认当前用户。如果显示root后面操作可以省掉大量sudo如果是普通用户注意我命令里写的sudo要保留。cat /etc/os-release看发行版名称和版本号。free -h看内存余量df -h看磁盘空间。Redis编译安装对硬件要求不高能跑Linux的机器基本都能装。真正容易卡住的反而是依赖环境比如gcc缺失、版本太旧、缺少某个工具链这些我们下一步处理。2. 源码下载为什么我不用apt直接装2.1 版本选择逻辑Redis官网的release页面会标明每个版本的稳定程度。学习或生产使用都建议选择最新的稳定版stable比如7.2.x、7.4.x系列。下载地址格式统一是wget https://download.redis.io/releases/redis-7.2.4.tar.gz如果官网下载速度不太理想可以换国内镜像源速度会快很多。主流镜像站基本都会同步Redis的发布包找到对应版本的tar.gz拉下来就行。这里我的建议是不要盲目追最新大版本选一个已经发布一段时间的稳定版。新的大版本比如Redis 8.x虽然功能新但周边工具链、文档、实践案例可能还没完全跟上。对于大多数场景7.2或者7.4这个系列足够稳。2.2 为什么不建议直接 apt install redis-serverUbuntu的apt仓库里确实有redis-server一条命令就能装好sudo apt update sudo apt install -y redis-server装完就能用看起来很爽。但有几个问题对比项apt/yum安装源码编译安装版本跟随发行版仓库通常偏旧自由选择任意版本配置位置系统默认路径定制性差完全可控性能调优难以深入定制可指定编译参数学习价值装完即用不了解内部能完整理解构建流程多实例部署较麻烦灵活更关键的是发行版仓库里的Redis往往已经被systemd托管日志路径、配置路径都是定死的想自定义一个独立实例反而麻烦。学习阶段你最好能完整接触一次从源码到可执行文件的构建过程这对后续排查问题帮助很大。所以我推荐源码编译安装。2.3 下载后的解压与目录规划mkdir -p /opt/redis cd /opt/redis 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 ls -l解压之后你会看到README.md、Makefile、src/、redis.conf等文件和目录。src目录是核心C源码redis.conf是后面要重点调整的配置文件Makefile则是编译总入口。Redis的源码包结构非常清晰没有任何多余的嵌套目录这一点比很多项目都做得好。3. 编译安装全流程从make到make install3.1 安装编译依赖Redis是C语言写的编译它需要gcc和make。不同发行版装依赖的命令不一样。Ubuntu/Debian系sudo apt update sudo apt install -y build-essentialCentOS/RHEL系sudo yum install -y gcc makebuild-essential在Ubuntu里是一个元包会一次性带齐gcc、make、libc-dev等基础编译工具。如果编译时还缺个别东西再单独补就行。这里有个关键经验如果你用的是CentOS 7这种老系统自带gcc是4.8.2编译Redis 7.x时很容易报错因为Redis 7对编译器版本要求更高。实际处理有两个方向换用Redis 6.2.x版本兼容性好。用SCL软件集切换高版本gccsudo yum install -y centos-release-scl sudo yum install -y devtoolset-11-gcc devtoolset-11-gcc-c scl enable devtoolset-11 bash gcc --version我的优先级建议是生产系统尽量用官方支持的较新发行版老系统上想省事就先降级Redis版本没必要硬刚编译器。3.2 正式编译与安装确认gcc可用后在源码目录里执行make -j4-j4表示4个编译任务并行执行能明显加快速度。机器核心多可以-j8。编译过程会刷屏大量C编译信息这是正常现象。编译完成后看src目录redis-server和redis-cli已经生成了。接着安装到系统目录make install默认会把可执行文件复制到/usr/local/bin这样在命令行任意位置都能直接执行redis-server和redis-cli。如果想指定安装目录也可以make install PREFIX/usr/local/redis我个人习惯用默认路径因为/usr/local/bin已经在PATH环境变量里使用最方便。执行下面命令确认安装成功redis-server --version到这里核心程序已经装好了但距离一个能稳定对外提供服务的Redis还差配置这一步。3.3 编译阶段最常见的两个报错第一个gcc: command not found。原因不用解释就是没装编译器回到3.1装依赖即可。第二个编译或启动时提示This system does not support jemalloc, using libc malloc。这不是致命错误Redis会自动退化到libc的malloc实现。如果不想看到提示或者确实想用jemalloc可以make distclean make MALLOClibc还有一类情况编译过程中报missing某个头文件或符号错误多半是上一次编译残留导致的。先执行make distclean清理干净再重新make比直接盲目重试有效得多。这也是很多零基础同学容易忽略的一个操作。4. 装好不等于能直接用redis.conf核心配置Redis自带一套完整的配置体系默认的redis.conf在源码目录里就能看到。建议把它复制到/etc/redis/统一管理sudo mkdir -p /etc/redis sudo cp redis.conf /etc/redis/redis.conf下面这几个配置项是装完必调的。4.1 daemonize、port和logfile# 默认no启动后前台运行终端一关服务就没了。改成yes可后台守护进程运行 daemonize yes # 监听端口默认6379没有特殊需求不用动 port 6379 # 日志文件路径 logfile /var/log/redis/redis.log第一个必改的就是daemonize。本地调试用前台模式没问题能看到实时日志但正式使用建议直接改成yes否则你CtrlC或者SSH会话断开Redis就停了。logfile建议指定到固定路径。不指定时Redis日志默认输出到标准输出而daemonize为yes的情况下标准输出很可能会被丢到 /dev/null出了问题连日志都看不到排查起来非常难受。4.2 bind、protected-mode与安全边界新版本Redis配置里bind默认是127.0.0.1也就是只有本机能连protected-mode默认是yes会拒绝非本机IP发来的带数据请求。这两条加在一起就是Redis的默认安全策略只允许本机访问。bind 127.0.0.1 protected-mode yes如果你只想在自己电脑上学习保持默认就行。但要让局域网其他机器或者云服务器公网访问就要注意bind改成0.0.0.0表示监听所有网卡。云服务器上要确认绑定的IP和实例的内网IP匹配。暴露到网络前务必先设置密码。这是最容易翻车的地方。Redis默认没有鉴权直接扔到公网几小时内就可能被人扫描到。写入垃圾数据、植入挖矿脚本这些都不是段子是真实发生过的事。任何涉及外网访问的Redis都必须先配好密码再启动。4.3 requirepass设置访问密码在redis.conf里找到requirepass这一行去掉注释改成requirepass 你的密码注意这个配置是明文存储的。所以配置文件权限要收一下sudo chmod 600 /etc/redis/redis.conf设置密码后命令行连接方式变为redis-cli -a 你的密码或者连接后手动认证redis-cli AUTH 你的密码如果忘了密码也别慌。要么改配置文件重启要么临时用config set requirepass 新密码改一下。但注意config set是临时生效重启后以配置文件为准。顺便提一句如果你用root权限跑Redis配置文件建议在配置里加上user redis group redis配合系统用户实现最小权限运行。4.4 持久化相关appendonly和dirRedis默认的快照模式RDB不够保险想要更强的崩溃恢复能力建议开启AOF追加日志appendonly yes dir /var/lib/redisdir指定持久化文件和数据文件存放的目录一定要先创建好sudo mkdir -p /var/lib/redisRDB快照和AOF文件都会写到这里。我把持久化放在安装阶段一起讲是因为很多教程装完Redis就急着启动等数据丢了才想起配置没做。安装时把这些一次性配好后面省心太多。5. 启动、验证与开机自启5.1 用配置文件后台启动配置改完启动命令很简单redis-server /etc/redis/redis.conf如果daemonize已经改为yes这个命令执行后会立即返回。检查进程ps -ef | grep redis或者看端口监听状态ss -tlnp | grep 6379能听到6379说明server已经起来了。停止Redisredis-cli shutdown如果设置了密码redis-cli -a 你的密码 shutdown5.2 redis-cli验证安装连接验证redis-cli ping返回PONG说明通了。设置密码后要带密码redis-cli -a 你的密码 ping简单读写测试redis-cli -a 你的密码 set hello world redis-cli -a 你的密码 get hello输出world即完全正常。再执行redis-cli info server能看到redis版本、操作系统、进程ID等运行信息。这个命令是之后排查问题最常用的工具之一。5.3 注册成systemd服务实现开机自启如果用的是云服务器重启机器后希望Redis自动起来就需要systemd来管理。创建/etc/systemd/system/redis.service[Unit] DescriptionRedis Server Afternetwork.target [Service] ExecStart/usr/local/bin/redis-server /etc/redis/redis.conf ExecStop/usr/local/bin/redis-cli shutdown Restartalways Userredis Groupredis [Install] WantedBymulti-user.target如果用redis用户运行记得先处理目录权限sudo useradd -r redis sudo mkdir -p /var/lib/redis /var/log/redis sudo chown -R redis:redis /var/lib/redis /var/log/redis然后sudo systemctl daemon-reload sudo systemctl enable redis sudo systemctl start redis验证状态sudo systemctl status redis看到active (running)就成功了。以后重启机器Redis会自动拉起不再需要手动执行redis-server。5.4 用可视化客户端连一把装好后日常管理可以挂一个可视化客户端比如Another Redis Desktop Manager开源免费或者Redis Desktop Manager。连接参数基本一样地址Linux机器的IP端口6379密码requirepass里设置的密码如果Windows上连不上九成是防火墙或云安全组没放行6379排查路径看下一章。6. 实测中最容易翻车的几个问题6.1 端口6379被占用启动时报错Could not create server TCP listening socket *:6379: bind: Address already in use说明端口被占用。排查命令ss -lntp | grep 6379 lsof -i:6379找到占用进程。如果不是Redis就换一个端口修改配置文件的port项或者启动时临时指定redis-server --port 63806.2 启动时的三个内存参数警告Redis启动时经常出现这类警告WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is lower than 511 WARNING overcommit_memory is set to 0 WARNING: You have Transparent Huge Pages (THP) support enabled第一个关于TCP backlog队列长度生产环境需要调大sudo sysctl -w net.core.somaxconn511修改/etc/sysctl.conf永久生效net.core.somaxconn 511 vm.overcommit_memory 1第二个和内存分配策略有关。Redis做RDB快照时fork子进程写数据overcommit_memory设置不当可能导致fork失败设成1适合Redis这种内存型服务。第三个是透明大页THP。THP会导致Redis的fork变慢、内存波动。建议在/etc/default/grub的GRUB_CMDLINE_LINUX里加transparent_hugepagenever然后update-grub重启生效。学习环境下暂时不处理问题不大生产环境这台必须做。这三个警告不影响Redis启动但追求生产级稳定建议全部处理。6.3 外网连不上Redis的排查链路经典问题Redis明明起来了为什么别的机器连不上按顺序排查排查步骤命令或操作结论本机连通性redis-cli ping通了说明服务正常往下走监听地址ss -lntp | grep 6379显示127.0.0.1说明只监听本机需改bind保护模式查看protected-mode和requirepass开启保护且无密码外部请求会被拒绝防火墙sudo ufw status/sudo firewall-cmd --list-all未放行6379则需添加规则云安全组云控制台入方向规则漏了这里前面全通过也连不上放行防火墙端口的操作sudo ufw allow 6379/tcp # 或 sudo firewall-cmd --add-port6379/tcp --permanent sudo firewall-cmd --reload我的排查习惯是先本机再监听地址再防火墙最后安全组。从近到远一般不会漏。6.4 两个预防失败的小习惯第一不要用太旧的发行版编译新Redis。装之前先gcc --version看看版本心里有底。第二配置文件要有版本概念别拿老版本的redis.conf直接给新版本用。新版本新增的配置项不认识没关系但某些已有配置的语义可能变了官方升级说明值得花两分钟看一眼。最后分享一个我自己的习惯装Redis的时候会把编译日期、版本号、关键命令记在一个安装笔记里。Redis升级的时候直接对着旧记录改路径和版本号就够了不用重新翻文档。这篇文章你也可以当第一份笔记来用。
返回列表