FrankenPHP 托管多站点的核心思路是利用 Caddy 的多 host 路由能力,通过 Caddyfile 为各域名或路径配置独立 root 和 php 指令,指向不同 public 目录,实现物理隔离与统一管理,无需修改 PHP 代码。

FrankenPHP 托管多个 PHP 站点,核心思路是用 Caddy 的多 host 路由能力 + 多个独立 PHP 应用根目录 + 环境隔离,而不是传统 Nginx 那样靠一堆 server 块拼凑。它更简洁,也更统一。
直接支持多域名或多路径的站点分离
FrankenPHP 本身不提供“站点管理后台”这类抽象层,它的多站点能力完全来自底层 Caddy 的路由机制。你只需在 Caddyfile 中为每个域名(或路径)定义独立的处理逻辑,并指向对应项目的 public/ 目录。
例如,同时托管 site1.com、site2.com 和 admin.site1.com:
# Caddyfile
{
admin localhost:2019
http_port 80
https_port 443
}
site1.com www.site1.com {
root * /var/www/site1/public
php
file_server
}
site2.com www.site2.com {
root * /var/www/site2/public
php
file_server
}
admin.site1.com {
root * /var/www/admin-site1/public
php
file_server
}- 每个
siteX.com块就是一个独立站点,互不干扰 -
php指令启用 FrankenPHP 内置 PHP 运行时(自动识别.php文件并执行) -
root *指定该站点的文档根目录(Laravel/Symfony 推荐用public/) -
file_server处理静态资源(CSS/JS/图片),无需额外配置
✅ 提示:Caddy 会自动为每个域名申请 Let's Encrypt HTTPS 证书(需 DNS 可解析),HTTP/3 和自动重定向到 HTTPS 全部开箱即用。
立即学习“PHP免费学习笔记(深入)”;
使用子目录方式托管多个项目(适合开发或内网)
如果不想配多个域名,也可以用路径前缀区分站点:
localhost {
# 主站:/ → site1
handle_path / {
root * /var/www/site1/public
php
file_server
}
# 子站:/site2/ → site2
handle_path /site2/* {
uri strip_prefix /site2
root * /var/www/site2/public
php
file_server
}
# 后台:/admin/ → admin-site1
handle_path /admin/* {
uri strip_prefix /admin
root * /var/www/admin-site1/public
php
file_server
}
}-
handle_path+uri strip_prefix实现路径级路由 - 各项目仍保持物理隔离,彼此不会共享 session 或配置
- 适合本地调试、测试环境或内部工具聚合页
关键注意事项:避免冲突与提升稳定性
-
PHP 配置隔离:FrankenPHP 默认共用一套
php.ini。如需不同站点用不同配置(比如一个开opcache,一个关display_errors),可通过环境变量或启动参数区分:SERVER_NAME=site1.com PHP_INI_SCAN_DIR=/etc/php/site1.d frankenphp run
-
Worker 模式慎用于多站点:
worker模式让 PHP 应用常驻内存,但目前一个 FrankenPHP 进程只支持一个 worker 应用(即一个Caddyfile块)。若要多个站点都启用 worker,建议:- 分开运行多个 FrankenPHP 实例(不同端口 + 不同 Caddyfile)
- 或用 Docker 分容器部署(更推荐,天然隔离)
-
日志与监控分开:默认所有站点日志混在一起。可在每个站点块中加:
log { output file /var/log/frankenphp/site1.log } 权限与目录安全:确保每个站点目录属主明确(如
www-data:www-data),禁止跨目录访问。FrankenPHP 不会自动限制../路径穿越,靠root指令和文件系统权限兜底。
不需要改 PHP 代码,也不依赖框架特定功能。只要每个项目有标准的 public/index.php 入口,FrankenPHP 就能直接跑起来。



















