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

升级DDEV至v1.23.5后所有流量均被路由至web容器

问题:DDEV升级至v1.23.5后多服务路由异常,所有流量均指向web容器

背景

将DDEV从v1.21.0升级到v1.23.5后,原本通过ddev-router按FQDN路由到各自定义容器指定端口的配置失效,所有请求都被转发到默认web容器(kla-api)。项目未使用默认web容器,而是通过多个自定义服务承载不同业务。

关键配置文件

config.yaml

name: kla-api
type: php
docroot: public
php_version: "7.4"
webserver_type: apache-fpm
xdebug_enabled: true
additional_hostnames: []
additional_fqdns:
    - kla-backend.ddev.site
    - kla-frontend.ddev.site
    - kla-mail-service.ddev.site
    - kla-file-service.ddev.site
    - kla-preview-service.ddev.site
    - kla-configuration-service.ddev.site
    - kla-api.ddev.site
    - dba
database:
    type: mariadb
    version: "10.4"
use_dns_when_possible: true
composer_version: "2"
web_environment: []
nodejs_version: "16"
corepack_enable: false

docker-compose.api-service.yaml(自定义服务示例)

services:
  kla-api.ddev.site:
    container_name: "kla-api"
    labels:
      com.ddev.site-name: ${DDEV_SITENAME}
      com.ddev.approot: ${DDEV_APPROOT}
      com.ddev.app-type: php
    build:
      args:
        BASE_IMAGE: ddev/ddev-webserver:v1.23.5
        DDEV_PHP_VERSION: "7.4"
        gid: "20"
        uid: "1025"
        username: fwtag
      context: [xxx]/kla-api/.ddev/.webimageBuild
      dockerfile: Dockerfile
    external_links:
      - ddev-router:kla-api.ddev.site
    cap_add:
      - SYS_PTRACE
    healthcheck:
      interval: 1s
      retries: 120
      start_period: 2m0s
      timeout: 2m0s
    networks:
      ddev_default: null
      default: null
    expose:
      - 8040
      - 8041
    environment:
      PHP_IDE_CONFIG: serverName=kla-api.ddev.site
      VIRTUAL_HOST: kla-api.ddev.site
      DDEV_PRIMARY_URL: https://kla-api.ddev.site
      HTTP_EXPOSE: 80:80,8040:8040
      HTTPS_EXPOSE: 443:80,8041:8040
      DDEV_WEBSERVER_TYPE: apache-fpm
      DDEV_XDEBUG_ENABLED: "true"
      DDEV_DOCROOT: public
      DOCROOT: public
      DDEV_PHP_VERSION: "7.4"
      SSH_AUTH_SOCK: /home/.ssh-agent/socket
      USER: fwtag
    links:
      - db:db
    restart: "no"
    user: "1025:20"
    volumes:
      - bind:
          create_host_path: true
        read_only: true
        source: [xxx]/kla-api/.ddev
        target: /mnt/ddev_config
        type: bind
      - source: [xxx]/kla-api
        target: /var/www/html
        type: bind
      - source: ddev-global-cache
        target: /mnt/ddev-global-cache
        type: volume
        volume: { }
      - source: ddev-ssh-agent_socket_dir
        target: /home/.ssh-agent
        type: volume
        volume: { }
    working_dir: /var/www/html

docker-compose.preview-service.yaml(部分配置)

...
    expose:
      - 8052
      - 8053
...
    environment:
      HTTP_EXPOSE: 80:80,8052:8052
      HTTPS_EXPOSE: 443:80,8053:8052
...

补充排查信息

查看Traefik配置文件/traefik/config/kla-api.yaml,发现web容器的路由规则包含了所有自定义服务的FQDN:

...
  routers:
    kla-api-kla-preview-service-80-http:
      entrypoints:
        - http-80
      rule: HostRegexp(`^kla-preview-service\.ddev\.site$`)
      
      service: "kla-api-kla-preview-service-80"
      ruleSyntax: v3
      tls: false
      # middlewares:
      #   - "kla-api-redirectHttps"
    kla-api-kla-preview-service-8052-http:
      entrypoints:
        - http-8052
      rule: HostRegexp(`^kla-preview-service\.ddev\.site$`)
      
      service: "kla-api-kla-preview-service-8052"
      ruleSyntax: v3
      tls: false
      # middlewares:
      #   - "kla-api-redirectHttps"
...
    kla-api-web-80-http:
      entrypoints:
        - http-80
      rule: HostRegexp(`^kla-api\.ddev\.site$`)|| HostRegexp(`^dba$`)|| HostRegexp(`^kla-backend\.ddev\.site$`)|| HostRegexp(`^kla-configuration-service\.ddev\.site$`)|| HostRegexp(`^kla-file-service\.ddev\.site$`)|| HostRegexp(`^kla-frontend\.ddev\.site$`)|| HostRegexp(`^kla-mail-service\.ddev\.site$`)|| HostRegexp(`^kla-preview-service\.ddev\.site$`)
      
      service: "kla-api-web-80"
      ruleSyntax: v3
      tls: false
      # middlewares:
      #   - "kla-api-redirectHttps"
...
  services:
    kla-api-kla-preview-service-80:
      loadbalancer:
        servers:
          - url: http://ddev-kla-api-kla-preview-service:80
        
    kla-api-kla-preview-service-8052:
      loadbalancer:
        servers:
          - url: http://ddev-kla-api-kla-preview-service:8052
...

问题分析

  1. DDEV路由逻辑变更:v1.22+版本中,DDEV会自动将config.yaml里additional_fqdns的所有域名添加到默认web容器的Traefik路由规则中,导致这些域名的请求优先被web容器接管,覆盖了自定义服务的路由规则。
  2. 路由优先级冲突:Traefik会优先匹配更具体的规则,但这里web容器的规则包含了所有自定义域名,且和自定义服务的规则处于同一入口点,导致请求被web容器拦截。

解决步骤

  1. 调整config.yaml的additional_fqdns:
    移除所有属于自定义服务的FQDN,只保留主域名和dba,示例:

    additional_fqdns:
        - kla-api.ddev.site
        - dba
    

    自定义服务的FQDN不需要在全局配置中声明,由各自的docker-compose配置单独管理。

  2. 确保自定义服务的路由标识正确:
    每个自定义服务的docker-compose配置中,添加com.ddev.url标签指定自身的FQDN,同时确保VIRTUAL_HOST仅设置自身域名,示例:

    labels:
      com.ddev.site-name: ${DDEV_SITENAME}
      com.ddev.approot: ${DDEV_APPROOT}
      com.ddev.app-type: php
      com.ddev.url: kla-preview-service.ddev.site
    environment:
      VIRTUAL_HOST: kla-preview-service.ddev.site
    
  3. 清理Traefik缓存配置:
    执行以下操作重置Traefik配置:

    ddev poweroff
    rm -rf ~/.ddev/traefik
    ddev start
    
  4. 验证路由规则:
    启动后重新检查Traefik配置文件,确认web容器的路由规则不再包含自定义服务的FQDN,各自定义服务的路由规则独立存在。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 01:48:11