caddy配置php-fpm
它是什么内容覆盖指令含义、socket 写法、Caddy v1/v2 差异、单容器由 Caddy 拉起 php-fpm 的思路,以及 WordPress、CakePHP 等项目的落地步骤与常见排错点。
围绕 Caddyfile 的 php_fastcgi 指令,把客户端请求交给后端 PHP-FPM 执行,静态文件由 Caddy 直接读取。内容覆盖指令含义、socket 写法、Caddy v1/v2 差异、单容器由 Caddy 拉起 php-fpm 的思路,以及 WordPress、CakePHP 等项目的落地步骤与常见排错点。
详细介绍
简介
Caddy 配置 php-fpm 指的是在 Caddyfile 中把 PHP 请求转交给后端 PHP-FPM(PHP FastCGI Process Manager)处理的一套写法:Caddy 收到客户端请求后发送给 php-fpm,由它执行 PHP 脚本并返回结果,静态文件仍由 Caddy 直接读取。它解决的是「用 Caddy 替代 Nginx 承担 PHP 站点」时的配置问题,适合已经在用 Caddy 托管静态站、又需要跑 WordPress、CakePHP 等 PHP 应用的运维者与个人站长。核心优势是 php_fastcgi 这条指令是为 PHP 应用量身定制的快捷方式,能省去手写一长串 FastCGI 参数。
核心功能
- php_fastcgi 是一条有主见的指令,把请求代理到 php-fpm 这类 PHP FastCGI 服务器,是专为 PHP 应用定制的快捷方式,取代更长的配置写法。
- Caddy 的 reverse_proxy 本身能够服务任何 FastCGI 应用,php_fastcgi 只是在它之上针对 PHP 场景做了封装。
- 指令期望站点根目录(root),需要在站点块中先声明 PHP 文件所在目录,Caddy 才知道去哪里取 index.php 等文件。
- 后端既可以用 unix socket 连接,例如 gist 中 CakePHP 示例写法里的 unix//run/php/php7.4-fpm,也可以按 php-fpm 实际监听地址填写。
- Caddy 可通过 supervisor 插件自行启动 php-fpm,让 Web 服务器与 PHP 进程在同一容器或同一份配置里一起运行。
- 配合 systemd 记录 php-fpm 的日志,进程退出与报错信息可由系统日志统一收集。
- 静态文件与动态请求在同一站点块内分流,一条配置即可完成 php-fpm 的反向代理。
使用场景
- 新申请的云主机(例如 Ubuntu 的 Digital Ocean droplet)上用 Caddy 承担 Web 服务,同时需要跑 PHP 程序。
- 已有 Caddy 静态站点,需要追加 PHP 支持,把动态请求转给 php-fpm。
- 部署 WordPress 一类的 PHP 应用,流程通常是先配置 PHP、再配置 Caddy、然后配置数据库并导入旧站点。
- CakePHP 3(以及可能的 CakePHP 2)项目,站点根目录指向 webroot,用 php_fastcgi 转发到 unix socket。
- 单容器部署:Caddy 通过 supervisor 插件启动 php-fpm,一个镜像同时提供 Web 与 PHP 运行时。
- 把原本跑在 Nginx + PHP-FPM 上的站点迁到 Caddy,用一行配置替换原来的 location 与 fastcgi_pass 片段。
安装与获取步骤
- 准备好 Caddy 与 PHP-FPM,确认 php-fpm 进程已启动,并记下它监听的 unix socket 路径或 TCP 端口,后续写配置要用到。
- 编写 Caddyfile 站点块:先写 root 指向 PHP 项目根目录(如 webroot),再写 php_fastcgi 加上 php-fpm 地址,gist 中的写法形如 localhost:80 { root * webroot; php_fastcgi unix//run/php/php7.4-fpm }。
- 若不想用快捷指令,可用 reverse_proxy 手写 FastCGI 转发参数,它能服务任意 FastCGI 应用,但配置更长。
- 需要让 Caddy 托管 php-fpm 进程时,启用 Caddy 的 supervisor 插件,由 Caddy 负责拉起并守护 php-fpm。
- 重载或重启 Caddy 后访问站点首页与一个 PHP 入口文件,确认返回的是 PHP 执行结果而非源码或 404。
- 参考项目文档与社区文章核对细节,例如 https://caddyserver.com/docs/caddyfile/directives/php_fastcgi 与 https://php.watch/articles/caddy-php ,具体参数以官方页面为准。
与同类方案的区别
- Nginx + PHP-FPM 是常见组合,需要手写 location 与 fastcgi_pass;Caddy 侧用一条 php_fastcgi 即可表达同样的转发关系。
- Roadrunner、Swoole 属于常驻进程型 PHP 运行方式,与 php-fpm 这种 FastCGI 进程管理器的模型不同,选型时按应用框架要求决定。
- ModSecurity 是跨平台 WAF 引擎,素材中列出的支持对象为 Apache、IIS 与 Nginx;是否适用于 Caddy 场景以官方页面为准。
- FrankenPHP 这类方案可用 Caddy 支持的配置格式来配置,并自带 PHP 解释器查找配置的规则,与「Caddy + 外部 php-fpm」的组合方式不同。
注意事项
- unix socket 路径必须与本机 php-fpm 实际监听路径一致,gist 中的 unix//run/php/php7.4-fpm 只是示例,以本机 php-fpm 配置与官方页面为准。
- php_fastcgi 期望站点根目录,若漏写 root,会出现找不到入口文件或 404 的现象。
- Caddy 作者重构后是 Caddy 2,指令与语法与早期版本不同;gist 明确提醒使用 Caddy V2 时应参考对应的 V2 写法。
- 在全新 Ubuntu 14.04 droplet 上按经验配置仍可能失败(见 issue #435),需逐项确认 php-fpm 服务状态、socket 是否存在、防火墙与端口是否放行。
- reverse_proxy 能服务任意 FastCGI 应用,php_fastcgi 只针对 PHP;转发非 PHP 的 FastCGI 程序时不要照搬该指令。
- 用 systemd 记录 php-fpm 日志时,注意区分 Caddy 自身日志与 php-fpm 日志,排错时分别查看。
更新记录
最近更新:2026-10-04
软件参数速览
下载
常见问题
Caddyfile 里 php_fastcgi 后面应该填什么地址?
填 php-fpm 的监听地址,可以是 unix socket,例如 gist 中 CakePHP 示例用的 unix//run/php/php7.4-fpm,也可以是 TCP 地址。具体以本机 php-fpm 配置文件里 listen 项为准。
配置后访问 index.php 返回 404 或直接下载了源码,怎么排查?
php_fastcgi 期望站点根目录,先确认站点块里写了 root 指向 PHP 项目根目录(如 webroot),再确认该目录下确实存在入口文件,最后确认 php-fpm 进程正在运行且 socket 可访问。
Caddy v1 的 Caddyfile 能直接拿到 Caddy v2 上用吗?
不能。素材提到作者重构后是 Caddy 2,指令与语法都变了;gist 明确提醒使用 Caddy V2 时应参考专门的 V2 gist,旧写法需按 v2 文档改写。
不想单独维护 php-fpm 进程,可以让 Caddy 带起来吗?
可以。gist 中的做法是用 Caddy 的 supervisor 插件由 Caddy 启动 php-fpm,实现单容器同时提供 Caddy 与 PHP,php-fpm 的生命周期随 Caddy 管理。
php_fastcgi 和 reverse_proxy 转发 FastCGI 有什么区别?
reverse_proxy 能服务任意 FastCGI 应用,配置较长;php_fastcgi 是为 PHP 应用量身定制的快捷方式,替代更长的配置,并且期望站点根目录,PHP 站点优先用它。
在全新 Ubuntu 14.04 的 droplet 上照着做仍然跑不通,先查什么?
issue #435 反映过同类问题。按顺序确认 php-fpm 服务已启动、监听的 socket 或端口与配置一致、Caddyfile 的 root 指向正确,再结合系统服务状态逐项排查,细节以官方页面为准。
Caddy 能不能转发非 PHP 的 FastCGI 程序?
可以。Caddy 的 reverse_proxy 具备服务任何 FastCGI 应用的能力,php_fastcgi 只是针对 PHP 的封装,转发其他 FastCGI 程序时应使用 reverse_proxy 并自行写全参数。
想给这套 PHP 站点加 WAF,ModSecurity 能直接用吗?
ModSecurity 是跨平台 WAF 引擎,素材中列出的支持对象是 Apache、IIS 与 Nginx,未提及 Caddy;是否适用于本方案请以官方页面为准,不要默认兼容。