You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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/mercure
    
    若返回405 Method Not Allowed则说明服务正常(Mercure Hub仅接受POST/PUT请求)。

5. 核对CORS配置

确保Docker中的cors_origins与项目实际域名完全一致,若项目域名不是https://localhost:8080,需修改该配置项。

内容的提问来源于stack exchange,提问作者mlc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 13:07:27