很多第一次接触RabbitMQ的人大概率都经历过同一个场面高高兴兴下载了rabbitmq-server-4.3.6.exe双击之后还没看到安装界面就先弹出一个提示——请先安装Erlang/OTP。那一刻你会想这个Erlang到底是什么东西为什么一个消息中间件安装包还要额外依赖一门编程语言这篇教程就从这个问题切入把Erlang在Windows上的安装、版本匹配、环境变量、常见坑和处理方式一次性讲透。无论你是RabbitMQ的运维、消息队列的初学者还是纯属好奇想装个Erlang玩玩这篇文章都能让你少走弯路。1. Erlang这门语言和RabbitMQ的绑定关系是怎么回事1.1 为什么RabbitMQ非要Erlang不可先说结论RabbitMQ本身就是用Erlang语言写出来的所以RabbitMQ的Windows安装包默认不带Erlang运行时这不是偷懒而是刻意的设计。它把一个软件产品的运行环境和软件本身解耦避免捆绑一个固定的Erlang版本既方便修复Erlang侧的Bug又能让有更高需求的用户单独升级运行时。Erlang这门语言诞生于上个世纪80年代最早是爱立信为了电信交换机开发的。它的设计目标放到现在看依然是极其超前的海量并发、软实时、容错、热代码升级、分布式。这些特性恰好是消息中间件最需要的核心能力——RabbitMQ要同时处理成千上万条消息的收发路由要在节点之间做集群同步要在某个节点挂掉后自动转移流量。如果用一个传统的Java或C架构来做复杂度和资源消耗都会高很多。Erlang不是一门适合写业务逻辑的语言你可以把它理解成一台专门为高并发调度设计的小型虚拟机。RabbitMQ选择了它相当于把并发调度崩溃恢复分布式协调这些消息中间件最底层的基础设施交给一门为它们而生的语言。所以装RabbitMQ之前必须先装Erlang这跟搭Java应用要先装JDK是同一个道理只不过Erlang这个词在中文互联网上的资料远没有Java那么丰富。1.2 OTP版本、Erlang版本、发行版这些概念到底怎么对应聊到Erlang你一定会遇到一个高频词OTP。每次去官方下载页面看到的文件名也是像otp_win64_29.1.1.exe这样的格式。第一次看到的人容易懵Erlang是语言OTP又是什么OTP的全称是Open Telecom Platform开放电信平台。现代意义上的OTP甚至已经不只是平台它包含了Erlang的标准库、编译器、进程管理机制、分布式基础设施、数据库接口以及一套完整的应用标准如何启动应用、如何监控应用、如何打包发布。简单来说你现在从官网下载的Erlang实际上就是一套打包好的OTP发行版。你在命令行里敲erl打开的那个交互环境也是OTP提供的。所以当你搜索Erlang 29.1.1或OTP 29.1.1时指的是同一个东西——一套完整的Erlang/OTP发行版。版本号29是主版本1是次版本最后的1是补丁版本。在RabbitMQ官方文档里要求的通常也是这种版本号格式比如OTP 26.2以上OTP 27.x推荐。1.3 为什么版本不能随便装一个就行很多软件都是能跑就行但Erlang和RabbitMQ之间的关系要谨慎得多。RabbitMQ对Erlang有一个最低版本要求这是因为RabbitMQ的源码里会直接调用某些Erlang标准库的新APIAPI在老版本里不存在的话代码直接编译不过或运行时报undef。反过来超大版本的Erlang也可能不被RabbitMQ支持比如RabbitMQ官方只对经过测试的OTP版本做兼容性声明你用一个提前发布的测试版OTPRabbitMQ正常可能也能启动但一旦出现诡异行为官方不会为你负责也不会认为这是一个RabbitMQ的Bug。记住一个核心判断逻辑新并不等于兼容。Erlang/OTP的版本选择永远以RabbitMQ官方兼容性表为准而不是以最新版最好为准。2. 装Erlang前必须想清楚的两件事版本匹配与系统架构2.1 正面回答rabbitmq-server-4.3.6.exe需要先装Erlang/OTP 29.1.1吗需要而且是必须先装。这个问题的标准答案非常明确RabbitMQ 4.3.6的Windows安装程序本身不包含Erlang运行时安装器会在很早阶段检测本机是否安装了匹配版本的Erlang。如果检测不到安装直接停住只有装了匹配版本的Erlang之后安装流程才能继续。至于是不是必须装29.1.1这个具体版本严格来说不是非它不可。你需要选择的是一个落在RabbitMQ 4.3.6官方支持区间内的Erlang/OTP版本。对于一个较新的RabbitMQ 4.x补丁版本官方通常支持多个OTP主版本区间并且会随着新OTP的发布逐步扩展上限。OTP 29.1.1作为一个较新版本大概率在RabbitMQ 4.3的适配范围内但严谨起见你在安装之前最好去RabbitMQ官方文档的Compatibility页面找到对应版本列表确认一次。这个页面是实时更新的比任何博文里的二手表格都更可信。另外要特别注意RabbitMQ安装器检测Erlang的方式它读的是注册表不是环境变量。也就是说就算你手工配好了erl命令能跑通如果Erlang安装过程残留了问题导致注册表信息不完整RabbitMQ安装器照样不认账。2.2 官方兼容性表怎么读才对打开RabbitMQ官方兼容性页面你会看到一张按RabbitMQ版本和Erlang版本交叉的表格。RabbitMQ 4.x系列的最低要求一般是OTP 26.2推荐版本通常标注为OTP 27.x或更高。读这张表时不要只看最低支持那一列还要看支持区间和建议版本。举个例子就算某个RabbitMQ版本声称支持OTP 26.2而你本机恰好装了OTP 26.2也并不是一个好选择。因为26.2只是能启动的最小版本中间件在高负载下的表现和官方性能测试都是基于推荐版本做的。生产环境建议选择官方推荐的大版本比如27.x或28.x如果你自己要装29.1.1那最好确认一下它是否已经进入支持列表的顶部。2.3 32位还是64位一个过时但实际上仍会遇到的坑现代RabbitMQ 4.x基本已经放弃32位Windows。如果你的操作系统是32位的你会发现连合适的Erlang安装包都不好找到新版本。遇到这种情况请先升级你的操作系统而不是硬装一个几十年前的32位环境。而64位系统上安装64位Erlang安装包时有一个很多人忽略的细节操作系统如果是Windows Server安装时一定要以管理员权限运行。原因在于Erlang安装器需要写注册表HKLM\SOFTWARE下的键值普通用户权限触发UAC后可能只写入到当前用户的私有注册表分支最终RabbitMQ检测不到。Windows 10/11桌面版同理右键以管理员身份运行是最稳妥的打开方式。3. Windows平台安装Erlang/OTP 29.1.1的完整实操3.1 安装包去哪下载最靠谱Erlang/OTP的官方下载地址是 erlang.org/download 这里提供Windows、macOS、Linux等各类安装包。通常一个版本的页面会放多个类型的文件otp_win64_29.1.1.exe、otp_win32_...以及源码压缩包。除了官网GitHub上也有Erlang/OTP的官方Releases页面文件同样是从官网同步上去的。国内网络下载GitHub和官网都可能不稳定一些云厂商的镜像源也会有Erlang的安装包。但我个人不太建议从非官方下载站或网盘拿安装包原因不用多说了捆绑软件、篡改安装包这类风险不值得冒。只要你下载的是带otp_win64_前缀的官方文件安全基本有保障。3.2 安装界面上的每个选项怎么选双击otp_win64_29.1.1.exe之后第一个界面是语言选择框这个语言框只影响安装器本身界面选什么无所谓。接着是安装路径。默认路径通常是C:\Program Files\Erlang。我建议保持默认不要为了省空间改到某个中文路径或者带空格过多的深层目录下。原因很直白RabbitMQ安装器和各种脚本在调用Erlang时需要拼接路径路径里带中文或特殊字符很容易在某些旧脚本里解析失败。如果实在要改建议改成C:\Erlang这种简单短路径。组件选择界面上默认会勾选一堆东西包括编译器、标准库、Debugger、Observer等。如果你只是为了让RabbitMQ能跑起来这些全部保留就好它们不会显著占用磁盘空间。如果你确实是想写Erlang代码那更要全部保留。有一个选项是关联.erl文件到Erlang这个我建议取消勾选除非你确定自己要用Windows资源管理器直接点击运行.erl脚本。关联之后双击文件会启动werl.exe对大多数人来说只会增加困扰。3.3 环境变量的真实结构ERLANG_HOME和PATH缺一不可安装器默认会自动把Erlang相关目录写入PATH但现实里这个自动写入经常不完整或者在你之前装过旧版本时被覆盖。装完之后手动检查和补齐环境变量是一个好习惯。你需要配置的环境变量有两个路径概念ERLANG_HOME指向Erlang的安装根目录即C:\Program Files\Erlang。注意这里不带版本号因为一旦升级Erlang版本这个变量还能继续沿用。PATH追加项需要把%ERLANG_HOME%\bin和%ERLANG_HOME%\erts-版本号\bin都加进去。erts-版本号目录是Erlang运行时系统的实际所在目录里面放着erl.exe的运行时依赖。如果你只加了bin目录erl命令可能能找到但某些依赖会缺失。具体操作步骤是右键此电脑-属性-高级系统设置-环境变量。在系统变量区新建ERLANG_HOME把它设成Erlang安装根目录然后在Path变量末尾新增%ERLANG_HOME%\bin和%ERLANG_HOME%\erts-15.2.5\bin。注意erts-版本号这个目录名跟OTP大版本不完全一致你得打开C:\Program Files\Erlang看你机器上实际生成的目录名再填。提示修改完环境变量后所有已经打开的cmd窗口都不会生效必须新开一个cmd窗口才能读到最新PATH。这是很多人改完环境变量后觉得没生效的最常见原因。3.4 验证安装是否成功的完整命令清单在配置好环境变量的情况下新开cmd窗口依次执行以下命令erl -version命令行会输出类似Erlang (SMP,ASYNC_THREADS) (HIPE)的信息。注意erl -version输出里带的是OTP版本号比如OTP 29会输出一个以29开头的版本字符串。如果你只想拿到干净的版本号并把它用在脚本里可以执行erl -noshell -eval io:format(\~s~n\, [erlang:system_info(otp_release)]), halt().输出29说明OTP大版本就是29。如果你想确认具体补丁版本号可以用erl -noshell -eval io:format(\OTP ~s~n\, [erlang:system_info(otp_release)]), halt().另外直接输入erl会进入Erlang交互式ShellEshell V15.2它的提示符是1。进入之后输入halt().再回车就能退出。如果你看到一个带图形界面的werl窗口那也是正常的werl.exe和erl.exe是同一个内核的两种前端功能上没区别。4. 安装RabbitMQ 4.3.6时它和Erlang是怎么联动的4.1 RabbitMQ安装器到底检测了什么双击rabbitmq-server-4.3.6.exe之后安装器先做的不是解压文件而是查注册表。它会去HKLM\SOFTWARE\Ericsson\Erlang分支下读取已经安装的Erlang版本号。注意这是在HKEY_LOCAL_MACHINE下的如果Erlang装的时候没写进这个键检测就会失败。新版RabbitMQ安装器在检测到Erlang版本不足或缺失时会弹出一个很明确的提示框告诉你当前找到的Erlang版本是多少、需要的最小版本是多少。有人这时候会想那我只把这个提示框忽略掉继续装行不行我劝你打消这个念头。就算你通过绕过检测装完了RabbitMQ后续注册Windows服务时依然会失败因为服务本身的启动脚本rabbitmq-server.bat里会自动调用Erlang的erl来启动节点找不到Erlang就是一个死局。还有一种情况是某些版本RabbitMQ安装器会提供一个自动下载安装Erlang的选项。这个功能听起来方便但实际体验一般下载源在国外经常卡在半路而且装上的版本可能是满足最低要求而不是推荐的版本。为了省那几分钟最后反而要花更多时间去排错不划算。4.2 装完RabbitMQ后如何注册并启动服务RabbitMQ安装完成之后默认会把文件解压到C:\Program Files\RabbitMQ。安装器一般会自动注册Windows服务但如果你在安装时取消了某些组件或者服务注册失败你需要手动完成。打开RabbitMQ Command Prompt这是一个已经被切到RabbitMQ安装目录的cmd窗口比普通cmd方便一些。在窗口里执行rabbitmq-service.bat install注册服务成功后Windows服务管理器里会出现RabbitMQ服务项。接着启动它rabbitmq-service.bat start启动需要等几秒如果没有任何报错就已经在后台运行了。随后用rabbitmqctl status能看到节点的名称、运行时长、OTP版本、队列数量等一堆健康信息。在这条命令的输出里有一项叫OTP version的字段它显示的就是当前实际使用的Erlang版本。如果这个版本和你预装的不一致说明配置文件里可能指定了另一个Erlang安装路径。4.3 版本匹配失败的典型症状与日志位置版本不匹配的RabbitMQ通常不会在安装阶段炸掉而是会在启动阶段以各种诡异方式失败。最典型的是rabbitmq-service.bat start执行后长时间无响应最后超时报错。Windows事件日志里看到RabbitMQ服务多次启动失败。rabbitmqctl status报错信息里包含unable to connect to node ...。这些报错翻译成中文就是一句话Erlang节点起不来。原因往往就是erl和RabbitMQ之间版本不配套或者是Erlang进程启动过程中因为缺少依赖直接退出。日志是判断问题的最好切入点。RabbitMQ的运行日志默认存放在C:\Users\你的用户名\AppData\Roaming\RabbitMQ\log\目录打开最新的.log文件如果里面出现FAILED TO START这类字样往下翻几行通常能找到具体是哪个Erlang模块加载失败。5. 踩坑实录从错误提示反推原因的全过程5.1 装了ErlangRabbitMQ安装器却说没有检测到这个坑我栽过一次。当时我在一台Windows Server上去装RabbitMQ先装好Erlang双击RabbitMQ安装器结果直接告诉我No Erlang Installation Found。我第一反应是把Erlang重装一遍依然不行。冷静下来之后排查的核心放在注册表路径上。用regedit打开注册表去HKLM\SOFTWARE\Ericsson\Erlang看果然没有这个键。原因是我之前装的是32位Erlang安装包在64位系统上它的注册表被重定向到了HKLM\SOFTWARE\WOW6432Node\Ericsson\Erlang。RabbitMQ安装器作为64位程序默认只看64位注册表分支自然看不到32位Erlang。解决办法很干脆彻底卸载那个32位Erlang然后下载otp_win64_29.1.1.exe这个64位版本重新安装。重新装完再看注册表HKLM\SOFTWARE\Ericsson\Erlang下已经有正确的版本信息。5.2 erl命令能用但一打开werl就闪退装完Erlang之后我顺手想打开图形化的werl.exe看看结果窗口闪一下就没了。用cmd运行werl.exe也只看到一句error loading extension ini file然后退出。排查过程erl -version能输出说明核心部分没坏问题大概率出在图形Shell额外依赖的组件上。去事件查看器看了一眼发现提示缺少某个C运行库。然后我去下载并安装了对应版本的Microsoft Visual C Redistributablex64werl.exe就正常了。后来想明白RabbitMQ本身根本不需要werl它只需要非图形的erl.exe就够了。所以如果你只是为了跑RabbitMQwerl闪不闪退完全不用管。但如果你拿Erlang当开发工具用那就得把VC运行库补齐。5.3 环境变量配好了新开cmd还是提示erl不是内部或外部命令环境变量的坑可以说是最高频的。很多人的操作顺序是改完了PATH在原来那个CMD窗口里敲erl发现还是找不到命令。这不是配置错了而是CMD窗口的环境变量是从它的父进程继承的Windows不会在你修改系统变量后自动刷新已打开窗口。正确验证方式重新打开一个全新的cmd窗口再敲erl -version。如果新窗口依然找不到那才说明配置有问题继续检查%ERLANG_HOME%\bin路径拼写是否多了一个空格或引号。另外有一个很微妙的细节PowerShell和cmd对%ERLANG_HOME%的解析方式是一样的就把这个变量当成一个带百分号的环境变量就行。但是如果你的PATH里写的是带引号的C:\Program Files\Erlang\bin在某些脚本里反而容易出问题。系统环境变量里路径如果包含空格不需要前后加引号因为Windows API会自己处理带空格的路径。5.4 卸载不干净旧版本Erlang导致版本错乱如果你机器上装过多个Erlang版本比如旧的OTP 25和新的OTP 29共存卸载旧版本时Windows的卸载程序经常清理不干净留下了C:\Program Files\erlang或注册表项。结果就是RabbitMQ安装器可能读到一个奇怪的版本号要么提示过高不支持要么干脆读了残留的旧版本号认为你还没有装新版本。我的建议是装新版Erlang之前先把系统里其他Erlang版本卸载干净再用注册表编辑器删掉残留的HKLM\SOFTWARE\Ericsson\Erlang下的所有子键最后清理硬盘上残存的Erlang目录。保证一个系统只有一个干净的Erlang版本能省掉后续无数麻烦。5.5 RabbitMQ服务启动超时从日志到最终定位最后分享一个比较难排查的坑。RabbitMQ服务注册成功rabbitmq-service.bat start执行了然后窗口卡住一两分钟最终报超时。查服务事件日志能看到服务已经在运行但节点没有起来。把目光转向RabbitMQ日志目录发现里面有BOOT FAILED字样紧接着下面有一行Distribution port conflict。这个问题的本质是Erlang节点之间进行分布式通信的端口被其他程序占用了。对于本机只有一台RabbitMQ的情况来说通常是因为之前残留的Erlang虚拟机进程还没有退出占用了同一个epmd端口。用任务管理器结束掉所有残留的erl.exe和epmd.exe进程重新执行rabbitmq-service.bat start就正常了。这个经验说明了一个道理RabbitMQ启动失败不要盯着一眼看不明白的错误字符串发呆去日志里找具体原因很多问题往回推就能找到答案。6. 非Windows场景的快速参考和个人习惯建议6.1 Linux和macOS其实更简单如果你不是在Windows上安装而是准备在Linux服务器上搭RabbitMQ不用去找官网的exe文件了。Debian/Ubuntu系列可以用下面这条命令安装Erlangsudo apt install erlangCentOS/RHEL系列用sudo yum install erlang不过要注意系统自带的Erlang版本可能比较旧不一定满足RabbitMQ 4.3.6的新版本要求。更推荐的做法是先去RabbitMQ官方文档查看Erlang版本的安装指引他们会提供自己的APT/YUM仓库地址直接以指定源方式安装匹配的Erlang/OTP。macOS上用Homebrew一条命令brew install erlang装完之后验证方式是通用的erl -version能跑就说明基础环境OK。6.2 Docker方案彻底绕开本机安装如果你不想在本机折腾Erlang和RabbitMQ的版本匹配那可以考虑Docker。rabbitmq官方镜像本身自带Erlang运行时你不需要在宿主机上装任何Erlang相关的东西。拉镜像、跑容器RabbitMQ的Erlang版本也随之固定宿主机完全无感。这个方案的真正优势体现在多人协作环境里每个人拉同一个镜像Erlang和RabbitMQ版本完全一致不会再出现我这儿能跑你那儿跑不了的尴尬。6.3 我个人实际操作中的习惯Erlang在Windows上的安装其实不算难难的是版本匹配这个前置判断和环境变量这个善后工作。我自己的习惯是先下载Erlang安装然后打开新cmd窗口依次确认erl -version、检查ERLANG_HOME和PATH确认无误之后再去双击RabbitMQ安装器。这套流程刚开始看起来是繁琐的但在我长时间不接触RabbitMQ、重新回来搭环境的时候它帮我省下了大量排查时间。希望你从现在起也养成这个习惯无论是Erlang还是RabbitMQ小版本号和大版本区间永远值得你多花30秒确认一次而不要顺手装个最新版就往生产环境冲。
阅读完成 · 觉得有帮助?