Symfony多Mercure订阅线上部署后AJAX请求卡顿问题求助
排查Mercure订阅导致线上AJAX卡顿的实用方案
核心排查方向
本地正常、换Web服务器无改善,问题基本锁定在Mercure Hub的线上配置或网络层面,按以下步骤逐一排查:
1. 先查CORS配置
线上跨域限制比本地严格,Mercure默认规则可能未覆盖你的线上域名:
- 打开Mercure配置文件(
mercure.yaml或启动参数),确保CORS_ALLOWED_ORIGINS包含你的线上域名,比如https://your-app-domain.com,临时测试可设为*(生产环境禁用此设置) - 打开浏览器控制台的Network面板,检查Mercure的SSE请求是否存在CORS报错,或是长期处于pending状态
2. 确认Mercure的SSL/协议配置
本地使用http协议,线上若启用https,需确保Mercure的证书配置正确:
- 若Mercure与Web服务器在同一机器,可让Mercure监听本地http端口,由Nginx/Apache做SSL反向代理;若Mercure直接对外提供服务,启动时需指定
--cert和--key的文件路径 - 查看浏览器控制台,是否存在因证书问题拦截Mercure订阅请求的提示
3. 修复反向代理的长连接超时
Mercure依赖Server-Sent Events(SSE)维持长连接,线上反向代理的超时设置可能强制断开连接,导致反复重连挤占资源:
- Nginx的Mercure location块添加以下配置:
proxy_set_header Connection ''; proxy_http_version 1.1; chunked_transfer_encoding off; proxy_buffering off; proxy_cache off; proxy_read_timeout 86400s; - Apache需先启用
mod_proxy和mod_proxy_http模块,再添加:ProxyPass /mercure http://127.0.0.1:3000/mercure ProxyPassReverse /mercure http://127.0.0.1:3000/mercure ProxyTimeout 86400 RequestHeader set Connection "" - 查看Mercure日志(默认路径
/var/log/mercure/或启动时指定的路径),是否存在频繁的连接断开、重连记录
4. 检查连接数与主题负载
所有页面均订阅多个主题,线上用户量上升后,Mercure的连接数可能超出限制:
- 查看Mercure启动参数中的
MAX_CONNECTIONS(默认值1000),若不足可适当调高,比如设置--max-connections=5000 - 执行
mercure stats命令,查看当前连接数、广播量等指标,判断是否达到性能瓶颈
5. 验证Symfony端的Mercure配置
确保mercure.yaml中的hub.url指向线上有效地址,示例配置:
mercure: hubs: default: url: '%env(MERCURE_URL)%' jwt: '%env(MERCURE_JWT_SECRET)%'
- 检查环境变量
MERCURE_URL,避免使用本地地址http://localhost:3000/.well-known/mercure,需替换为线上可访问的地址,比如https://your-app-domain.com/.well-known/mercure
6. 逐个排查主题影响
临时修改代码,让页面仅订阅单个主题,观察AJAX请求是否恢复正常,逐步排查是否存在某个主题广播频率过高,挤占AJAX请求带宽的情况
快速验证小技巧
- 直接在浏览器访问Mercure端点(比如
https://your-app-domain.com/.well-known/mercure),确认是否返回200 OK及Mercure标识信息 - 用curl测试订阅功能:
随后在后台触发一条广播,查看curl是否能收到事件,判断Mercure Hub是否正常工作curl -N -H "Accept: text/event-stream" "https://your-app-domain.com/.well-known/mercure?topic=chat-messages"
内容的提问来源于stack exchange,提问作者Snoop9
相关产品推荐
相关产品推荐

