首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
内网服务器离线部署Memcached完整实操指南
📅 2026/10/21 13:41:59
✍️ 爱科研究院
👁 阅读 3,247
给新机器装Memcached最烦的不是配置而是没网。生产环境的服务器待在隔离网段里跟外网老死不相往来这是很多公司运维每天面对的现实。yum装不了apt也白搭下载个源码包还得先过审批流程。这篇文章就是我最近在一台内网服务器上离线部署Memcached的完整实操记录从依赖梳理、安装包准备、源码编译到验证上线每一步都拆开讲清楚包括中间踩过的坑和排查过程。适合所有需要在隔离环境搭建缓存服务的运维同学直接照着操作。我这次部署的目标机器是某项目的前端缓存服务器操作系统是CentOS 7.9内核版本3.10完全无外网访问权限。Memcached负责扛数据库查询结果缓存和部分会话数据要求稳定、可自启动、可监控。整个过程走下来核心其实就围绕三件事依赖搞定、编译通过、验证跑通。下面逐步展开。1. 离线部署前的思路梳理与方案选型1.1 为什么需要离线部署Memcached很多业务系统到了生产阶段出于安全合规要求网络环境会做严格隔离。服务器只能访问内网指定网段外网连接直接被物理或策略层面切断。这种情况下操作系统的默认软件源不可用yum install memcached 这种最常规的操作会直接报错。更麻烦的是Memcached依赖libevent库而这个库在基础系统镜像里往往没有预装需要额外准备。离线部署的核心逻辑特别简单在一台能上网的机器上把需要的软件包全部下载好再想方设法传到目标机器上最后在目标机器上完成本地安装。听起来不复杂但实际执行起来有不少细节比如动态库依赖怎么解决、源码编译需要哪些工具链、装完之后怎么注册成系统服务每一步都需要提前规划。1.2 两种离线安装方式对比离线安装Memcached主要有两条路对比维度RPM包安装源码编译安装依赖处理用rpm -ivh逐个安装依赖包顺序严格先装libevent再编译Memcached版本控制取决于rpm包版本相对固定可自由选择指定版本编译要求不需要编译器需要gcc、make等工具链灵活度参数由打包时确定安装路径、优化参数自定义失败排查依赖冲突时较难处理日志明确可定位到具体环节我在实际项目中选择了源码编译。原因很简单我需要指定Memcached的版本以匹配现有集群的性能预期同时想把安装路径统一放到 /usr/local/memcached 下便于集中管理。RPM装出来的路径比较分散后续维护和脚本管理都会麻烦一点。注意如果目标机器连gcc都没装RPM包安装反而是更快的选择。判断标准就是看机器上有没有完整的编译工具链。1.3 离线部署的完整流程地图整个流程可以拆成六个阶段环境确认、依赖识别、安装包准备、传输落地、编译安装、验证上线。我画了一张自己在心里走的流程图不画图了直接文字描述环境确认阶段检查系统版本、架构、编译工具是否存在依赖识别阶段确定Memcached对libevent的版本要求安装包准备阶段到外网下载对应源码包并做校验传输落地阶段通过内网通道把包送到目标机器编译安装阶段依次编译依赖和主程序最后验证阶段做启动测试、读写测试、自启动配置。这六个阶段顺序不能乱尤其是前两步如果跳过去后面编译的时候就会反复碰壁。2. 环境确认与依赖分析是离线安装的关键前提2.1 确认目标机器的基础信息拿到一台新机器我习惯先做一次基础信息收集确认系统版本、内核版本、CPU架构以及编译工具链是否可用。这步看似简单但直接决定了下载什么版本的源码包。切换root用户后依次执行以下命令cat /etc/os-release uname -r uname -m which gcc which make which tar我这次部署的目标机器识别结果如下NAMECentOS Linux VERSION7 (Core) VERSION_ID7 PRETTY_NAMECentOS Linux 7 (Core) uname -r → 3.10.0-1160.el7.x86_64 uname -m → x86_64gcc版本确认是4.8.5make是3.82tar正常。CentOS 7的gcc 4.8.5编译Memcached和libevent的源码完全够用这里不需要额外升级编译器。确认完这些信息后心里就有底了源码包直接选择x86_64架构通用的tar.gz包不需要针对特定系统版本做定制。2.2 理解依赖关系libevent到底起什么作用Memcached本质上是一个事件驱动的内存缓存服务它的网络模型依赖事件通知机制来高效处理大量并发连接。libevent就是提供这套事件循环机制的底层库Memcached通过它来监听和处理socket事件、定时器事件等。打个比方Memcached是饭店libevent就是传菜电梯。菜好了要快速送到各桌客人呼叫要快速响应传菜电梯坏了整个饭店就转不动。所以libevent必须提前装好而且版本不能太老否则事件处理能力会拖后腿。我这次使用的是libevent 2.1.12-stable版本配合memcached 1.6.21版本兼容性很好。2.3 检查目标机器的编译依赖是否完整源码编译还需要系统里有标准库头文件和基础开发包。有时候机器装的是精简版系统缺了gcc或者缺了基础的开发库编译时会报找不到stdio.h这类的头文件缺失错误。快速检查方法echo int main() { return 0; } /tmp/test.c gcc /tmp/test.c -o /tmp/test.out能编译出可执行文件就说明基本的头文件路径没问题。如果这步就报错得先把基础开发包补齐比如在CentOS 7上可能需要安装package group Development Tools对应的RPM包。离线环境下最简单的方案是挂载系统的完整ISO镜像配置本地yum源后安装gcc、make、libevent-devel等包。提示确认编译工具可用这一步千万别省。我之前有个项目就是没提前确认到了编译Memcached时才报缺gcc临时去找RPM包折腾了两个多小时。2.4 离线场景下依赖包的准备思路如果是用RPM方式离线安装依赖包需要在有网的机器上预先用yumdownloader下载全。比如CentOS 7上可以用下面这条命令拉取所有依赖RPM包yumdownloader --resolve --destdir /tmp/memcached-rpms memcached libevent--resolve参数会把所有依赖也拉下来这样拷贝到离线环境后可以用rpm -ivh *.rpm批量安装。不过有个坑yumdownloader解析依赖时是基于你当前有网机器的源配置如果目标机器系统版本跟下载机器不完全一致可能会带上版本不对的依赖包。所以源码编译方式在版本一致性上其实更稳妥。3. 安装包下载与完整性校验3.1 下载前先确定版本Memcached的版本选择上有讲究。我个人的经验是选择近一两年内的稳定版本不要追最新但也别用太老的版本。太老的版本在一些新内核上编译会有兼容性告警太新的版本可能没经过大量生产环境验证。我这次选的版本组合libevent 2.1.12-stable事件库稳定且兼容性好memcached 1.6.21主流稳定版支持现代操作系统的特性3.2 如何找到并下载正确的源码包在有网环境下去官方网站下载源码tar.gz包。下载的时候注意核对文件名里的版本号别下成beta或rc版本。命令如下wget https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz wget https://memcached.org/files/memcached-1.6.21.tar.gz3.3 校验下载包的完整性和安全性传输源码包到内网机器之前务必先做校验。一方面确认下载过程中没有发生文件损坏另一方面也做个基本的完整性检查。SHA256校验是标准做法sha256sum libevent-2.1.12-stable.tar.gz memcached-1.6.21.tar.gz下载前把官网提供的checksum值存下来下载完后对比是否一致。不一致说明文件有问题删了重下别带着坏包去内网浪费时间。3.4 把源码包传到离线机器既然离线机器没有外网就需要通过内部途径把包传输过去。我这次用了公司内部的文件传输平台直接把两个tar.gz包推送到目标机器 /tmp/build 目录下。如果你遇到的是更严格的环境常见的传输方式还有以下几种U盘拷贝最原始但最可靠注意vfat文件系统对文件大小限制内网共享目录挂载内部Samba或NFS共享文件传输平台现在很多公司内网都有这类系统光驱烧录老办法但部分机器光驱位还在传输完成后在目标机器上再跑一遍sha256sum对比确认文件没在内网传输过程中被改动。4. 源码编译从libevent到Memcached的完整实操4.1 解压与准备工作目录在目标机器上创建统一的工作目录把包解压进去mkdir -p /tmp/build cd /tmp/build tar xzf libevent-2.1.12-stable.tar.gz tar xzf memcached-1.6.21.tar.gz解压完成后ls看一下目录结构确认各源码目录存在。4.2 编译安装libevent进入libevent源码目录执行标准的三步走configure、make、make install。cd libevent-2.1.12-stable ./configure --prefix/usr/local/libevent make -j4 make install这里我特意指定了 --prefix/usr/local/libevent把libevent装到独立目录而不是默认的/usr/local。这样做的目的是明确管理这个依赖库后续Memcached编译时通过环境变量告诉它libevent在哪避免和其他系统库混在一起出现版本冲突。编译过程如果没什么意外最后会生成 /usr/local/libevent/lib 目录下的动态库文件。验证一下ls /usr/local/libevent/lib能看到 libevent-2.1.so.7 这样的文件说明编译成功。如果没有回去看编译日志常见问题是缺autoconf或automake工具极少情况下需要安装这些工具后再执行autoreconf。4.3 配置环境变量让系统识别libeventlibevent装到了自定义路径系统默认的库文件搜索路径里没有它这一步必须设置环境变量否则后面编译Memcached或者运行时都会找不到so文件。临时设置环境变量的方式当前终端会话生效export LDFLAGS-L/usr/local/libevent/lib export CPPFLAGS-I/usr/local/libevent/include export LD_LIBRARY_PATH/usr/local/libevent/lib不过临时设置只在当前终端有效一关窗口就没了。为了持久化我在 /etc/profile.d/memcached_env.sh 里写入了这些环境变量cat /etc/profile.d/memcached_env.sh EOF export LDFLAGS-L/usr/local/libevent/lib export CPPFLAGS-I/usr/local/libevent/include export LD_LIBRARY_PATH/usr/local/libevent/lib EOF source /etc/profile.d/memcached_env.sh这样后续即使重新登录环境变量依然生效。注意LD_LIBRARY_PATH这个变量是运行时用的编译时如果遇到链接错误优先检查LDFLAGS和CPPFLAGS。很多新手只设置了LD_LIBRARY_PATH就去编译结果链接阶段找不到头文件报错。4.4 编译安装Memcached环境变量确认无误后开始编译主程序。进入Memcached源码目录执行配置和编译cd /tmp/build/memcached-1.6.21 ./configure --prefix/usr/local/memcached --with-libevent/usr/local/libevent make -j4 make installconfigure阶段指定 --with-libevent/usr/local/libevent 是关键参数告诉编译系统libevent安装在哪里。如果没有这个参数configure一开始就会报libevent is required然后退出。我的实际编译输出里有几个值得注意的提示项checking for libevent directory... /usr/local/libevent checking for gcc... gcc checking for gcc option to accept ISO C89... none needed这几个检查项都过了说明依赖和编译器都没问题。make -j4是用4个并行任务来编译加快编译速度。如果机器CPU核数少或者内存紧张用make -j2更稳妥甚至直接make也行。之前有台配置低的测试机强行-j8编译直接把内存耗光导致编译中断。安装完成后确认一下Memcached二进制文件路径ls /usr/local/memcached/bin/memcached4.5 验证Memcached版本与链接状态安装结束不急着启动先验证二进制文件的动态链接是否正常。这是离线部署最容易翻车的地方Memcached能编出来但运行时加载不到libevent库。ldd /usr/local/memcached/bin/memcached正常情况下应该能看到类似这样的输出linux-vdso.so.1 → (0x00007ffc...) libevent-2.1.so.7 → /usr/local/libevent/lib/libevent-2.1.so.7 libc.so.6 → /lib64/libc.so.6注意看libevent那一行如果显示not found那运行时一定会报错需要回去检查LD_LIBRARY_PATH配置。如果显示的是正确的绝对路径那链接没毛病。同时跑一下版本命令/usr/local/memcached/bin/memcached -h能看到完整的使用帮助到这里编译安装阶段就算圆满完成了。5. 启动配置与功能验证上线5.1 命令行手动启动Memcached编译安装完的Memcached可以直接用命令行启动。我习惯先用前台方式启动做验证这样日志直接打到终端有问题一目了然/usr/local/memcached/bin/memcached -p 11211 -u root -m 256 -c 1024 -d这个命令的参数含义参数含义说明-p监听端口默认11211业务连接端口-u运行用户生产环境建议用普通用户如nobody-m内存上限单位MB我这里分配258MB测试-c最大连接数默认1024高并发可以调大-d守护进程方式后台运行-l监听地址默认所有网卡生产建议指定内网IP-v详细日志调试时用可加多个v更详细注意上面我故意没加-l参数验证阶段允许监听所有网卡方便临时测试。生产配置里必须加上 -l 127.0.0.1 或内网IP限制监听范围。5.2 用telnet做set/get读写验证Memcached没有自带客户端命令最简单的验证方式就是telnet连接到11211端口直接手写协议命令。telnet 127.0.0.1 11211连接成功后输入set test_key 0 0 5 hello协议解释set是写命令test_key是键名第二个0是flags标志位第三个0是过期时间0表示永不过期第5个数字代表value的长度。输入hello后回车如果返回STORED说明写入成功。然后读取get test_key返回VALUE test_key 0 5 和 hello说明读取成功。最后输入quit退出。这一步验证的是服务核心功能正常读写都通了才能继续下面的正式配置。5.3 注册成systemd服务实现开机自启生产环境不能靠手动敲命令启动服务重启后服务丢了就麻烦了。注册systemd服务是标准做法。创建服务文件cat /etc/systemd/system/memcached.service EOF [Unit] DescriptionMemcached Daemon Afternetwork.target [Service] Typeforking ExecStart/usr/local/memcached/bin/memcached -p 11211 -u nobody -m 512 -c 2048 -l 127.0.0.1 ExecStop/bin/kill -TERM $MAINPID Restartalways RestartSec3 [Install] WantedBymulti-user.target EOF启用并启动服务systemctl daemon-reload systemctl enable memcached systemctl start memcached systemctl status memcached这里Typeforking是因为Memcached -d参数会fork出守护进程systemd要能识别这个行为。ExecStop用TERM信号让Memcached优雅退出避免数据写入中断。提示生产环境用systemd管理时建议去掉命令行里的-d参数改用Typesimple方式这样systemd对进程的控制更精确。不过我这次保留了-d配合Typeforking经验证也工作正常两种方式都可以看个人习惯。5.4 防火墙与访问策略配置如果Memcached的监听地址是内网IP而不是127.0.0.1那需要考虑防火墙放行问题。CentOS 7默认firewalld开启需要添加规则firewall-cmd --permanent --add-port11211/tcp firewall-cmd --reload但如果监听的是127.0.0.1则不需要开放防火墙端口。我这次因为服务只给本机应用提供缓存就锁在127.0.0.1上完全不暴露外部端口安全性更好。如果是在云环境或者有安全组策略的机房还需要在对应的安全组规则里放行端口。别忘了这一步不然客户端连不上排查半天发现是安全组没配置。6. 常见问题与排查技巧实录6.1 configure阶段提示libevent找不到Memcached源码执行./configure时报错信息类似checking for libevent... no configuration error: libevent is required出现这个问题的原因基本就是两种情况libevent没装或者装了但configure找不到。排查步骤# 1. 确认libevent确实存在 ls /usr/local/libevent/include/event.h # 2. 确认环境变量已设置 echo $CPPFLAGS echo $LDFLAGS # 3. 确认configure指定了正确的路径 ./configure --with-libevent/usr/local/libevent如果头文件存在且路径正确但依然报错检查configure时是否带着之前的缓存。可以先清理一下再执行make distclean ./configure --with-libevent/usr/local/libevent6.2 启动时报错error while loading shared libraries命令行启动Memcached时报错信息/usr/local/memcached/bin/memcached: error while loading shared libraries: libevent-2.1.so.7: cannot open shared object file: No such file or directory这个错误非常经典典型原因就是系统运行时找不到libevent动态库。虽然编译时链接进去了但运行时搜索不到。排查命令ldd /usr/local/memcached/bin/memcached如果libevent行显示not found补充设置LD_LIBRARY_PATH后再次启动export LD_LIBRARY_PATH/usr/local/libevent/lib如果想彻底解决可以更新系统的ldconfig配置echo /usr/local/libevent/lib /etc/ld.so.conf.d/libevent.conf ldconfig这种方式比设置环境变量更根本因为ldconfig是系统级别的对所有用户和程序都生效。6.3 端口无法访问或连接超时客户端连接不上Memcached的端口时按以下顺序排查# 1. 确认服务状态 ps aux | grep memcached # 2. 确认监听地址和端口 netstat -tlnp | grep 11211 # 3. 确认防火墙 firewall-cmd --list-all # 4. 本地测试连通性 telnet 127.0.0.1 11211如果是监听在127.0.0.1而客户端在别的机器上自然是连不上的。这时候要改启动参数加上 -l 实际内网IP 或 0.0.0.0 以及对应安全策略。另外一个隐蔽问题Memcached配置了很大的内存但服务器实际内存不够启动时会报内存不足而退出。这时看dmesg输出能看到OOM相关日志。6.4 启动日志没有报错但服务挂掉偶尔会遇到Memcached进程启动后几秒内自动退出查看日志却没有明显报错。这种情况优先检查系统资源限制。# 查看系统对进程的限制 ulimit -a # 查看是否触发OOM dmesg | grep -i oom如果是OOM问题要么降低-m参数的内存分配要么增加系统swap空间。还有一种情况是系统对进程数或文件打开数做了限制调整方式ulimit -n 655356.5 编译时提示缺少perl或hwloc等依赖Memcached源码编译时如果某些可选特性依赖的库没装configure可能报对应模块的错误。1.6.x版本里我遇到过hwloc相关的提示这个是NUMA相关的可选依赖不影响基础功能。如果configure报错说缺少hwloc用以下参数禁用即可./configure --without-hwloc一般不建议为了一个可选功能去手动编hwloc徒增复杂度。6.6 问题速查表故障现象可能原因排查命令解决办法configure报libevent required依赖未安装或路径未指定ls /usr/local/libevent/include/event.h配置--with-libevent路径启动报shared libraries错误动态库未注册ldd /usr/local/memcached/bin/memcached设置LD_LIBRARY_PATH或ldconfig端口连接超时监听地址/防火墙限制netstat -tlnp修改监听IP或放行端口启动后瞬间退出内存不足或dmesg报OOMdmesg -T降低-m参数或增加swapset返回ERROR协议格式错误核对set语法检查flags/expire/time顺序make并行编译中断内存不足free -m降低并行度或关闭其他进程7. 上线前的检查与优化配置7.1 使用配置文件替代命令行参数启动参数如果太长可以考虑使用配置文件。Memcached支持sysv风格配置文件不过在systemd场景下直接用命令行参数更常见。如果参数特别多也可以把参数写到环境文件里systemd的EnvironmentFile支持这个用法。我自己的习惯是启动参数固定、简短就写ExecStart里如果参数很多用EnvironmentFile维护一份独立的配置文件这样后续调整参数不用改service文件。7.2 内存参数的合理设定-m参数决定Memcached使用多少内存这个值不能拍脑袋定。我一般按这个公式估算可用缓存内存 总物理内存 - 操作系统保留内存 - 业务应用内存比如一台8GB内存的服务器业务应用使用4GB系统保留1.5GB那给Memcached分配2GB左右比较安全。另外Memcached的内存是预分配的并不是实际立即占用全部内存但startup后它会根据需要逐渐增长所以预留空间不能卡太紧。7.3 监控与日常检查建议部署完成不是终点。我建议定时检查以下几个指标# 查看Memcached统计信息 echo stats | nc 127.0.0.1 11211重点关注cur_items、get_hits、get_misses、curr_connections几个值。命中率低了说明缓存策略可能需要调整连接数持续飙高说明后端业务可能有问题。如果环境里已经有监控系统可以依托统计信息做数据采集。Memcached自带文本协议解析起来很简单接入监控系统没有任何门槛。8. 最后再分享几条真实的踩坑心得这次离线部署Memcached的过程我自己最深的体会是提前把依赖确认清楚能省下大半天的折腾时间。一开始我以为就是编译一个软件的事实际踩了库路径不对、环境变量没持久化、systemd配置类型选错三个坑每一个都花了不少时间定位。第一离线环境里的每一趟操作都成本高昂。有网的机器上下错一个包到内网就得白跑一趟。所以下载源码包时务必核对sha256时间多花半分钟后面就能少跑一趟。第二libevent的编译安装路径保持独立是一个非常正确的决定。如果当时图省事装到默认路径后面卸载或升级Memcached时会跟系统库纠缠不清。自定义prefix和不污染系统库是离线部署最值得养成的习惯。第三systemd的Type参数要根据启动方式严格匹配。用-d参数fork后台运行就必须Typeforking用前台方式就必须Typesimple写错了systemd会认为服务启动失败健康检查就会误判。最后验证阶段别嫌麻烦。telnet进去set一个key再get出来十秒钟的事但能确认整个服务真正可用而不是只看进程存在。进程活着但读写失败的情况我遇到过不止一两次。
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/10/21 13:41:59
轻量级事件编排引擎REA:可靠事件自动化的设计与实现
2026/10/21 13:41:59
Cocos Creator与Android原生桥接:头像拍照裁剪上传全流程实战
2026/10/21 13:41:59
车企自研世界模型:用统一神经网络重构自动驾驶
2026/10/21 14:43:04
A2A协议实战:多Agent协作与消息路由的完整指南
2026/10/21 14:43:04
Unity LeanTween补间动画API实战指南:从核心原理到高频API与避坑技巧
2026/10/21 14:43:04
Java网络编程实战笔记:从Socket到NIO的完整学习路径
2026/10/21 14:43:04
需求驱动感知:WSaiOS-SI结构智能体系中的信息获取机制
2026/10/21 14:43:04
基于激光雷达的机器人栅格地图构建实战:从传感器标定到定位复用
2026/10/21 14:37:53
lingbot-map:用自动化语言处理构建语义映射地图的工程实践
2026/10/21 0:01:44
ClickHouse实战:从列式存储到亿级数据秒级查询
2026/10/21 0:01:44
高效筛选arXiv机器学习论文:四步法实战指南
2026/10/21 0:01:44
Python爬取百度迁徙数据:接口签名、反爬与SQLite存储实战
2026/10/20 16:07:12
OpenResearch实战:Claude Code、Codex、OpenCode、Cursor 工作流搭建与故障排查
2026/10/21 14:47:26
知识管理核弹:用Obsidian构建第二大脑的工程化方案(TaoToken 统一 Key 接入版)
2026/10/20 16:49:38
金融AI落地指南:从调研报告到技术选型与工程实践
2026/10/20 2:24:03
我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
2026/10/20 2:23:57
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026/10/20 2:23:53
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)