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

本地Docker Compose配置Traefik+Varnish对接Magento 2遇503问题求助

解决方案:Traefik + Varnish + Magento 2 Docker Compose 集成配置

核心问题分析

当前问题的根源有两点:

  1. 流量未经过Varnish:访问magento.dev.local时直接走Traefik到Magento容器,Varnish未参与缓存
  2. Varnish与Magento的Host头不匹配:Varnish转发请求时的Host是magento.front.dev.local,但Magento的Nginx仅配置了magento.dev.local的server块,同时Varnish的后端探测请求未携带正确Host,导致探测失败返回503

步骤1:调整流量路由,让所有请求先经过Varnish

移除Magento容器的Traefik直接暴露配置,让Varnish作为流量入口统一处理两个域名:

修改Magento容器的Docker Compose配置

删除Magento容器下的所有Traefik标签,不需要Traefik直接连接Magento:

# 移除以下内容
# labels:
#   - "traefik.enable=true"
#   - traefik.http.routers.magento-http.rule=Host(`${MAGENTO_DOMAIN:-magento.dev.local}`)
#   - traefik.http.routers.magento-http.entrypoints=http
#   - traefik.http.routers.magento-http.middlewares=https-redirect
#   - traefik.http.routers.magento-https.rule=Host(`${MAGENTO_DOMAIN:-magento.dev.local}`)
#   - traefik.http.routers.magento-https.entrypoints=https
#   - "traefik.http.routers.nginx.tls=true"
#   - traefik.http.services.magento.loadbalancer.server.port=8080

更新Varnish容器的Traefik标签

让Varnish同时处理两个域名的流量:

labels:
  - traefik.enable=true
  # 匹配两个域名
  - traefik.http.routers.varnish-http.rule=Host(`${MAGENTO_DOMAIN:-magento.dev.local}`) || Host(`${VARNISH_DOMAIN:-magento.front.dev.local}`)
  - traefik.http.routers.varnish-http.entrypoints=http
  - traefik.http.routers.varnish-http.middlewares=https-redirect
  - traefik.http.routers.varnish-https.rule=Host(`${MAGENTO_DOMAIN:-magento.dev.local}`) || Host(`${VARNISH_DOMAIN:-magento.front.dev.local}`)
  - traefik.http.routers.varnish-https.entrypoints=https
  - traefik.http.routers.varnish-https.tls=true
  - traefik.http.routers.varnish-https.tls.certresolver=le
  - traefik.http.services.varnish.loadbalancer.server.port=80

步骤2:修正Varnish VCL配置,确保后端探测与请求转发正常

更新VCL配置,给后端探测请求添加正确的Host头,同时确保转发请求时的Host被Magento Nginx识别:

backend default {
    .host = "magento";
    .port = "8080";
    .first_byte_timeout = 600s;
    .probe = {
        # 探测请求携带Magento认可的Host头
        .request = "GET /health_check.php HTTP/1.1"
                    "Host: ${MAGENTO_DOMAIN:-magento.dev.local}"
                    "Connection: close";
        .timeout = 2s;
        .interval = 5s;
        .window = 10;
        .threshold = 5;
   }
}

acl purge {
    "magento";
}

sub vcl_recv {
    # 保留原始Host头转发给后端,或强制设置为Magento认可的Host(二选一)
    # 选项1:保留原始Host
    set req.backend_hint = default;
    # 选项2:强制统一为Magento的域名(适合不需要区分域名的场景)
    # set req.http.Host = "${MAGENTO_DOMAIN:-magento.dev.local}";
}

步骤3:更新Magento的Nginx配置,支持多域名

修改Magento容器内的Nginx server块,让其同时接受两个域名:

server {
    listen 8080;
    # 包含两个域名
    server_name magento.dev.local magento.front.dev.local;
    # 其他原有配置(根目录、fastcgi配置等)...
}

步骤4:验证网络连通性

确保Varnish容器能正常解析并访问Magento容器:

# 替换为你的Varnish容器名称
docker exec -it varnish_container_name ping magento

如果无法ping通,检查Docker Compose的网络配置,确保所有服务都加入同一个自定义网络。


步骤5:重启容器测试

修改完成后重启所有容器:

docker-compose down && docker-compose up -d

访问两个域名验证:

  • magento.dev.local:页面正常加载,且能看到X-Magento-Cache-Debug头,说明Varnish已生效
  • magento.front.dev.local:不再返回503错误,正常加载页面并被Varnish缓存

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 01:04:53