Symfony Mercure(Docker Compose)私有更新发布连接失败问题
Mercure私有更新发布失败问题排查与解决
问题背景
按Symfony文档操作发布Mercure私有更新,配置及代码如下,但发布时出现连接错误,更换URL后仍无效,JWT也存在不一致问题。
代码片段
$update = new Update( 'https://example.com/books/1', json_encode(['status' => 'OutOfStock']), true ); $hub->publish($update);
Docker Compose配置
mercure: restart: unless-stopped image: dunglas/mercure environment: SERVER_NAME: :1337 MERCURE_EXTRA_DIRECTIVES: | anonymous 0 cors_origins https://localhost:8080 MERCURE_SUBSCRIBER_JWT_KEY: '!ChangeThisMercureHubJWTSecretKey!' MERCURE_PUBLISHER_JWT_KEY: '!ChangeThisMercureHubJWTSecretKey!' ports: - 1337:1337 volumes: - mercure_data:/data - mercure_config:/config
报错信息
"Couldn't connect to server for "http://mercure/.well-known/mercure"."
更换URL为http://localhost:1337/.well-known/mercure后仍无效,且生成的JWT与Cookie中不一致,手动使用正确JWT也未解决。
解决步骤
1. 修正Mercure Hub地址配置
http://mercure/.well-known/mercure是Docker内部服务名,本地环境需使用可外部访问的地址:
- 在项目
.env文件中设置:
确保MERCURE_URL=http://localhost:1337/.well-known/mercure MERCURE_PUBLISHER_JWT_SECRET=!ChangeThisMercureHubJWTSecretKey!MERCURE_PUBLISHER_JWT_SECRET与Docker配置中的MERCURE_PUBLISHER_JWT_KEY完全一致。
2. 验证Publisher JWT有效性
私有更新要求JWT包含对应topic的发布权限:
- 确保JWT的Payload包含目标topic的发布权限:
{ "publish": ["https://example.com/books/1"] } - 使用HS256算法签名,密钥必须与Docker配置的
MERCURE_PUBLISHER_JWT_KEY一致。 - 可通过Symfony命令快速测试发布,验证JWT是否有效:
php bin/console mercure:publish 'https://example.com/books/1' '{"status":"OutOfStock"}' --private
3. 解决HTTPS与HTTP混合内容问题
项目采用HTTPS而Mercure使用HTTP,浏览器会默认阻止混合内容:
- 本地开发:在浏览器地址栏点击"不安全"标识,手动允许加载不安全脚本;
- 生产环境:给Mercure配置HTTPS,可通过反向代理(如Nginx)或在Docker中挂载SSL证书实现。
4. 检查Mercure服务可用性
- 确认Mercure容器正常运行:
docker ps | grep mercure - 测试Hub地址可访问:
若返回curl http://localhost:1337/.well-known/mercure405 Method Not Allowed则说明服务正常(Mercure Hub仅接受POST/PUT请求)。
5. 核对CORS配置
确保Docker中的cors_origins与项目实际域名完全一致,若项目域名不是https://localhost:8080,需修改该配置项。
内容的提问来源于stack exchange,提问作者mlc
相关产品推荐
相关产品推荐

