frankenphp 原生支持 windows,将 caddy 与嵌入式 php 解释器打包为单个可执行文件,实现静态文件服务、php 解析、自动 https 和 worker 模式常驻内存,无需 nginx 或 php-fpm,开箱即用于 laravel 等本地开发。

在 Caddy 中运行 Laravel 10,核心是让静态请求走文件系统、PHP 请求交由 PHP 解释器处理,同时兼顾路由重写(Laravel 的单入口机制)和 HTTPS 自动化。Caddy 本身不内置 PHP 支持,但搭配 FrankenPHP 或传统 PHP-FPM 均可实现——前者更轻量、开箱即用,后者兼容性更强。
推荐方案:用 FrankenPHP(最简部署)
FrankenPHP 把 PHP 嵌入 Caddy 进程,无需额外配置 PHP-FPM,Windows/macOS/Linux 全平台支持,特别适合本地开发和中小项目。
- 下载对应系统的
frankenphp二进制(如frankenphp_1.2.0_windows_amd64.zip),解压后得到frankenphp.exe(Windows)或frankenphp(Linux/macOS) - 确保 Laravel 10 项目根目录下有
public/子目录,且已执行过composer install和php artisan key:generate - 新建
Caddyfile,内容如下:
root * /path/to/your/laravel/public
php_backend
encode zstd gzip
file_server
tls you@example.com
}
其中 php_backend 是 FrankenPHP 内置指令,自动接管 .php 请求;root 必须指向 public/,不是项目根目录。
运行命令:frankenphp run(会自动读取当前目录的 Caddyfile)。首次启动时自动申请 Let's Encrypt 证书,域名需解析到本机且开放 443 端口。
兼容方案:Caddy + 外部 PHP-FPM
若你已有稳定 PHP-FPM 服务(如通过 XAMPP、Docker 或系统安装),可沿用传统 FastCGI 方式。
- 确认 PHP-FPM 正在运行,并监听 Unix socket(如
/var/run/php/php8.2-fpm.sock)或 TCP(如127.0.0.1:9000) - Caddyfile 配置示例:
root * /path/to/laravel/public
php_fastcgi unix//var/run/php/php8.2-fpm.sock {
index index.php
}
encode zstd gzip
file_server
tls you@example.com
}
注意:php_fastcgi 指令要求 Caddy 编译时启用 http.handlers.php_fastcgi 插件(官方预编译版默认包含);路径中的 index.php 会被自动追加到重写逻辑中,无需手动写 rewrite 规则。
关键细节不能漏
-
.env 文件权限:确保
.env不在public/目录内,且 Web 服务器无法直接访问(Caddy 默认禁止访问以点开头的文件,但仍建议设为 600 权限) -
APP_URL 和 SESSION_DOMAIN:在
.env中设为实际域名(如APP_URL=https://example.com),避免混合内容或 Cookie 被拒 -
重写支持:Laravel 路由依赖 URL 重写。FrankenPHP 和
php_fastcgi均已内置对index.php的 fallback,无需额外rewrite块;但如果你用file_server提供静态资源,要确保它不拦截 API 或前端路由 -
日志与调试:Caddy 日志默认输出到终端,可加
log指令写入文件;Laravel 错误应开启APP_DEBUG=true并检查storage/logs/
验证是否成功
启动后访问 https://example.com,应看到 Laravel 欢迎页;访问 https://example.com/artisan 应返回 404(说明 public/ 设置正确);执行 php artisan tinker 能正常进入交互环境,代表 Composer 和 PHP 运行时无问题。











