无法通过pika在Heroku连接RabbitMQ,可能是AccessDeniedError

5 投票
2 回答
5035 浏览
提问于 2025-04-19 08:42

我刚在Heroku上设置了一个RabbitMQ的插件。在本地开发我的应用程序时,我可以顺利地排队和消费消息,但当我把它部署到Heroku后,就一直无法成功连接。我的用户名、密码、主机名、端口和虚拟主机都是从heroku config中获取的。如果我更改用户名或密码,错误信息就会变成ProbableAuthenticationError,这让我觉得至少认证是正确的,但可能是我的虚拟主机或其他配置有问题。我在StackOverflow上没有找到类似的问题,经过一个小时的谷歌搜索也没有找到能解决我问题的内容。

我尝试了RABBITMQ_BIGWIG_RX_URLRABBITMQ_BIGWIG_TX_URL这两个环境变量来发送和消费消息,但无论怎么组合都不行。下面是我尝试连接的代码。

url = 'small-laurel-24.bigwig.lshift.net'
port = 10019
vhost = '/notmyrealvhost'

credentials = pika.PlainCredentials('username', 'password')
parameters = pika.ConnectionParameters(url, port, vhost, credentials=credentials)
connection = pika.BlockingConnection(parameters)

我是不是漏掉了什么,或者有什么办法可以找出具体配置错了什么?我现在很困惑。非常感谢!

我使用的是pika 0.9.14,python 2.7.3。

2 个回答

9

问题很可能是因为你在虚拟主机的设置中加了一个斜杠。很多用户会把这个斜杠和根目录搞混,其实它只是默认的虚拟主机名称。

除非你真的把虚拟主机的名字设成了斜杠,否则它的名字总是和你在管理控制台看到的一样,比如:

  • my_virtualhost,而不是 /my_virtualhost

这就是为什么你的解决方案有效,因为在使用 URLParameters 时你没有加那个多余的斜杠。

你原来的代码在使用 URLParameters 时应该是这样的:

amqp://username:password@small-laurel-24.bigwig.lshift.net:10018/%2Fnotmyrealvhost

而你在上面提到的有效版本则没有斜杠(%2F)这个字符。

amqp://username:password@small-laurel-24.bigwig.lshift.net:10018/notmyrealvhost
3

我最后通过使用pika中的URLParameters类来解决了我的问题,这个类可以解析Heroku环境变量中的URL。

它可以处理像这样的字符串:amqp://username:password@small-laurel-24.bigwig.lshift.net:10018/notmyrealvhost,并把里面的所有信息都解析出来。我之前自己搞得太复杂了,其实用这个类就可以了。

撰写回答