OVH服务器Symfony4.4部署Mercure生产环境端口与证书问题
解决方案
1. 排查端口占用进程
先确定80/443端口被哪个服务占用,执行命令:
ss -tulpn | grep -E ":80|:443"
输出会显示占用端口的进程(如Nginx、Apache),这是后续处理的基础。
2. 方案一:保留现有Web服务器(推荐,适合已有站点运行的场景)
如果80/443被Nginx/Apache等Web服务器占用,通过反向代理让Mercure(Caddy)在后台运行,同时复用已有Let's Encrypt证书。
2.1 修改Caddyfile配置
禁用Caddy自动HTTPS,指定监听3000端口并手动加载已有证书:
{ auto_https off } :3000 { # 替换为你的Let's Encrypt证书路径,OVH服务器通常在/etc/letsencrypt/live/monsite.fr/下 tls /etc/letsencrypt/live/monsite.fr/fullchain.pem /etc/letsencrypt/live/monsite.fr/privkey.pem log route { redir / /.well-known/mercure/ui/ encode zstd gzip mercure { transport_url {$MERCURE_TRANSPORT_URL:bolt://mercure.db} publisher_jwt {env.MERCURE_PUBLISHER_JWT_KEY} {env.MERCURE_PUBLISHER_JWT_ALG} subscriber_jwt {env.MERCURE_SUBSCRIBER_JWT_KEY} {env.MERCURE_SUBSCRIBER_JWT_ALG} cors_origins * publish_origins * subscriptions {$MERCURE_EXTRA_DIRECTIVES} # 生产环境建议关闭demo和anonymous选项,避免安全风险 # demo # anonymous } respond /healthz 200 respond "Not Found" 404 } }
2.2 配置现有Web服务器反向代理
以Nginx为例,在你的站点配置文件中添加以下规则,将Mercure相关请求转发到Caddy的3000端口:
location /.well-known/mercure { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 支持WebSocket连接(Mercure依赖) proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; }
修改后重启Nginx:
systemctl restart nginx
2.3 重启Caddy服务
确保Caddy以新配置启动,监听3000端口:
systemctl restart caddy
3. 方案二:停止占用端口的服务,让Caddy直接监听80/443
如果服务器上没有其他需要运行的Web服务,可以停止占用端口的进程,让Caddy直接接管80/443并使用已有证书。
3.1 停止占用端口的服务
比如停止Nginx:
systemctl stop nginx systemctl disable nginx
如果是Apache:
systemctl stop apache2 systemctl disable apache2
3.2 修改Caddyfile配置
指定域名并加载已有证书,让Caddy监听443端口:
{$SERVER_NAME:monsite.fr} # 替换为你的Let's Encrypt证书路径 tls /etc/letsencrypt/live/monsite.fr/fullchain.pem /etc/letsencrypt/live/monsite.fr/privkey.pem log route { redir / /.well-known/mercure/ui/ encode zstd gzip mercure { transport_url {$MERCURE_TRANSPORT_URL:bolt://mercure.db} publisher_jwt {env.MERCURE_PUBLISHER_JWT_KEY} {env.MERCURE_PUBLISHER_JWT_ALG} subscriber_jwt {env.MERCURE_SUBSCRIBER_JWT_KEY} {env.MERCURE_SUBSCRIBER_JWT_ALG} cors_origins * publish_origins * subscriptions {$MERCURE_EXTRA_DIRECTIVES} # 生产环境建议关闭demo和anonymous选项 # demo # anonymous } respond /healthz 200 respond "Not Found" 404 }
3.3 重启Caddy服务
systemctl restart caddy
关键说明
- 证书获取失败的核心原因:ACME域名验证(HTTP-01/TLS-ALPN-01)需要占用80/443端口,当这两个端口被其他服务占用时,Caddy无法完成验证流程。手动指定已有证书可以绕过自动获取逻辑。
- 生产环境务必关闭
demo和anonymous选项,避免未授权的访问和测试界面暴露。
内容的提问来源于stack exchange,提问作者Benjamin de Monchy
相关产品推荐
相关产品推荐

