【问题标题】:Can't connect to RabbitMQ on Amazon MQ无法连接到 Amazon MQ 上的 RabbitMQ
【发布时间】:2020-11-18 07:13:27
【问题描述】:

我创建了一个 Amazon MQ 代理:

  • 选择代理引擎:RabbitMQ 3.8.6
  • 单实例代理
  • 网络和安全:公共访问
  • VPC 和子网:使用默认 VPC 和子网

我尝试了两个库:来自 RabbitMQ 手册和 Enqueue\AmqpExt

他们中的任何一个都无法连接到亚马逊(使用 docker 容器一切正常。但我想试试 AMAZON MQ。

我使用下面的代码:

    use Enqueue\AmqpExt\AmqpConnectionFactory;
    use PhpAmqpLib\Connection\AMQPSSLConnection;

    $connectionFactory = new AmqpConnectionFactory([
        'host'      => 'b-da219bXXXXXXXXXXXX86a.mq.us-east-1.amazonaws.com',
        'port'      => 5671,
        'vhost'     => '/',
        'user'      => 'xxxx',    
        'pass'      => 'xxxx', // I can login with this to rabbit admin panel
        'persisted' => false,
        'ssl_on' => false,
        'ssl_verify' => false,
    ]);

    $c = $connectionFactory->createContext();

    $queue = $c->createQueue('emails');
    $c->declareQueue($queue);

结果:

  Library error: connection closed unexpectedly - Potential login failure.

使用 'ssl_on' => true 同样的错误。

我不知道这是否会发生,因为我没有向亚马逊提供 ssl 证书。

如果是,如何解决?

【问题讨论】:

    标签: php amazon-web-services rabbitmq amazon-mq


    【解决方案1】:

    我在 php-amqplib 上取得了成功,但我实际上并没有使用最新版本(我使用的是 v2.12.3)。我可以使用这个连接:

    $connection = new AMQPSSLConnection($host, $port, $user, $pass, $vhost, ['verify_peer_name' => false], [], 'ssl');
    

    我发现我不得不设置'verify_peer_name' => false,否则我刚刚收到unable to connect to ssl://localhost:5671 (Unknown error) 错误,但我也通过localhost 进行端口转发。

    【讨论】:

      【解决方案2】:

      Amazon MQ 代理(特别是 RabbitMQ)默认使用 SSL(您可以注意到连接字符串以 amqps 开头,而不是 amqp

      在您的情况下,您应该设置为 true ssl_onssl_verify 选项

      【讨论】:

      • 这是我的第一个配置(无 ssl)。
      • 您是否尝试在选项中设置'dsn' => 'amqps:'
      • 不。你能推荐一个有效的 PHP 库吗?我认为这是他们的问题: Enqueue\AmqpExt\AmqpConnectionFactory && PhpAmqpLib\Connection\AMQPSSLConnection
      • @EugeneK 你有没有找到任何可以使用“amqps”协议的PHP库,我收到这个错误Unable to find the socket transport "amqp" - did you forget to enable it when you configured PHP?
      【解决方案3】:

      我看到你安装了 amqp-ext 并使用它的 ConnectionFactory

      use Enqueue\AmqpExt\AmqpConnectionFactory; 但是

      如果您使用 php-enqueue 并想连接到 AWS AMQ RabbitMQ,您应该安装并使用 enqueue/amqp-lib 而不是 enqueue/amqp-ext

      和连接细节

      use Enqueue\AmqpLib\AmqpConnectionFactory;
      
      new AmqpConnectionFactory([
      
          'host' => env('RABBITMQ_HOST'),
          'port' => env('RABBITMQ_PORT', 5672),
          'vhost' => env('RABBITMQ_DEFAULT_VHOST'),
          'user' => env('RABBITMQ_USERNAME'),
          'pass' => env('RABBITMQ_PASSWORD'),
          'persisted' => false,
          'ssl_on' => true,
          'ssl_verify' => true,
      
      ]);
      

      【讨论】:

        【解决方案4】:

        @Eugene K 在子评论中回答:

        您需要将 DSN 添加到 SSLOptions 数组中,并且您需要使用 AMQPSSLConnection 而不是 AMQPStreamConnection

                $this->connection = new AMQPSSLConnection(
                'myhost.mq.eu-west-1.amazonaws.com',
                '5671',
                'username',
                'xxx',
                '/',
                [
                    'dsn' => 'amqps:'
                ]
            );
        

        【讨论】:

        • 在尝试了数十种在互联网上找到的解决方案后,唯一对我有帮助的解决方案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-02-10
        • 2020-07-07
        • 1970-01-01
        • 2015-12-25
        • 1970-01-01
        • 1970-01-01
        • 2015-07-08
        相关资源
        最近更新 更多