#php #amazon-web-services #rabbitmq #amazon-mq
#php #amazon-веб-сервисы #rabbitmq #amazon-mq
Вопрос:
Я создал брокера Amazon MQ:
- Выберите механизм брокера: RabbitMQ 3.8.6
- Брокер с одним экземпляром
- Сеть и безопасность: общедоступный доступ
- VPC и подсети: используйте VPC и подсети по умолчанию
Я пробовал две библиотеки: из RabbitMQ manual и Enqueue AmqpExt
Ни один из них не может подключиться к Amazon (с контейнером docker все работает нормально. Но я хочу попробовать AMAZON MQ.
Я использовал приведенный ниже код:
use EnqueueAmqpExtAmqpConnectionFactory;
use PhpAmqpLibConnectionAMQPSSLConnection;
$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-сертификат Amazon.
Если да, то как это исправить?
Ответ №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_on
и ssl_verify
параметры
Комментарии:
1. Это была моя первая конфигурация (без ssl).
2. Вы пытались установить
'dsn' => 'amqps:'
параметры?3. Нет. Можете ли вы порекомендовать библиотеку PHP, которая работает? Я думаю, что это проблема с ними: Enqueue AmqpExt AmqpConnectionFactory amp;amp; PhpAmqpLib Connection AMQPSSLConnection
4. @EugeneK Вы нашли какую-нибудь библиотеку PHP, которая может работать с протоколом «amqps», я получаю эту ошибку
Unable to find the socket transport "amqp" - did you forget to enable it when you configured PHP?
Ответ №3:
Я вижу, что вы установили amqp-ext и используете его ConnectionFactory
use EnqueueAmqpExtAmqpConnectionFactory;
но
Если вы используете php-enqueue и хотите подключиться к AWS AMQ RabbitMQ, вам следует установить и использовать enqueue/amqp-lib вместо enqueue / amqp-ext
и сведения о подключении
use EnqueueAmqpLibAmqpConnectionFactory;
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:'
]
);
Комментарии:
1. Попробовав десятки решений, найденных в Интернете, это единственное решение, которое мне помогло.