FrankenPHP 支持单实例多站点,通过 Caddyfile 配置多域名虚拟主机,各站点独立 root 和 php_server;需严格隔离目录权限;Docker 推荐单容器多配置或反向代理多容器方案;worker 模式慎用于多框架混跑。

可以,FrankenPHP 支持在同一实例上同时运行多个网站项目,核心方式是通过 Caddy 的多站点(virtual host)配置实现,无需启动多个 FrankenPHP 进程。
用 Caddyfile 配置多个域名或子域名
Caddy 原生支持基于 server_name 的多站点路由。你只需在一份 Caddyfile 中定义多个站点块,每个块绑定独立域名、根目录和 PHP 处理逻辑:
- 为每个站点分配唯一域名(如 site1.test、site2.test),本地开发可用 hosts 文件映射到 127.0.0.1
- 每个站点块内设置 root 指向对应项目的
public/目录(Laravel/Symfony 等框架标准结构) - 每个块都启用 php_server 指令,FrankenPHP 会自动按请求 Host 头分发并执行对应项目的 PHP 入口
示例 Caddyfile:
# Caddyfile
{ frankenphp }
<p>site1.test {
root * /var/www/site1/public
php_server
encode zstd br gzip
}</p><p>site2.test {
root * /var/www/site2/public
php_server
encode zstd br gzip
}</p>目录与权限隔离是关键前提
多个站点共存时,安全与稳定性依赖于严格的文件路径隔离:
立即学习“PHP免费学习笔记(深入)”;
- 确保各项目物理路径完全独立(如
/var/www/site1、/var/www/site2),避免共享 vendor 或 .env - 每个项目
public/下的index.php必须正确加载自身框架引导文件(如 Laravel 的require __DIR__.'/../vendor/autoload.php';) - Linux 系统建议为每个站点创建独立系统用户,并用
chown -R site1-user:www-data控制写权限,防止跨站读取 .env 或 storage
Docker 环境下的多项目部署
若使用官方镜像 dunglas/frankenphp,不推荐一个容器挂载多个项目——这会破坏容器不可变性原则。更稳妥的做法是:
- 用 单容器 + 多 Caddyfile 站点配置(如上),所有项目目录通过
-v统一挂载到容器内不同路径,Caddyfile 显式引用 - 或采用 多容器 + 反向代理:启动一个专用 Caddy 反向代理容器(不带 FrankenPHP),再为每个 PHP 项目启动独立的 FrankenPHP 容器(监听不同端口如 8001、8002),由前置 Caddy 根据 Host 路由到后端
- Docker Compose 中可通过
environment: SERVER_NAME=site1.test为每个服务注入域名,配合 Caddyfile 的 import 机制动态加载站点片段
注意 worker 模式下的限制
如果启用 FrankenPHP 的 worker 模式(常驻内存提升性能),需特别注意:
- worker 模式默认只适用于单一应用上下文;多个完全不同框架(如 Laravel + ThinkPHP)混跑可能因 bootstrap 冲突导致异常
- 推荐对高并发主站启用 worker,其余低流量站点用普通
php_server模式共存 - 若必须多项目都走 worker,需确保它们共享同一套 autoloader 和配置加载逻辑,或改用进程级隔离(即每个项目单独运行一个 FrankenPHP 实例)



















