当前位置: 首页 > news >正文

Docker+DDEV搭建Drupal 9本地开发环境实战指南

1. 为什么本地用 Docker + DDEV 搭建 Drupal 9 站点,是当前最稳的开发起点

你是不是也经历过:装完 PHP 7.4、MySQL 8.0、Apache,配好 mod_rewrite,再手动下载 Drupal 9 核心、解压、改权限、建数据库、跑 install.php……结果浏览器一刷,报错“PHP extension gd is missing”?回头装 GD,又发现php-gd包名在 Ubuntu 是php-gd,CentOS 是php-gd,macOS Homebrew 是php@8.1-gd——光扩展依赖就能卡你两小时。更别说团队协作时,同事的环境是 PHP 8.0 + MariaDB 10.5,你的却是 PHP 8.2 + MySQL 8.0,一个json_encode()的返回类型差异就让模块报错,排查三天才发现是 PHP 版本小版本不一致。

这就是纯手工搭环境的硬伤:环境不可复现、依赖难收敛、协作成本高、升级风险大。而 Docker + DDEV 的组合,本质上不是“多装了个工具”,而是把整个开发环境从“物理机配置”升级为“可版本化、可 Git 提交、可一键重建”的声明式基础设施。DDEV 不是 Docker 的简单封装,它是专为 PHP Web 开发(尤其是 Drupal、WordPress、TYPO3 这类 CMS)打磨了近十年的“环境编排层”——它自动处理 Nginx 配置、PHP-FPM 调优、MySQL 字符集、Drush/Drupal Console 命令注入、HTTPS 本地证书生成、甚至 Xdebug 的端口映射和 IDE 断点联动。我去年带一个 6 人 Drupal 团队重构政府门户,新成员入职后,从 clone 代码库到打开/user/login页面,全程只用了 11 分钟:git cloneddev configddev startddev drush si standard -y。没有文档里写的“请确保已安装 Composer”,没有“请检查 MySQL 是否运行”,没有“请确认 Apache 虚拟主机已启用”。因为 DDEV 启动那一刻,它拉起的是一整套经过 Drupal 社区验证的容器栈:nginx:1.23 + php:8.1-apache + mariadb:10.6 + phpmyadmin:5 + mailhog:1.0 —— 所有服务版本、配置参数、网络互通、卷挂载路径,全部预设完毕。你真正要关心的,只有 Drupal 本身的模块逻辑、主题模板和内容结构。这才是现代 PHP 开发该有的样子:开发者专注业务,环境交给工具

2. 整体架构设计与核心组件选型逻辑

2.1 为什么不是纯 Docker Compose?DDEV 的不可替代性在哪?

看到标题里有 Docker,很多人第一反应是:“我自己写个 docker-compose.yml 不就行了?”确实可以,但实际踩坑后你会发现,纯 Compose 方案在 Drupal 场景下会迅速陷入“配置黑洞”。举几个真实场景:

  • PHP 扩展动态加载问题:Drupal 9.5+ 强制要求mbstringxmlzipgdopcache等 12+ 个扩展。纯 Compose 里你得自己维护一个Dockerfile,每次 PHP 升级都要重写apt-get installdocker-php-ext-*命令。而 DDEV 内置的php_version配置项(如php_version: "8.1")背后,是它预编译好的、经 Drupal.org CI 测试通过的 PHP 镜像仓库。你改一行配置,它自动切换整个 PHP 运行时,连php.iniopcache.enable=1memory_limit=512M这些 Drupal 推荐值都已调优。

  • 文件权限地狱:Drupal 的sites/default/files目录必须由 web 服务器用户(www-data)可写,但宿主机上你的用户是ubuntumacuser。纯 Compose 里你要么chown -R www-data:www-data sites/default/files(导致宿主机无法编辑),要么用user: "${UID}:${GID}"(在 Windows 上根本无效)。DDEV 的解决方案是:在容器内创建与宿主机 UID/GID 完全一致的用户,并映射到 www-data 组。它启动时自动执行usermod -u ${UID} -g ${GID} www-data,再chown -R www-data:www-data /var/www/html。这意味着你在 VS Code 里右键新建一个.txt文件,容器内ls -l看到的 owner 就是www-data,Drupal 表单上传图片时move_uploaded_file()一次成功。

  • 命令行工具链集成drushddev drushddev composerddev mysql这些命令,表面看只是加了个ddev前缀,实则背后是 DDEV 的“命令代理”机制。当你执行ddev drush cr,DDEV 并非简单地docker exec -it web drush cr,而是:

    1. 检查当前目录是否为 DDEV 项目(读取.ddev/config.yaml);
    2. 确认web容器已运行且健康;
    3. 将宿主机的$HOME/.composer/auth.json$HOME/.drush配置卷挂载进容器;
    4. 在容器内以www-data用户身份执行drush cr,并实时将 stdout/stderr 流回宿主机终端;
    5. 如果命令失败,自动捕获 exit code 并输出上下文日志(如ddev logs -s web)。

这种深度集成,是纯 Compose 无法提供的开箱即用体验。DDEV 的定位很清晰:它不是 Docker 的竞争对手,而是 Drupal 开发者的“环境操作系统”。

2.2 Docker 引擎与 DDEV 的协同关系:谁在管什么?

很多新手混淆 Docker Engine 和 DDEV 的职责边界。这里用一个生活化类比说明:Docker Engine 是“建筑工地的起重机和混凝土搅拌机”,DDEV 是“持有全套施工图纸、调度所有工种、验收每道工序的项目经理”

  • Docker Engine(含 dockerd、containerd、runc):负责最底层的容器生命周期管理。它监听/var/run/docker.sock,接收docker rundocker build等 API 请求,调用 Linux kernel 的 cgroups/ns 创建隔离进程,管理镜像层存储(overlay2)、网络(bridge/host/macvlan)和卷(bind mount/volume)。你不需要直接操作它,DDEV 全部封装好了。

  • DDEV CLI(ddev binary):这是你每天打交道的命令行工具。它本质是一个 Go 编写的“Docker 操作胶水层”。当你输入ddev start,它做的第一件事是调用docker info确认引擎可用;第二步是读取.ddev/config.yaml解析项目类型(type: drupal9);第三步是根据php_versionwebserver_type(nginx/apache)等参数,拼接出最终的docker-compose.yaml(存于.ddev/.ddev-docker-compose-full.yaml);第四步才是执行docker-compose -f .ddev/.ddev-docker-compose-full.yaml up -d。这个过程完全透明,你只需关注ddev start的结果。

  • DDEV 的容器栈(Web/DB/DBA/MAILHOG):这是真正运行 Drupal 的“工人”。其中web容器(基于ddev/web-apache-php:20230915_v1.22.4)预装了 Drupal 9 全套依赖:PHP 8.1、Apache 2.4、GD/ImageMagick、Xdebug 3.2、Drush 11、Drupal Console、Composer 2.5。db容器(ddev/db-mariadb-10.6:20230915_v1.22.4)默认启用innodb_file_per_table=1character_set_server=utf8mb4,完美匹配 Drupal 9 的数据库要求。这些镜像不是随便 pull 的,而是 DDEV 团队每日构建、通过 Drupal.org 的simpletest套件验证的“黄金镜像”。

所以,你的工作流应该是:信任 DDEV 的默认配置 → 仅在必要时微调.ddev/config.yaml→ 用ddev命令而非docker命令操作环境。试图绕过 DDEV 直接docker exec进容器改配置,就像绕过项目经理直接指挥塔吊司机——短期内可能快,长期必然混乱。

2.3 Drupal 9 专属适配点:为什么 DDEV 对 Drupal 的支持远超其他 CMS?

DDEV 的 GitHub 仓库里有个鲜为人知但极其关键的文件:pkg/ddevapp/drupal.go。这个 Go 文件定义了 DDEV 如何“理解”Drupal 项目。它不是简单地检测index.php存在,而是进行三级智能识别:

  1. 文件系统指纹识别:扫描根目录是否存在core/modules/(Drupal 8/9 核心模块目录)、sites/default/settings.php(Drupal 配置文件)、vendor/drupal/core(Composer 安装模式)。如果三者都存在,直接判定为 Drupal 9 项目。

  2. Composer 依赖解析:读取composer.json,检查"require": {"drupal/core": "^9.5"}这类语义化版本约束。如果发现drupal/core版本号以^9.开头,自动启用 Drupal 9 专用配置:比如settings.php中自动注入if (getenv('DDEV_PHP_VERSION')) { $settings['hash_salt'] = 'ddev-generated-salt'; },避免因 salt 变更导致 session 失效。

  3. 运行时行为注入:当ddev start启动后,DDEV 会向web容器的 Apache 配置中动态追加 Drupal 9 必需的RewriteRule

    # Drupal 9 clean URLs 支持 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !=/favicon.ico RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

    同时,它会修改php.ini,将upload_max_filesizepost_max_size从默认的 2M 提升至 100M,满足 Drupal 9 Media 模块上传高清视频的需求。

这种深度耦合,意味着你无需手动配置.htaccess、无需修改php.ini、无需担心settings.php权限——DDEV 已为你铺平所有 Drupal 9 的“环境路障”。相比之下,WordPress 项目虽然也能用 DDEV,但它的适配逻辑(pkg/ddevapp/wordpress.go)主要聚焦于wp-config.php解析和wp-cli注入,对 URL 重写、PHP 扩展的要求远不如 Drupal 9 严苛。这正是 DDEV 成为 Drupal 开发者事实标准的原因:它不是通用工具,而是为 Drupal 而生的环境平台

3. 本地环境搭建全流程详解(Ubuntu 22.04 / macOS Ventura / Windows 11 WSL2)

3.1 基础环境准备:Docker 引擎安装的避坑指南

Docker 引擎是 DDEV 的基石,但安装过程极易踩坑。根据你提供的热搜词,“virtualization support not detected docker desktop failed to start because v”、“docker desktop requires windows 10 pro/enterprise/home 22h2” 这些报错,本质都是虚拟化层未正确启用。我们分平台给出经过千次实测的方案:

  • Ubuntu 22.04(推荐首选)
    # 1. 卸载旧版(如有) sudo apt remove docker docker-engine docker.io containerd runc # 2. 安装依赖 sudo apt update && sudo apt install -y \ ca-certificates \ curl \ gnupg \ lsb-release # 3. 添加 Docker 官方 GPG 密钥(关键!国内用户务必用阿里云镜像源) sudo mkdir -p /etc/apt/keyrings curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 4. 添加阿里云 Docker 仓库(解决“docker镜像源”慢的问题) echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 5. 安装 Docker Engine(注意:不要装 docker.io,那是 Ubuntu 自带的旧版) sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # 6. 验证(必须看到 "Hello from Docker!") sudo docker run hello-world # 7. 将当前用户加入 docker 组(避免每次 sudo) sudo usermod -aG docker $USER newgrp docker # 立即生效,无需重启

提示:如果你看到Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?,大概率是dockerd服务没启动。执行sudo systemctl start docker && sudo systemctl enable docker即可。

  • macOS Ventura(Apple Silicon M1/M2 芯片)

    • 绝对不要用 Docker Desktop:其 Rosetta 2 兼容层在 M 系列芯片上对 PHP 扩展(尤其是gdimagick)支持极差,ddev startphp -m | grep gd常为空。
    • 正确姿势:用 Colima(轻量级容器运行时)
      # 1. 安装 Homebrew(如未安装) /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" # 2. 安装 Colima(替代 Docker Desktop) brew install colima colima start --cpu 4 --memory 8 --disk 60 # 分配足够资源给 Drupal # 3. 验证(Colima 兼容 Docker CLI) docker ps # 应显示空列表,证明连接正常
  • Windows 11(WSL2 模式,非 Docker Desktop)

    • 禁用 Windows 版 Docker Desktop:它与 WSL2 的dockerd冲突,且“virtualization support not detected”错误频发。
    • 启用 WSL2 并安装 Ubuntu 22.04
      # PowerShell(管理员运行) dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart wsl --install wsl --set-default-version 2 wsl --list --online # 查看可用发行版 wsl --install -d Ubuntu-22.04
    • 在 WSL2 Ubuntu 中按上述 Ubuntu 步骤安装 Docker Engine。此时 Docker 运行在 Linux 内核上,性能接近原生,且无虚拟化检测问题。

注意:所有平台安装后,务必执行docker info | grep "Kernel Version",确认输出为Kernel Version: 5.15.0-xx-generic(Ubuntu)、Kernel Version: 5.15.49-microsoft-standard-WSL2(Windows WSL2)或Kernel Version: 21.6.0(macOS Colima)。如果看到Kernel Version: 4.19.x(旧版 WSL1)或Kernel Version: 5.10.x(Docker Desktop 内置 VM),说明安装路径错误,需重来。

3.2 DDEV 安装与初始化:三步完成 Drupal 9 环境

DDEV 的安装极简,但初始化步骤决定后续开发体验。以下是精确到字符的操作流程:

# 1. 下载 DDEV CLI(Linux/macOS) curl -O https://github.com/drud/ddev/releases/download/v1.22.4/ddev_linux_amd64.v1.22.4.tar.gz tar -xf ddev_linux_amd64.v1.22.4.tar.gz sudo mv ddev /usr/local/bin/ # macOS Apple Silicon(M1/M2)用此命令 curl -O https://github.com/drud/ddev/releases/download/v1.22.4/ddev_darwin_arm64.v1.22.4.tar.gz tar -xf ddev_darwin_arm64.v1.22.4.tar.gz sudo mv ddev /usr/local/bin/ # Windows(PowerShell) choco install ddev # 或手动下载 https://github.com/drud/ddev/releases/download/v1.22.4/ddev_windows_amd64.v1.22.4.zip # 2. 验证安装 ddev version # 应输出 v1.22.4 # 3. 创建 Drupal 9 项目目录(关键:必须用 Composer 创建) mkdir my-drupal9-site && cd my-drupal9-site # 4. 使用 Drupal 官方推荐方式创建项目(非 git clone core!) composer create-project drupal/recommended-project:9.5.12 . # 5. 初始化 DDEV 项目(全自动识别 Drupal 9) ddev config --project-type=drupal9 --docroot=web --php-version=8.1 # 6. 启动环境(DDEV 自动拉取镜像、创建容器、配置网络) ddev start # 7. 安装 Drupal(DDEV 自动注入数据库连接信息) ddev drush site:install standard --account-pass=admin -y

实操心得:ddev config命令中的--docroot=web是 Drupal 9 推荐安装模式(recommended-project)的关键。它将 web root 设为web/目录,而非传统docroot/,这样vendor/composer.json等敏感文件被置于 web root 之外,符合安全最佳实践。如果你跳过这步直接ddev start,DDEV 会尝试自动探测 docroot,但成功率仅 70%,常误判为docroot/,导致 Drupal 安装失败。

3.3 Drupal 9 核心配置与调试:Xdebug、Drush、数据库的实操细节

环境启动后,真正的开发才开始。以下是 Drupal 9 开发者最常操作的三大场景详解:

3.3.1 Xdebug 3.2 远程调试:VS Code 断点实战

DDEV 默认启用 Xdebug 3.2,但需正确配置才能在 VS Code 中打断点。步骤如下:

  1. 在 VS Code 中安装 PHP Debug 插件(Felix Becker 开发,安装量超 600 万)。

  2. 创建.vscode/launch.json

    { "version": "0.2.0", "configurations": [ { "name": "Listen for Xdebug", "type": "php", "request": "launch", "port": 9003, "pathMappings": { "/var/www/html": "${workspaceFolder}" }, "hostname": "localhost" } ] }
  3. 在 Drupal 9 代码中设置断点:打开web/modules/custom/my_module/src/Controller/MyController.php,在public function content()第一行加断点。

  4. 触发调试:在浏览器访问http://my-drupal9-site.ddev.site/node/1,VS Code 自动停在断点处。

关键原理:DDEV 的web容器中,php.ini已配置xdebug.mode=debugxdebug.client_host=host.docker.internal(自动解析为宿主机 IP)、xdebug.client_port=9003。VS Code 的pathMappings将容器内/var/www/html映射到你本地的项目目录,实现源码同步。实测下来,从点击链接到 VS Code 停止,延迟 < 300ms,远超传统 Xdebug 配置。

3.3.2 Drush 11 命令行操作:比 Drupal UI 更高效的开发方式

DDEV 将 Drush 深度集成,所有ddev drush命令都在容器内以www-data用户执行,避免权限问题:

# 清除所有缓存(比后台清缓存快 10 倍) ddev drush cr # 重新导入配置(sync 配置到 active) ddev drush cim -y # 创建内容(快速填充测试数据) ddev drush generate:node --title="Test Article" --type=article --count=5 # 查看模块状态(比 admin/modules 页面更直观) ddev drush pm:list --status=enabled --type=module # 进入 Drupal 交互式 Shell(调试变量神器) ddev drush php >>> \Drupal::service('entity_type.manager')->getStorage('node')->load(1); => Drupal\node\Entity\Node {#1121 …}

注意事项:ddev drush默认使用 Drupal 9 的drush.phar(位于/var/www/html/vendor/bin/drush),它已绑定drupal/core的具体版本。如果你执行ddev composer require drush/drush:^12升级 Drush,DDEV 会自动检测并切换到新版本,无需手动干预。

3.3.3 数据库操作:phpMyAdmin 与命令行双通道

DDEV 自动部署 phpMyAdmin,地址为http://my-drupal9-site.ddev.site:8036(注意是 8036 端口,非 80)。但更高效的是命令行:

# 直接进入 MySQL 容器(密码为 `db`,数据库名为 `db`) ddev mysql # 导出当前数据库(生成 SQL 文件供 Git 提交) ddev export-db --file=database.sql # 导入生产数据库(替换本地数据) ddev import-db --src=production.sql # 查看 Drupal 9 的关键表结构(验证 utf8mb4 支持) ddev mysql -e "SHOW CREATE TABLE node;" # 输出应包含 ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

实操技巧:Drupal 9 的nodetitle字段长度为varchar(255),但若数据库字符集不是utf8mb4,一个 emoji(如 ❤️)会占用 4 字节,导致插入失败。DDEV 的db容器默认启用utf8mb4,你无需任何配置。这是它超越手动 MySQL 安装的核心价值之一。

4. 常见问题与排查技巧实录(附真实错误日志分析)

4.1 “ddev start 报错:failed to start: failed to get docker context” —— Docker 上下文错乱

现象:执行ddev start时,终端输出:

Failed to start: failed to get docker context: error during connect: ...

根本原因:Docker CLI 默认连接default上下文,但某些安装(如 Docker Desktop)会创建desktop-linux上下文,导致 DDEV 找不到正确的docker.sock

排查步骤

  1. 查看当前 Docker 上下文:docker context ls
  2. 检查活跃上下文:docker context inspect | grep Name
  3. 如果活跃的是desktop-linux,切换回defaultdocker context use default

永久修复(Ubuntu/macOS):

# 删除错误上下文 docker context rm desktop-linux # 确保 default 上下文指向本地 Unix socket docker context inspect default | grep Host # 应输出 "Host": "unix:///var/run/docker.sock"

我的教训:某次在 macOS 上误装 Docker Desktop 后,ddev start一直失败。花了 2 小时查日志,最后发现docker context ls显示desktop-linux为 *,执行docker context use default立刻解决。记住:DDEV 只认default上下文

4.2 “Drupal 安装页面空白,查看日志显示 ‘PHP Parse error: syntax error’” —— PHP 版本与 Drupal 9 不兼容

现象:浏览器打开http://my-drupal9-site.ddev.site,页面空白;执行ddev logs -s web看到:

[Mon Sep 18 08:22:34.123456 2023] [php:error] [pid 123] [client 172.18.0.1:56789] PHP Parse error: syntax error, unexpected token "string" in /var/www/html/web/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php on line 123

原因分析unexpected token "string"是 PHP 8.0+ 的类型声明语法,而 Drupal 9.5+ 要求 PHP 8.0+。但你的ddev config可能误设为php_version: "7.4",导致容器内运行 PHP 7.4,却加载了 PHP 8.0 语法的 Drupal 9.5 代码。

解决方案

  1. 检查当前 PHP 版本:ddev exec php -v
  2. 修改.ddev/config.yaml
    php_version: "8.1" # 必须与 composer create-project 的 Drupal 版本匹配
  3. 重启环境:ddev restart

验证技巧:Drupal 9.5 要求 PHP >= 7.4,但强烈推荐 PHP 8.1。执行ddev exec php -r "echo version_compare(PHP_VERSION, '8.1.0', '>=') ? 'OK' : 'FAIL';",输出OK即正确。

4.3 “ddev drush cr 报错:‘CommandNotFoundException: Commandcris not defined’” —— Drush 命令未识别

现象ddev drush cr报错CommandNotFoundException,但ddev drush status正常。

深层原因:Drush 11 的命令别名(crcache:rebuild的别名)需要 Drupal 核心的drush.services.yml文件加载。而该文件在web/core/modules/system/system.services.yml中定义。如果ddev config--docroot设置错误(如设为.而非web),Drush 无法找到 Drupal 根目录,自然无法加载命令。

排查命令

# 检查 Drush 是否识别 Drupal 根 ddev drush status | grep "Drupal root" # 正确输出应为: # Drupal root : /var/www/html/web # 如果显示 "/var/www/html",说明 docroot 错误

修复步骤

  1. 删除错误配置:rm .ddev/config.yaml
  2. 重新初始化:ddev config --project-type=drupal9 --docroot=web --php-version=8.1
  3. 重启:ddev restart

注意:.ddev/config.yaml是 DDEV 的“宪法”,一旦写错,ddev restart无法修复,必须ddev config重来。这是新手最高频的错误,占我收到的 DDEV 咨询的 43%。

4.4 “文件上传失败,提示 ‘The file could not be uploaded’” —— 文件权限与大小限制双重陷阱

现象:Drupal 9 后台上传图片/附件失败,日志中出现:

Warning: move_uploaded_file(): Unable to move '/tmp/phpabc123' to '/var/www/html/web/sites/default/files/image.jpg'

双重原因

  • 权限问题sites/default/files目录 owner 不是www-data
  • 大小限制upload_max_filesizepost_max_size小于文件体积。

诊断与修复

# 1. 检查目录权限(应在容器内执行) ddev exec ls -ld web/sites/default/files # 正确输出:drwxrwxr-x 3 www-data www-data 4096 Sep 18 08:00 web/sites/default/files # 如果 owner 不是 www-data,修复: ddev exec sudo chown -R www-data:www-data web/sites/default/files # 2. 检查 PHP 上传限制 ddev exec php -i | grep -E "upload_max_filesize|post_max_size" # 正确输出:upload_max_filesize => 100M, post_max_size => 100M # 如果数值过小,在 .ddev/config.yaml 中添加: php_settings: upload_max_filesize: 100M post_max_size: 100M ddev restart

实操心得:Drupal 9 Media 模块上传 4K 视频时,upload_max_filesize必须 >= 512M。我在做教育平台项目时,曾因忘记调大此值,导致 300MB 的课程视频上传失败,排查了 1 天才发现是 PHP 配置问题。现在我的.ddev/config.yaml模板里,这一项永远是100M起步。

5. 进阶技巧与团队协作最佳实践

5.1 多环境配置:如何用一套代码管理本地/测试/生产数据库

DDEV 支持.ddev/config.*.yaml的环境覆盖机制,这是团队协作的基石。例如,你的项目需要对接测试环境的 MySQL:

  1. 创建.ddev/config.test.yaml

    name: my-drupal9-site-test type: drupal9 # 覆盖数据库配置 db: image: "ddev/db-mariadb-10.6:20230915_v1.22.4" # 指向外部测试数据库 host: "test-db.example.com" port: "3306" database: "test_drupal9" username: "test_user" password: "test_pass"
  2. 启动测试环境:ddev start --config=config.test.yaml

  3. settings.php中,DDEV 会自动注入环境变量:

    if (getenv('DDEV_ENVIRONMENT') === 'test') { $databases['default']['default'] = [ 'database' => getenv('DDEV_DB_DATABASE'), 'username' => getenv('DDEV_DB_USERNAME'), 'password' => getenv('DDEV_DB_PASSWORD'), 'host' => getenv('DDEV_DB_HOST'), 'port' => getenv('DDEV_DB_PORT'), 'driver' => 'mysql', ]; }

这样,ddev start启动本地环境,ddev start --config=config.test.yaml启动测试环境,代码零修改。Git 只提交.ddev/config.yaml(本地)和.ddev/config.test.yaml(测试),生产环境配置不进 Git,由运维单独管理。

5.2 性能调优:让 Drupal 9 本地开发速度提升 3 倍

默认 DDEV 配置适合入门,但大型 Drupal 9 站点(>200 模块)需调优:

  • PHP OPcache 加速:在.ddev/config.yaml中启用:

    php_settings: opcache.enable: 1 opcache.memory_consumption: 512 opcache.max_accelerated_files: 20000
  • MySQL 查询缓存(MariaDB 10.6+):

    db: extra_flags: "--query_cache_type=1 --query_cache_size=268435456"
  • 禁用 Xdebug(开发时关闭):Xdebug 会拖慢 300% 的请求速度。临时关闭:

    ddev xdebug off # 关闭 ddev xdebug on # 重新开启

实测数据:一个 150 模块的政府 Drupal 9 站点,启用 OPcache + 关闭 Xdebug 后,首页 TTFB 从 1200ms 降至 380ms。这是肉眼可感知的流畅度提升。

5.3 安全加固:防止本地环境被意外暴露

DDEV 默认绑定127.0.0.1,但仍有风险:

  • 禁用 HTTP 访问,强制 HTTPS:在.ddev/config.yaml中:

    https_enabled: true # DDEV 自动为 *.ddev.site 生成 Let's Encrypt 风格证书
  • 阻止外部访问:在web容器的 Nginx 配置中添加:

    server { listen 80; server_name _; return 444; # 关闭连接,不返回任何响应 }
  • 数据库强密码:DDEV 默认密码是db,生产环境必须改。在.ddev/config.yaml中:

    db: password: "MyS3cur3P@ssw0rd!"

最后提醒:DDEV 的ddev share命令会生成公网 URL(如 `https://my-drupal

http://www.jsqmd.com/news/1110783/

相关文章:

  • “肥料袋选盛军塑业?工业包装的这些门道你该知道“
  • 如何一键下载国家中小学智慧教育平台电子课本:tchMaterial-parser终极指南
  • Nginx server块与location匹配机制深度解析
  • 七月向阳,初心不忘|数图与您一同致敬那一百零五年的荣光
  • Node.js 自动重启工具 nodemon 原理与工程化实践
  • Ubuntu 20.04 MySQL生产级安装与配置实战指南
  • Ubuntu 18.04下Django+React客户管理系统实战部署
  • 校易淘实时私信聊天完整前后端代码实现
  • 携程业绩增速放缓、监管调查叠加AI威胁,梁建章如何带领穿越周期?
  • 2003-2024年地级市互联网综合发展指数+stata代码
  • Flask生产部署:Gunicorn+Nginx在Ubuntu 20.04上的完整实践
  • Tabby:现代开发者的一站式终端解决方案终极指南
  • Ubuntu 18.04 + DevStack 搭建 OpenStack 实战指南
  • Ubuntu 14.04下Redis RDB备份与恢复实战指南
  • IIM-42652与PIC18F2550实现6DoF运动追踪系统设计
  • 从零掌握Nuclei:自动化漏洞扫描与自定义模板编写实战指南
  • Docker部署AI视频分析平台完整流程(私有化部署 Docker 核心教程)
  • 如何永久保存B站珍贵视频:m4s-converter跨平台转换完全教程
  • 多留出独处空闲,自主思考更能滋养孩子内在的创造力
  • Anthropic归零层:LLM适配层的架构级移除
  • GPT-4 Turbo如何重塑工程师工作流:从提示工程到认知协作者
  • 扣子工作流跑一个月,9万积分烧到300,我做了一张成本追踪表
  • 软考高项-原创论文之论信息系统项目的团队绩效域
  • 华硕笔记本性能控制终极方案:G-Helper轻量级工具完全指南
  • 高通学习16--Kernel的编译
  • 2026深度实测:AI编程工具vibe coding能力对比,创业团队必看选型指南
  • 大模型稀疏激活原理与工程实践:从GPT-4的2%激活率说起
  • 深度解析智能云客服与普通在线客服技术差异:落地踩坑、代码实战与优化方案
  • NHS-PEG-DSPE 二硬脂酰磷脂酰乙醇胺-聚乙二醇-活性脂 DSPE-PEG-NHS 基团功能知识科普
  • Angular端到端测试实战:用TestCafe替代Protractor