symfony应用通过frankenphp部署需绕过nginx+php-fpm,直接利用其内置caddy与常驻php运行时,实现自动https、静态资源直出、框架一次初始化复用全部请求;须确保项目为prod环境并完成精简构建、正确复制至/app目录、配置server_name、启用worker模式及持久化caddy证书存储。

将Symfony应用通过FrankenPHP部署到生产环境,需绕过Nginx+PHP-FPM的传统链路,直接利用FrankenPHP内置Caddy与常驻PHP运行时能力,实现HTTPS自动签发、静态资源直出、框架一次初始化复用全部请求。整个过程不依赖系统级PHP安装,不手动配置FPM池或certbot定时任务,且必须确保项目已处于prod环境并完成构建准备。
准备生产就绪的Symfony项目
这一步操作起来很简单,直接把文件拖进去就行,但跳过会导致后续容器启动失败或性能归零。
第一步:在本地导出精简版项目代码,排除所有开发依赖和敏感文件:
mkdir /tmp/symfony-prod && git archive HEAD | tar -x -C /tmp/symfony-prod
第二步:进入临时目录,设置生产环境变量并清除调试痕迹:
cd /tmp/symfony-prod && echo "APP_ENV=prod" > .env.local && echo "APP_DEBUG=0" >> .env.local && rm -rf .git .github tests/ var/cache/* var/log/*
第三步:安装生产依赖并生成优化后的自动加载器:
composer install --no-dev --optimize-autoloader --ignore-platform-reqs -a
注意:【必须删除var/cache目录下的旧缓存】,否则FrankenPHP容器内首次启动会因权限或路径问题卡在缓存重建阶段,表现为500错误且日志无有效线索。
编写Dockerfile构建镜像
FrankenPHP官方镜像已预装Caddy和PHP 8.3+,你只需声明域名、复制代码、启用worker模式即可。
FROM dunglas/frankenphp
ENV SERVER_NAME=your-domain.com
COPY . /app
RUN chmod +x /app/bin/console && php /app/bin/console assets:install --symlink --relative public
这一步的关键是让Symfony的public目录成为Caddy服务根路径,否则CSS/JS无法加载;【不要把代码复制到/app/public,而应复制到/app】,因为FrankenPHP默认以/app/public为Web根,但Symfony的public目录本身就在/app下。
配置compose.yaml启用HTTPS与持久化
方法一:标准双端口+自动证书(推荐)
services: php: build: . restart: always ports: - "80:80" - "443:443" - "443:443/udp"
volumes: - caddy_data:/data - caddy_config:/config
volumes: caddy_data: caddy_config:
方法二:仅HTTP调试(开发阶段可用)
将SERVER_NAME设为ENV SERVER_NAME=:80,并注释掉443端口映射,避免Let's Encrypt强制重定向导致无限跳转。
提示:Caddy会在第一次收到HTTPS请求时自动向Let's Encrypt申请证书,前提是DNS A记录已生效且服务器可被公网访问。若申请失败,容器日志中会出现failed to obtain certificate,此时请检查域名解析与防火墙80/443端口是否放行。
服务器初始化与部署
登录目标Linux服务器后,按顺序执行以下命令:
apt update && apt upgrade -y && apt install -y docker.io docker-compose
useradd -m -s /bin/bash deployer && usermod -aG docker deployer
su - deployer -c "mkdir -p ~/my-symfony-app && cd ~/my-symfony-app && wget https://your-cdn.com/Dockerfile && wget https://your-cdn.com/compose.yaml"
su - deployer -c "cd ~/my-symfony-app && docker compose up -d"
这一步完成后,FrankenPHP会自动监听80端口并重定向至HTTPS,同时在后台启动Symfony worker进程。首次访问域名时,Caddy将触发证书申请流程,约10–60秒内完成HTTPS握手,此后所有请求均走HTTP/3加速通道。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











