frankenphp部署symfony必须显式配置caddyfile路由分流和php_worker指令,否则静态资源404、api不响应、发布必中断;因默认php_server全局fallback会误将js/css当php执行,且worker模式依赖绝对路径的php_worker配置与caddy联动生效。

FrankenPHP 部署 Symfony 项目必须显式配置 Caddyfile 路由分流 + 启用 worker 模式,否则静态资源 404、API 不响应、发布必中断——这不是 Symfony 配置问题,而是 FrankenPHP 的运行模型决定的。
为什么默认 Caddyfile 会把 Vue/React 前端文件当 PHP 请求处理
FrankenPHP 默认以 public/ 为根目录,且 php_server 是全局 fallback。前后端分离项目里,前端构建产物(如 dist/)和 Symfony API 共存于同一域名下,但 Caddy 不会自动识别“这个 JS 是静态文件,那个 /api/login 是 PHP”。结果就是:JS/CSS 被当成 PHP 脚本执行,返回 500 或空白;或者所有请求都进 index.php,前端路由(如 /user/profile)被 Symfony 拦截报 404。
- 必须用
handle+try_files显式声明静态路径优先级:先查{path},再查{path}/,最后 fallback 到/index.html(SPA 场景) -
root *要指向前端构建目录(如/app/dist),不是/app/public - API 路径(
/api/*、/login、/logout)必须单独handle并配php_server,不能依赖兜底规则
Caddyfile 中 php_worker 指令写错路径就等于没开 worker
FrankenPHP 的 worker 模式不是靠环境变量 FRANKENPHP_WORKER=1 单独生效的,它必须和 Caddyfile 里的 php_worker 指令联动。写错路径会导致日志静默无输出、getmypid() 每次都不一样、性能毫无提升。
-
php_worker后面的路径必须是绝对路径,例如/app/public/index.php,不能是./public/index.php或public/index.php - 入口必须是
public/index.php(或public/worker.php,Symfony ≥6.3 推荐),不能是bin/console或自定义脚本 - 要显式传环境变量:
env APP_ENV=prod,否则容器加载可能走 dev 模式,缓存失效 - 务必加
max_requests 5000,避免单 worker 内存泄漏卡死
发布时 reload Caddy 不会更新代码,必须 stop-workers
FrankenPHP 不响应 SIGHUP,caddy reload 只刷新路由规则,worker 进程仍拿着旧代码在跑。改完 PHP 文件直接 reload,用户看到的还是老逻辑。
- 正确流程:部署新代码 → 确保
var/cache可写、composer install --no-dev --optimize-autoloader执行完成 → 运行frankenphp stop-workers -
stop-workers不会中断正在处理的请求,它通知活跃 worker 处理完当前请求后优雅退出,新请求由新 worker 接管 - 如果用 Docker,记得挂载
/data卷持久化 session 和 cache,否则stop-workers后 cache 清空,首次请求变慢
HTTPS 和跨域容易漏掉的两个绑定点
本地能跑通,一上生产就跨域失败或 HTTPS 下 Request::isSecure() 返回 false,大概率是这两个地方没对齐:
-
SERVER_NAME必须在 Caddyfile 或环境变量中显式设为域名(如example.com),不能留空或用localhost,否则 Symfony 生成的 URL 带 http:// - DNS 解析必须指向运行 FrankenPHP 的服务器 IP,且 Caddy 监听的端口(443)要放行;宝塔面板用户需在「站点设置 → SSL」里启用并强制 HTTPS
- 跨域头不能只靠 Nginx/Apache 配,FrankenPHP 下必须在 Caddyfile 的对应
handle块里加header Access-Control-Allow-Origin "*",或在 Symfony 控制器里用Response::headers->set()
最常被跳过的其实是 php_worker 路径的绝对性——Caddy 启动时工作目录不可控,相对路径基本等于失效;还有就是误以为 frankenphp-worker 命令能替代 Caddyfile 配置,结果起了一堆孤儿进程,发布时根本停不干净。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











