AWS 中的 Symfony RabbitMQ Bundle(托管服务):有什么方法可以让它正常工作?
Symfony RabbitMQ Bundle in AWS (managed service): Any way to get this working?
我们确实尝试了很多,但它仍然无法在 AWS 中获取 Symfony RabbitMQ 包 (https://github.com/php-amqplib/RabbitMqBundle) 运行(使用 Docker)。 AWS只允许在AWS托管服务中打开AMQPS和端口5671。
这是我们当前的详细配置:
old_sound_rabbit_mq:
connections:
default:
# nevermind
secure:
url: 'amqps://%env(RABBITMQ_USER)%:%env(RABBITMQ_PASSWORD)%@%env(RABBITMQ_HOST)%:%env(RABBITMQ_PORT)%'
vhost: '%env(RABBITMQ_VHOST)%'
lazy: true
connection_timeout: 6
read_write_timeout: 6
ssl_context:
verify_peer: false
keepalive: true
heartbeat: 60
use_socket: true # default false
producers:
# use 'old_sound_rabbit_mq.[my-producer-name]_producer' service to send data.
article_create:
connection: secure
exchange_options: { name: pimcore.article.create, type: topic }
queue_options:
name: article_create
请注意,我们使用“url”配置值,因为它似乎是为捆绑包设置 AMQPS 的唯一方法。
docker-compose.yml的相关部分:
php-fpm:
container_name: php-fpm
environment:
- RABBITMQ_HOST=my-rabbitmq # usually the docker container (otherwise localhost or server address)
- RABBITMQ_PORT=5671 # locally it seems to work with 5672
- RABBITMQ_USER=user
- RABBITMQ_PASSWORD=password
- RABBITMQ_VHOST=/
rabbitmq:
container_name: my-rabbitmq
image: rabbitmq:3.8-management
ports:
- 127.0.0.1:15672:15672
- 127.0.0.1:5672:5672
- 127.0.0.1:5671:5671
environment:
- RABBITMQ_DEFAULT_USER=pimcore
- RABBITMQ_DEFAULT_PASS=pimcore
volumes:
- rabbitmq:/var/lib/rabbitmq
这是从 Symfony 事件监听器发送消息的方式:
$this->appKernel->getContainer()->get('old_sound_rabbit_mq.article_create_producer')->publish(
serialize($objToSend),
"article_create",
[
'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT,
'message_id' => md5(uniqid("prefix", true))
]
);
这一切似乎都在本地运行,没有任何问题。在 AWS 中,我们收到以下错误:
不带插座:
Broken pipe or closed connection
带插座:
[2021-06-08 15:59:45] request.CRITICAL: Uncaught PHP Exception ErrorException: "Warning: socket_recv(): unable to read from socket [104]: Connection reset by peer" at /var/www/vendor/php-amqplib/php-amqplib/PhpAmqpLib/Wire/IO/SocketIO.php line 121 {"exception":"[object] (ErrorException(code: 0): Warning: socket_recv(): unable to read from socket [104]: Connection reset by peer at /var/www/vendor/php-amqplib/php-amqplib/PhpAmqpLib/Wire/IO/SocketIO.php:121)"} []
终于解决了 - 您必须使用带有 SSL 选项的自定义 AMQPConnection 定义自定义 AMQPChannel,然后将此 AMQPChannel 设置为生产者:
// SSL
if ($port === 5671) {
$sslOptions = array(
'cafile' => CERTS_PATH . '/ca_certificate.pem',
'local_cert' => CERTS_PATH . '/client_certificate.pem',
'local_pk' => CERTS_PATH . '/client_key.pem',
'verify_peer' => true,
'verify_peer_name' => false,
);
$amqpSslConnection = new AMQPSSLConnection(
getenv('RABBITMQ_HOST'),
$port,
getenv('RABBITMQ_USER'),
getenv('RABBITMQ_PASSWORD'),
getenv('RABBITMQ_VHOST'),
$sslOptions
);
$amqpChannel = new AMQPChannel($amqpSslConnection);
$producer->setChannel($amqpChannel);
return $producer;
}
可能晚了但是。
对于与 Aws MQ (Rabbit) 的 SSL 连接,您需要在路径中添加 .perm。
'%env(MESSENGER_TRANSPORT_DSN)%cacert=%env(resolve:MESSENGER_TRANSPORT_CERT)%'
你可以在这个 aws 烫发 url: AmazonRootCA1.pem
希望对您有所帮助。
我们确实尝试了很多,但它仍然无法在 AWS 中获取 Symfony RabbitMQ 包 (https://github.com/php-amqplib/RabbitMqBundle) 运行(使用 Docker)。 AWS只允许在AWS托管服务中打开AMQPS和端口5671。
这是我们当前的详细配置:
old_sound_rabbit_mq:
connections:
default:
# nevermind
secure:
url: 'amqps://%env(RABBITMQ_USER)%:%env(RABBITMQ_PASSWORD)%@%env(RABBITMQ_HOST)%:%env(RABBITMQ_PORT)%'
vhost: '%env(RABBITMQ_VHOST)%'
lazy: true
connection_timeout: 6
read_write_timeout: 6
ssl_context:
verify_peer: false
keepalive: true
heartbeat: 60
use_socket: true # default false
producers:
# use 'old_sound_rabbit_mq.[my-producer-name]_producer' service to send data.
article_create:
connection: secure
exchange_options: { name: pimcore.article.create, type: topic }
queue_options:
name: article_create
请注意,我们使用“url”配置值,因为它似乎是为捆绑包设置 AMQPS 的唯一方法。
docker-compose.yml的相关部分:
php-fpm:
container_name: php-fpm
environment:
- RABBITMQ_HOST=my-rabbitmq # usually the docker container (otherwise localhost or server address)
- RABBITMQ_PORT=5671 # locally it seems to work with 5672
- RABBITMQ_USER=user
- RABBITMQ_PASSWORD=password
- RABBITMQ_VHOST=/
rabbitmq:
container_name: my-rabbitmq
image: rabbitmq:3.8-management
ports:
- 127.0.0.1:15672:15672
- 127.0.0.1:5672:5672
- 127.0.0.1:5671:5671
environment:
- RABBITMQ_DEFAULT_USER=pimcore
- RABBITMQ_DEFAULT_PASS=pimcore
volumes:
- rabbitmq:/var/lib/rabbitmq
这是从 Symfony 事件监听器发送消息的方式:
$this->appKernel->getContainer()->get('old_sound_rabbit_mq.article_create_producer')->publish(
serialize($objToSend),
"article_create",
[
'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT,
'message_id' => md5(uniqid("prefix", true))
]
);
这一切似乎都在本地运行,没有任何问题。在 AWS 中,我们收到以下错误:
不带插座:
Broken pipe or closed connection
带插座:
[2021-06-08 15:59:45] request.CRITICAL: Uncaught PHP Exception ErrorException: "Warning: socket_recv(): unable to read from socket [104]: Connection reset by peer" at /var/www/vendor/php-amqplib/php-amqplib/PhpAmqpLib/Wire/IO/SocketIO.php line 121 {"exception":"[object] (ErrorException(code: 0): Warning: socket_recv(): unable to read from socket [104]: Connection reset by peer at /var/www/vendor/php-amqplib/php-amqplib/PhpAmqpLib/Wire/IO/SocketIO.php:121)"} []
终于解决了 - 您必须使用带有 SSL 选项的自定义 AMQPConnection 定义自定义 AMQPChannel,然后将此 AMQPChannel 设置为生产者:
// SSL
if ($port === 5671) {
$sslOptions = array(
'cafile' => CERTS_PATH . '/ca_certificate.pem',
'local_cert' => CERTS_PATH . '/client_certificate.pem',
'local_pk' => CERTS_PATH . '/client_key.pem',
'verify_peer' => true,
'verify_peer_name' => false,
);
$amqpSslConnection = new AMQPSSLConnection(
getenv('RABBITMQ_HOST'),
$port,
getenv('RABBITMQ_USER'),
getenv('RABBITMQ_PASSWORD'),
getenv('RABBITMQ_VHOST'),
$sslOptions
);
$amqpChannel = new AMQPChannel($amqpSslConnection);
$producer->setChannel($amqpChannel);
return $producer;
}
可能晚了但是。
对于与 Aws MQ (Rabbit) 的 SSL 连接,您需要在路径中添加 .perm。
'%env(MESSENGER_TRANSPORT_DSN)%cacert=%env(resolve:MESSENGER_TRANSPORT_CERT)%'
你可以在这个 aws 烫发 url: AmazonRootCA1.pem
希望对您有所帮助。