ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

用 devenv 一键搭建可复现的本地 WordPress 开发环境(Caddy + PHP-FPM + MariaDB + wp-cli)

用 devenv 一键搭建可复现的本地 WordPress 开发环境(Caddy + PHP-FPM + MariaDB + wp-cli) 开发工具CLI【免费下载链接】devenvFast, Declarative, Reproducible, and Composable Developer Environments using Nix项目地址https://gitcode.com/gh_mirrors/de/devenv点击查看免费下载导读本文讲解如何在 devenv 中声明式地搭建一套完整的本地 WordPress 开发环境以 Caddy 作为 Web 服务器、PHP-FPM 执行 PHP 代码、MariaDB 存储数据并用 wp-cli 自动完成 WordPress 下载与wp-config.php生成。读完本文你将掌握languages.php、services.mysql、services.caddy、tasks与进程依赖等 devenv 核心配置的配合方式并能实现“一条devenv up命令即可打开 http://localhost:8000 开始安装 WordPress”的完整工作流。本文主体基于仓库文档 docs/src/content/docs/integrations/wordpress.md并结合仓库源码与测试佐证底层实现细节。环境总览四个组件如何分工整套环境由四个组件构成各自职责如下Caddy—— Web 服务器接收 HTTP 请求并将其路由到 PHP-FPMPHP-FPM—— FastCGI 进程管理器负责执行 WordPress 的 PHP 代码MariaDB—— 数据库服务器存储 WordPress 的内容、用户与设置wp-cli—— WordPress 命令行管理工具用于下载核心、生成配置文件及后续管理。在 devenv 中这些组件不是手动启动的而是全部以声明式配置写入devenv.nix再由devenv up按依赖关系编排启动。仓库的集成测试 tests/wordpress/devenv.nix 展示了同样思路的自动化验证版本可作为对照参考。快速开始在项目根目录创建devenv.nix写入下文完整配置运行devenv up—— 服务启动、数据库完成初始化、WordPress 自动下载、wp-config.php自动生成浏览器访问 http://localhost:8000 完成 WordPress 安装。整个流程中数据库 seeding、WordPress 下载与配置文件生成都是自动的无需手工干预。完整配置详解以下为仓库文档给出的完整devenv.nix见 docs/src/content/docs/integrations/wordpress.md我们逐段拆解其含义。{ pkgs, config, ... }: { # WordPress CLI for managing WordPress from the command line packages [ pkgs.wp-cli ]; languages.php { enable true; version 8.4; # PHP extensions required by WordPress # Note: common extensions like xml, mbstring, curl are enabled by default extensions [ mysqli # MySQL database connectivity pdo_mysql # PDO MySQL driver (used by some plugins) gd # Image manipulation (thumbnails, image editing) zip # Plugin/theme installation from zip files intl # Internationalization support exif # Image metadata reading ]; # PHP settings for WordPress ini memory_limit 256M upload_max_filesize 64M post_max_size 64M max_execution_time 300 ; # PHP-FPM pool configuration # FPM (FastCGI Process Manager) manages PHP worker processes fpm.pools.web { settings { pm dynamic; # Dynamic process management pm.max_children 10; # Maximum worker processes pm.start_servers 2; # Workers to start initially pm.min_spare_servers 1; # Minimum idle workers pm.max_spare_servers 5; # Maximum idle workers }; }; }; # MariaDB database server services.mysql { enable true; package pkgs.mariadb; # Create the WordPress database on first run initialDatabases [{ name wordpress; }]; # Create database user with access to WordPress database ensureUsers [{ name wordpress; password wordpress; ensurePermissions { wordpress.* ALL PRIVILEGES; }; }]; }; # Caddy web server services.caddy { enable true; # Serve WordPress on http://localhost:8000 virtualHosts.http://localhost:8000 { extraConfig root * ${config.devenv.root}/wordpress # Pass PHP requests to PHP-FPM. php_fastcgi unix/${config.languages.php.fpm.pools.web.socket} # Serve static files directly file_server ; }; }; # Download WordPress and write wp-config.php once MariaDB is ready and seeded. # Runs automatically as part of devenv up via the caddy process dependency. tasks.wordpress:setup { description Download WordPress and create wp-config.php; after [ devenv:mysql:configure ]; cwd config.devenv.root; exec set -e mkdir -p wordpress cd wordpress if [ ! -f wp-includes/version.php ]; then echo Downloading WordPress... wp core download else echo WordPress already downloaded. fi if [ ! -f wp-config.php ]; then echo Creating wp-config.php... wp config create \ --dbnamewordpress \ --dbuserwordpress \ --dbpasswordpress \ --dbhost127.0.0.1 echo echo WordPress configured! Visit http://localhost:8000 to complete installation. else echo wp-config.php already exists. fi ; }; # Hold caddy until WordPress is on disk so the first request isnt a 404. processes.caddy.after [ wordpress:setup ]; # Show helpful instructions when entering the shell enterShell echo echo WordPress Development Environment echo echo echo Run devenv up to start services and provision WordPress, then open: echo http://localhost:8000 echo echo Database credentials (for wp-config.php): echo Host: 127.0.0.1 echo Database: wordpress echo User: wordpress echo Password: wordpress echo ; }1.packages引入 wp-clipackages [ pkgs.wp-cli ];将 wp-cli 加入 shell 环境使其在devenv shell或devenv up后可直接使用如wp core download、wp config create、后续的插件/主题管理。devenv up运行的任务同样继承该环境因此wordpress:setup任务内可以调用wp命令。2.languages.phpPHP 运行时与 PHP-FPMlanguages.php { enable true; version 8.4; extensions [ mysqli pdo_mysql gd zip intl exif ]; ini memory_limit 256M upload_max_filesize 64M post_max_size 64M max_execution_time 300 ; fpm.pools.web { ... }; };enable true启用 PHP 工具链version指定 PHP 大版本。从 src/modules/languages/php.nix 的实现看版本解析优先使用nixpkgs中对应phpversion包若不可用则从github:fossar/nix-phps输入拉取该输入的声明方式可参考 examples/caddy-php/devenv.yaml 中的phps输入解析不到会抛出 PHP version ... is not available 错误。extensions列出 WordPress 必需的扩展mysqli负责 MySQL 连接、pdo_mysql供部分插件使用、gd用于图片缩放与编辑、zip支持从压缩包安装插件/主题、intl提供国际化、exif读取图片元数据。需要说明的是xml、mbstring、curl等常用扩展默认已启用无需重复声明php.nix通过configurePackage在默认启用扩展之上追加extensions列表中的项。ini追加php.ini指令memory_limit 256M限制单脚本内存upload_max_filesize与post_max_size提升媒体上传上限max_execution_time 300放宽脚本超时适合主题/插件安装与媒体处理。从源码看ini内容会被拼入该池生成的php.iniphpIni拼接php.ini与用户指令同时若启用了services.mysql模块还会自动注入pdo_mysql.default_socket/mysqli.default_socket指向本机 MySQL 的 Unix socket。fpm.pools.web定义一个名为web的 PHP-FPM 池。pm dynamic表示动态调整 worker 数量配合pm.max_children最大 worker 数、pm.start_servers初始 worker 数、pm.min_spare_servers/pm.max_spare_servers空闲 worker 上下限。注意指令名必须加引号如pm.max_children。从php.nix的poolOpts实现可见池的socket是只读选项默认路径为${config.env.DEVENV_RUNTIME}/php-fpm/web.sock因此配置中可直接引用${config.languages.php.fpm.pools.web.socket}获取该路径每个池会生成一个名为phpfpm-pool的进程web池对应phpfpm-web进程。3.services.mysqlMariaDB 数据库服务services.mysql { enable true; package pkgs.mariadb; initialDatabases [{ name wordpress; }]; ensureUsers [{ name wordpress; password wordpress; ensurePermissions { wordpress.* ALL PRIVILEGES; }; }]; };package pkgs.mariadb指定数据库引擎为 MariaDBservices.mysql的默认包即pkgs.mariadb见 src/modules/services/mysql.nixinitialDatabases声明首次启动时创建的数据库列表这里创建一个空的wordpress库schema属性可省略省略时创建空库ensureUsers声明需要确保存在的数据库用户用户wordpress密码wordpress并对wordpress.*授予ALL PRIVILEGESensurePermissions的键为数据库.表值为逗号分隔的 SQL 权限。这些初始化动作并不是发生在 shell 里的而是由一个自动生成的 oneshot 任务devenv:mysql:configure完成的mysql.nix在processes.mysql.before中声明它并在其configureScript中按initialDatabases/ensureUsers生成建库、建用户与授权 SQL。数据目录为${config.env.DEVENV_STATE}/mysql环境变量MYSQL_HOME监听端口则通过进程端口分配机制预留默认3306并同时注入MYSQL_TCP_PORT、MYSQL_UNIX_PORT等环境变量。4.services.caddyWeb 服务器services.caddy { enable true; virtualHosts.http://localhost:8000 { extraConfig root * ${config.devenv.root}/wordpress php_fastcgi unix/${config.languages.php.fpm.pools.web.socket} file_server ; }; };virtualHosts声明虚拟主机键为站点地址http://localhost:8000extraConfig的内容逐字写入 Caddyfile 的站点块见 src/modules/services/caddy.nix 中vhostToConfig的拼接逻辑root * ${config.devenv.root}/wordpress将站点根目录指向仓库下的wordpress/目录php_fastcgi unix/...通过 PHP-FPM 的 Unix socket 转发 PHP 请求该指令会自动处理 WordPress 的固定链接pretty permalinks——不存在的路径会回落到index.phpfile_server直接提供静态文件服务。启用后模块会生成processes.caddy进程用caddy run --config 生成的配置文件启动配置会先经过caddy fmt格式化再caddy adapt转成 JSON源码中formattedConfig/adaptedConfig的实现extraConfig里的指令因此可以放心编写为可读的 Caddyfile 风格。5.tasks.wordpress:setup自动下载并配置 WordPresstasks.wordpress:setup { description Download WordPress and create wp-config.php; after [ devenv:mysql:configure ]; cwd config.devenv.root; exec set -e mkdir -p wordpress cd wordpress if [ ! -f wp-includes/version.php ]; then echo Downloading WordPress... wp core download else echo WordPress already downloaded. fi if [ ! -f wp-config.php ]; then echo Creating wp-config.php... wp config create \ --dbnamewordpress \ --dbuserwordpress \ --dbpasswordpress \ --dbhost127.0.0.1 echo echo WordPress configured! Visit http://localhost:8000 to complete installation. else echo wp-config.php already exists. fi ; };这段配置是整套环境的“粘合层”after [ devenv:mysql:configure ]声明它必须等数据库初始化任务成功后才执行保证建库、建用户、授权都已就绪cwd config.devenv.root指定工作目录为项目根目录脚本具备幂等性通过检查wp-includes/version.php判断 WordPress 是否已下载通过检查wp-config.php判断配置是否已生成重复运行devenv up不会重复下载或覆盖已有配置wp config create使用--dbhost127.0.0.1以 TCP 方式连接数据库wp-config.php 中的DB_HOST即 127.0.0.1。关于任务机制devenv 的tasks模块见 src/modules/tasks.nix支持after/before/wantedBy等依赖声明after默认语义是等前置任务成功完成后缀succeeded同时devenv:mysql:configure本身是在services.mysql模块中按“MySQL 就绪后”这一条件生成的processes.mysql.ready通过mysqladmin ping探测devenv:mysql:configure以wantedBy [ devenv:processes:mysql ]挂接见mysql.nix末尾因此这条依赖链实际是“MariaDB 就绪 → 建库建用户 → 下载 WordPress 并写配置”。6.processes.caddy.after让首请求绝不 404processes.caddy.after [ wordpress:setup ];Caddy 进程要等到wordpress:setup成功之后才启动确保第一个 HTTP 请求到达时文档根目录下已经有真实的 WordPress 文件而不是一个空目录。这是文档明确强调的“Hold caddy until WordPress is on disk so the first request isnt a 404”这一设计意图的实现。7.enterShell进入环境时的引导信息enterShell在进入开发 shell 时打印使用说明与数据库凭据Host/Database/User/Password方便团队成员无需翻文档即可上手。对于本文示例凭据均为wordpress主机127.0.0.1仅用于本地开发。工作原理devenv up的依赖执行图运行devenv up时devenv 按依赖关系依序执行以下节点devenv:mysql:configure—— MariaDB 就绪后作为 oneshot 任务运行创建wordpress数据库、wordpress用户并授予权限由services.mysql模块自动生成其内容来自initialDatabases与ensureUserswordpress:setup—— 在devenv:mysql:configure成功之后运行下载 WordPress 核心并写入wp-config.phpCaddy—— 仅在wordpress:setup完成后启动避免首个 HTTP 请求命中空文档根目录PHP-FPM—— 通过 Unix socket 暴露 FastCGI 接口Caddy 的php_fastcgi指令将.php请求代理给它并自动处理 WordPress 固定链接不存在的路径回落到index.php。这一编排充分体现了 devenv 的“进程 任务”双层依赖模型进程processes.*提供常驻服务任务tasks.*提供一次性初始化二者通过after/before/wantedBy互相关联。底层调用链速览PHP-FPM 进程languages.php.fpm.pools中每个池生成processes.phpfpm-pool其启动脚本用php-fpm -F -y pool.conf -c php.ini前台运行池配置由 src/modules/languages/php.nix 的fpmCfgFile生成含[global]与池段落error_log默认落在${config.env.DEVENV_STATE}/php-fpm/php-fpm.logMySQL 初始化见 src/modules/services/mysql.nix 的configureScript逐库检查information_schema.schemata避免重复创建逐用户执行CREATE USER IF NOT EXISTS与GRANTCaddy 配置见 src/modules/services/caddy.nixvirtualHosts被序列化为 Caddyfile 站点块随后格式化并适配为 JSON 配置后启动。仓库测试 tests/wordpress/devenv.nix 验证了类似链路的可运行性它通过processes.phpfpm-web.ready.exec test -S .../web.sock探测 FPM socket通过processes.caddy.ready.http.get请求/index.php并断言返回成功还让index.php用mysqli实际连接数据库后输出OK——这相当于用自动化方式复现了本文文档描述的整条服务链路。故障排查数据库连接错误devenv up会自动完成数据库初始化。如果页面提示 Error establishing database connection先确认数据库与用户是否确实存在mysql -u wordpress -pwordpress -h 127.0.0.1 -e SHOW DATABASES;如果wordpress用户缺失说明devenv:mysql:configure任务没有执行可检查日志devenv tasks list devenv tasks run devenv:mysql:configure另外旧版本搭建残留的.devenv/state/mysql也可能导致此问题数据目录由MYSQL_HOME指向${config.env.DEVENV_STATE}/mysql见mysql.nix清理该目录后重新运行devenv up即可。端口 8000 被占用若其他服务占用了 8000 端口只需在 Caddy 配置中改端口即可services.caddy.virtualHosts.http://localhost:8080 { ... };若需要固定端口分配可参考测试 tests/wordpress/devenv.nix 的做法通过config.processes.caddy.ports.http.value读取进程端口分配结果并利用processes.caddy.ports.http.allocate 8000声明期望端口避免硬编码。PHP 扩展缺失如果 WordPress 报告缺少扩展把它们加入extensions列表languages.php.extensions [ mysqli imagick # Add additional extensions as needed ];修改配置后重新进入 shell 或重跑devenv up让 PHP 包重建。进阶配置添加 Redis 做缓存Redis 通过缓存数据库查询显著改善 WordPress 性能services.redis.enable true; languages.php.extensions [ # ... other extensions ... redis ];然后在 WordPress 后台安装 Redis Object Cache 之类的对象缓存插件。值得说明的是即便不手动添加redis扩展只要启用services.redissrc/modules/languages/php.nix 的config部分也会自动把redis扩展加入languages.php.extensionslib.optionals config.services.redis.enable [ redis ]services.redis模块见 src/modules/services/redis.nix默认监听127.0.0.1:6379并生成processes.redis进程。因此手动声明扩展更多是显式表达意图。添加 Xdebug 进行调试在 IDE 中启用逐步调试languages.php.extensions [ # ... other extensions ... xdebug ]; languages.php.ini memory_limit 256M xdebug.mode debug xdebug.start_with_request yes xdebug.client_port 9003 ;xdebug.mode debug开启调试模式xdebug.start_with_request yes让每个请求都触发调试会话也可改为trigger配合 IDE 的监听行为xdebug.client_port 9003指定调试器监听端口Xdebug 3 的默认端口。注意这些ini指令与上面 PHP 版本的memory_limit一起写即可同一languages.php.ini选项会被合并进最终的php.ini。使用本地证书启用 HTTPS部分插件强制要求 HTTPS可用本地证书解决certificates [ localhost ]; services.caddy.virtualHosts.https://localhost { extraConfig tls ${config.env.DEVENV_STATE}/mkcert/localhost.pem ${config.env.DEVENV_STATE}/mkcert/localhost-key.pem root * ${config.devenv.root}/wordpress php_fastcgi unix/${config.languages.php.fpm.pools.web.socket} file_server ; };certificates选项由 mkcert 集成模块src/modules/integrations/mkcert.nix实现对列表中的每个域名生成本地 CA 签名证书默认输出到${config.env.DEVENV_STATE}/mkcert下localhost域名对应localhost.pem与localhost-key.pem。模块同时设置env.CAROOT指向该目录并在证书生成任务native 进程管理器下为devenv:mkcert:setup完成后才启动依赖证书的进程。两点注意事项tls指令直接指定证书与私钥文件路径Caddy 不再走自动 ACMEHTTPS 默认 443 端口需要特权建议改用高位端口如 8443或自行配置系统允许绑定特权端口。修改端口只需替换virtualHosts的键例如https://localhost:8443。小结这套 WordPress 开发环境配置的核心价值在于完全声明式与可复现PHP 版本、扩展、PHP-FPM 池参数、数据库初始化、Web 服务器与任务编排全部写在devenv.nix中任何团队成员拿到仓库后执行devenv up即可得到一致的本地环境而wordpress:setup任务的幂等写法按文件存在性判断是否下载/写配置让重复启动也安全无副作用。若想进一步深入建议阅读src/modules/languages/php.nix —— PHP 版本解析、扩展组装与 PHP-FPM 池生成src/modules/services/mysql.nix —— 数据库初始化任务与用户授权实现src/modules/services/caddy.nix —— Caddyfile 组装与进程启动src/modules/tasks.nix —— 任务依赖after/before/wantedBy机制tests/wordpress/devenv.nix —— 本环境的自动化验证版本examples/caddy-php/devenv.nix 与 examples/caddy-php/devenv.yaml —— 更简化的 Caddy PHP-FPM 参考示例赞分享开发工具CLI【免费下载链接】devenvFast, Declarative, Reproducible, and Composable Developer Environments using Nix项目地址https://gitcode.com/gh_mirrors/de/devenv点击查看免费下载相关推荐Argo Workflows 使用 Nix 与 devenv 搭建可复现本地开发环境实战指南Argo Workflows 使用 Nix 与 devenv 搭建可复现本地开发环境实战指南 Nix 是一种强调可复现构建环境的包管理器与构建工具Argo W云原生容器编排工作流自动化任务调度后端Gutenberg 开发必学使用 wp-env 零配置搭建本地 WordPress 开发环境Gutenberg 开发必学使用 wp env 零配置搭建本地 WordPress 开发环境 wp env 即 wordpress/env npm 包是后端前端Laravel on Docker 实战用 Laradock 一键搭建 Nginx PHP-FPM MySQL Redis 开发环境Laravel on Docker 实战用 Laradock 一键搭建 Nginx PHP FPM MySQL Redis 开发环境 导读 本文以后端开发工具DevOps上一篇Yuxi 推理与工具结果统一展示前端消息归组与状态判定的设计实践下一篇Pinokio基于Electron的AI应用沙箱化部署平台技术实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表