升级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 ...
问题分析
- DDEV路由逻辑变更:v1.22+版本中,DDEV会自动将
config.yaml里additional_fqdns的所有域名添加到默认web容器的Traefik路由规则中,导致这些域名的请求优先被web容器接管,覆盖了自定义服务的路由规则。 - 路由优先级冲突:Traefik会优先匹配更具体的规则,但这里web容器的规则包含了所有自定义域名,且和自定义服务的规则处于同一入口点,导致请求被web容器拦截。
解决步骤
调整
config.yaml的additional_fqdns:
移除所有属于自定义服务的FQDN,只保留主域名和dba,示例:additional_fqdns: - kla-api.ddev.site - dba自定义服务的FQDN不需要在全局配置中声明,由各自的docker-compose配置单独管理。
确保自定义服务的路由标识正确:
每个自定义服务的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清理Traefik缓存配置:
执行以下操作重置Traefik配置:ddev poweroff rm -rf ~/.ddev/traefik ddev start验证路由规则:
启动后重新检查Traefik配置文件,确认web容器的路由规则不再包含自定义服务的FQDN,各自定义服务的路由规则独立存在。
内容的提问来源于stack exchange,提问作者fwtag
相关产品推荐
相关产品推荐

