Symfony7生产环境Docker部署Mercure发送更新失败返回404求助
解决AWS EC2生产环境Mercure发布失败的问题
1. 修正Mercure地址配置(.env文件)
生产环境无域名、无SSL,仅通过EC2公网IP访问,因此需替换默认的https://example.com为实际HTTP地址:
###> symfony/mercure-bundle ### MERCURE_URL=http://<你的EC2公网IP>:8001/.well-known/mercure MERCURE_PUBLIC_URL=http://<你的EC2公网IP>:8001/.well-known/mercure MERCURE_JWT_SECRET="!ChangeThisMercureHubJWTSecretKey!" ###< symfony/mercure-bundle ###
提示:
<你的EC2公网IP>替换为服务器实际公网IP,端口8001可根据需求调整,需避免与Apache的80端口冲突。
2. 调整Docker Compose配置
修改compose.override.yaml,明确映射Mercure容器端口到宿主机:
version: '3' services: ###> symfony/mercure-bundle ### mercure: ports: - "8001:80" ###< symfony/mercure-bundle ###
更新docker-compose.yaml,适配生产环境的CORS和Caddy配置:
services: ###> symfony/mercure-bundle ### mercure: image: dunglas/mercure restart: unless-stopped environment: SERVER_NAME: ':80' MERCURE_PUBLISHER_JWT_KEY: '!ChangeThisMercureHubJWTSecretKey!' MERCURE_SUBSCRIBER_JWT_KEY: '!ChangeThisMercureHubJWTSecretKey!' MERCURE_EXTRA_DIRECTIVES: | cors_origins http://<你的EC2公网IP> auto_https off # 使用生产环境Caddy配置,禁用开发模式 command: /usr/bin/caddy run --config /etc/caddy/Caddyfile volumes: - mercure_data:/data - mercure_config:/config ###< symfony/mercure-bundle ### volumes: ###> symfony/mercure-bundle ### mercure_data: mercure_config: ###< symfony/mercure-bundle ###
3. 配置Apache反向代理
修改/etc/apache2/sites-available/taxis-chrono.conf,添加反向代理规则转发Mercure请求:
<VirtualHost *:80> ServerName localhost # 启用代理模块(未启用则先执行a2enmod proxy proxy_http) ProxyPass "/.well-known/mercure" "http://127.0.0.1:8001/.well-known/mercure" ProxyPassReverse "/.well-known/mercure" "http://127.0.0.1:8001/.well-known/mercure" # 启用PHP-FPM(根据实际配置调整,此处为TCP示例) <FilesMatch \.php$> SetHandler proxy:fcgi://127.0.0.1:9000 </FilesMatch> DocumentRoot /var/www/taxis-chrono/public <Directory /var/www/taxis-chrono/public> AllowOverride None Require all granted FallbackResource /index.php </Directory> ErrorLog /var/log/apache2/taxis-chrono_error.log CustomLog /var/log/apache2/taxis-chrono_access.log combined </VirtualHost>
若未启用Apache代理模块,先执行以下命令:
sudo a2enmod proxy proxy_http sudo systemctl restart apache2
4. 重启服务并验证
- 重启Mercure容器:
docker-compose down docker-compose up -d
- 重启Apache服务:
sudo systemctl restart apache2
- 验证Mercure Hub可用性:
curl http://<你的EC2公网IP>/.well-known/mercure
返回Mercure Hub相关响应则表示配置生效。
排查要点
- 确认EC2安全组开放80端口和Mercure映射的8001端口入站规则
- 查看Mercure容器日志排查启动错误:
docker-compose logs mercure - 确保
.env与docker-compose.yaml中的JWT密钥完全一致
内容的提问来源于stack exchange,提问作者Louis Bingana
相关产品推荐
相关产品推荐

