主机名首次更改后,rabbitmq-server无法启动

59

我正在为我的Django项目使用django-celery。昨天我更改了计算机的主机名(我正在使用Ubuntu 12.04,编辑了文件“/etc/hostname”),在下一次重启后,django-celery失败并显示错误。

Consumer: Connection Error: [Errno 111] Connection refused. Trying again in 4 seconds...

经过对这个错误的一些研究,我发现更改我的主机名导致了这个错误,来源于这里。我的rabbitmq启动日志显示:

文件:/var/log/rabbitmq/startup_log

Activating RabbitMQ plugins ...

********************************************************************************
********************************************************************************

0 plugins activated:

ERROR: epmd error for host "jinesh": nxdomain (non-existing domain)

我的startup_err文件是空的。

当我运行时

root@jinesh:/home/jinesh# rabbitmqctl list_users
Listing users ...
Error: unable to connect to node rabbit@jinesh: nodedown

DIAGNOSTICS
===========

nodes in question: [rabbit@jinesh]

hosts, their running nodes and ports:
- unable to connect to epmd on jinesh: nxdomain

current node details:
- node name: rabbitmqctl4956@jinesh
- home dir: /var/lib/rabbitmq
- cookie hash: RGhmB2JR1LbZ57j7xWWTxg==

我希望更改节点名称可以解决这个问题,但是我找不到实现它的方法。有人知道如何解决这个问题吗?

更新

当更改主机名时,您必须同时更改/etc/hostname/etc/hosts文件。

我重新安装了rabbitmq并解决了这个问题,将回答这个问题。


在CentOS/RHEL上,如果您通过/etc/udev/rules/70-persistant-net.rules重命名网络接口并重新启动,则会从rabbitmqctl status收到错误消息“无法连接到epmd”。解决方法与此问题的@RichardHFung所接受的答案相同。 - Trevor Boyd Smith
"systemctl restart rabbitmq-server.service" 解决了我遇到的同样问题。 - Hem
如果您使用的是Ubuntu 16.04或18.04,请勿通过存储库安装RabbitMQ(它们已过时)。请前往https://www.rabbitmq.com/install-debian.html并从其中一个建议的存储库安装Erlang和RabbitMQ,以避免日后出现一些麻烦。我曾经从erlang solutions安装了Erlang,并且很久以后通过其Ubuntu存储库安装了RabbitMQ,最初运行良好。但在最近的升级后,出现了问题,我花了5个小时试图解决它,但无济于事。我删除了两个软件包,并按照说明重新安装了Bintray的版本。问题得到了解决。 - Michael Ekoka
14个回答

57

为了解决这个问题,需要卸载旧版的RabbitMQ,并重新安装。以下是以root用户身份运行的重新安装RabbitMQ的步骤:

  1. 停止RabbitMQ: rabbitmqctl stop

  2. 更改/etc/hosts

  3. 更改/etc/hostname

  4. 卸载旧版RabbitMQ:dpkg -P rabbitmq-server

  5. 删除RabbitMQ的数据库:rm -rf /var/lib/rabbitmq

  6. 查找运行rabbit的erlang进程:ps ax | grep rabbit

  7. 结束列表中的进程

  8. 重新安装RabbitMQ:apt-get install rabbitmq-server

我在我的博客上写了这些步骤。

修订

我把我的博客搬到了一个新网站。


2
在Ubuntu(14.04.1 LTS)上,这对我没有起作用。我需要运行apt-get purge rabbitmq-server,然后再运行apt-get install rabbitmq-server来使其在主机名更改后重新正常工作。 - Mike McMahon
9
RabbitMQ 没有明显原因就会崩溃,唯一的解决方法是卸载并重新安装?这很令人震惊... - Cerin
7
有没有不丢失数据的做法? - cevaris
8
我给出了负面评价,因为提供的解决方案并不是真正的解决方法。如果我再次更改主机名会怎样?再次删除 RabbitMQ,重新安装...... - tersakyan
1
如果您不想丢失数据,请查看@Kishor Pawar的答案。 - Mehdi Yedes
显示剩余3条评论

43

感谢Richard H Fung的帮助。

他的步骤帮助我解决了这个问题。

但我不需要重新安装rabbitmq。

当我打开我的/etc/hosts文件时,我发现分配给我的主机名的IP与实际的ip(192.168.1.200 [静态])不同。

#/etc/hosts  
127.0.0.1       localhost  
192.168.1.115   HOSTNAME

所以我只是在我的/etc/hosts文件中将IP地址更改为192.168.1.200,然后它就正常工作了。


2
这正是我遇到的情况,同样的解决方案奏效了 - 无需重新安装并修复IP地址,问题得以解决。 - naoko
这应该被接受为正确的解决方案。在xenial上,我有/etc/hosts将GloballyRoutableIP与“hostname”名称(而不是fqdn)关联起来,并发现将NetworkTenIP与该名称关联可以修复epmd。杀死epmd并重新启动rabbit就足够了。 - J_H
哎呀!幸好不用重新安装。更改主机名后我的问题是我在/etc/hostname中没有使用FQDN。这没关系,但你需要将该短别名放入/etc/hosts的127.0.0.1中,否则erlang系统无法解析它。然而,我失去了所有队列内容,可能这个存储与旧主机名有关。也许可以通过在配置文件中放置IP地址来解决这个问题... - CodeClown42

26

Richard的回答很好,但在rabbitmq队列中你可能会失去一些信息。以下是保留先前rabbitmq设置与新主机名的可能方法。

简短回答:

如果您想要保留新的主机名更改,则可以在/etc/rabbitmq中创建一个rabbitmq-env.conf文件,该文件引用旧主机名,然后一切都应该没问题了。以下是rabbitmq-env.conf文件中应该包含的内容:

NODENAME=rabbit@OLDHOSTNAME
添加配置文件后,重新启动rabbitmq服务器,然后你应该就可以了(例如:service rabbitmq-server restart(在Ubuntu可能需要sudo))。有关更多详细信息,请参阅rabbitmq网站:https://www.rabbitmq.com/man/rabbitmq-env.conf.5.man.html。关于答案的更多细节:我在使用CentOS时遇到了类似的主机名问题...根本问题在于安装rabbit时,它引用了安装时的当前主机名。由于这是一个rabbitmq的问题,所以解决方案应该适用于其他Linux发行版。如果您想查看完整的答案,可以在此处查看:rabbtimqadmin - Could not connect: [Errno -2] Name or service not known

1
这对我很有帮助。我在ArchLinux上更新到了最新版本的rabbitmq(3.6.6-1),但无法启动它。查看了/etc/rabbitmq/rabbitmq-env.conf文件,发现NODENAME是错误的。在升级期间,它不再是rabbit@machine,而变成了rabbit@machine@machine。只需删除最后一个@machine即可解决问题。 - qwelyt
这是我个人认为的正确答案...@Chewtoy,甚至在Arch wiki上都有 :-D https://wiki.archlinux.org/index.php/Rabbitmq#Changed_hostname - danidee
太棒了!谢谢。我更改了主机名,但不想丢失任何信息(用户名等)。env.conf文件解决了我的问题。 - mFlorin
这个文件在Windows上在哪里? - TheRealChx101

6
你可以通过删除与rabbitmq关联的erlang mnesia数据库或重新安装rabbitmq来解决此问题。
我从rabbitmq邮件列表中得到了第一种解决方案的提示。答案摘录如下: Erlang Mnesia数据库是特定于主机的(因为它是分布式数据库)。让你修复的最简单的方法是清除数据库目录。 第二种方法是最简单的方法(虽然不建议)。要卸载,请执行
dpkg -P rabbitmq-server

如果您想了解如何安装/卸载Debian软件包,可以参考链接


你如何找到Erlang Mnesia数据库? - Matt Canty
嗨@MatthewCanty:我遵循了第二种方法。 - Jinesh
在rabbitmq 3.6.9-1中,只需执行rm -rf /var/lib/rabbitmq/mnesia/命令。而Erlang Mnesia数据库位于文件路径/var/lib/rabbitmq/mnesia/下。 - CHENJIAN

5
在Windows系统上,我遇到的问题是由于McAfee防火墙引起的。具体错误内容如下:
epmd error for host "<HOSTNAME>": address (cannot connect to host/port)
只要禁用防火墙,它就开始工作了。

这帮了我大忙。我一直在为此苦苦挣扎了两个小时,禁用它后就像魔法般奏效了,谢谢! - Aviram Fireberger

4
在我的情况下,/etc/hosts 文件中没有以下条目:
127.0.0.1 <hostname>

其中<hostname>是我的机器主机名(由hostname命令给出)。添加了这行后,RabbitMQ成功启动。我之前没有安装过RabbitMQ。


对我来说,这是有效的答案。但是我仍然困惑为什么默认的 127.0.0.1 localhost.localadmin localhost 行没有解析到适当的节点名称。非常感谢! - Letokteren

4

删除RabbitMQ数据库: rm -rf /var/lib/rabbitmq/*

执行此操作可以解决问题。我相信在某些转储中存储了节点主机名和IP对应关系的记录。如果某些主机意外更改,则会导致矛盾。


在执行此操作时要小心,否则您将会失去所有数据。 - Jay Prakash

3
我的解决方案是检查和更正$HOSTNAME/etc/hostname。结果发现我的路由器有些混乱,给了我一个错误的主机名域。在重新启动后,我调用了export HOSTNAME=the.correct.hostname,我的Rabbit运行正常,而无需重新启动服务器操作系统。

它成功了,甚至没有卸载rabbitmq-server。 - Nabeel Ahmed

2
当在Windows上(抱歉 - 我了解这个话题是关于Ubuntu的)时,只需重新安装RabbitMQ服务即可:
rabbitmq-service.bat remove
rabbitmq-service.bat install

脚本位于C:\Program Files\RabbitMQ Server\rabbitmq_server-<version>\sbin文件夹中。
或者只需更改HKEY_LOCAL_MACHINE\SOFTWARE\Ericsson\Erlang\ErlSrv\1.1\RabbitMQ\@SName的值就足够了。
提示:https://github.com/rabbitmq/rabbitmq-server/issues/620

1
为了解决这个问题,我更改了/etc/hostname文件中的新主机名,然后重新启动了计算机。之后,我运行了rm -rf /var/lib/rabbitmq/mnesia/*
然后重新启动服务:sudo service rabbitmq-server restart 此时,对我来说它起作用了。如果仍然无法工作,请修改文件/etc/rabbitmq/rabbitmq-env.conf,并添加以下信息:
NODENAME=rabbit@YOUR_NEW_HOSTNAME
NODE_IP_ADDRESS=127.0.0.1
NODE_PORT=5672

然后重新启动服务:sudo service rabbitmq-server restart

希望有所帮助。


我曾经遇到过类似的问题,当我更改主机名后,rabbitmq出现了问题。这个方法对我有用。谢谢。 - Saji Xavier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接