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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:09:30