部署symfony企业级项目须采用docker+postgresql+nginx黄金组合:执行symfony new cms --version=lts --webapp创建lts项目,确认app_env=prod与flex enabled;database_url中host设为db而非localhost;dockerfile基于php 8.3-apache,安装pdo_pgsql等扩展并预热缓存;docker-compose.yml编排db、php、nginx三容器,首次启动后运行migrate初始化数据库。

用 Symfony 框架部署企业级项目,必须绕过本地开发环境直连生产服务器的常见误区——真实场景中,Docker 容器化 + Nginx 反向代理 + PostgreSQL 独立实例是当前生产环境的黄金组合,缺一不可。
初始化带全栈能力的 Symfony 6 LTS 项目
执行 symfony new cms --version=lts --webapp 创建项目,该命令自动拉取 website-skeleton 并启用 Flex、Twig、MakerBundle、WebProfiler 等生产就绪组件。
进入项目目录后立即运行 php bin/console about,确认输出中包含 【APP_ENV=prod】 和 【Flex enabled】 两项,若 APP_ENV 显示为 dev,则后续所有缓存与日志行为将不符合生产预期。
这一步操作起来很简单,直接把命令复制粘贴执行即可,但必须在创建时指定 --version=lts,否则默认生成的可能是非长期支持版本,导致半年后无法获得安全补丁。
配置多环境分离的数据库连接
编辑 .env 文件,将 DATABASE_URL 改为:
DATABASE_URL="postgresql://symfony:changeMe@db:5432/cms?serverVersion=15&sslmode=prefer"
注意:此处的 host 必须写 【db】 而非 localhost,因为 Docker Compose 中服务名即 DNS 名,localhost 在容器内指向自身而非数据库容器。
在 config/packages/doctrine.yaml 中关闭 SQLite 默认配置,显式声明:
doctrine:<br> dbal:<br> url: '%env(resolve:DATABASE_URL)%'<br> server_version: '15'
删掉 sqlite 配置块,否则 Doctrine 会尝试加载不存在的驱动并报错。
构建可复现的 Docker 部署镜像
在项目根目录创建 Dockerfile:
第一步:基于官方 PHP 8.3-apache 镜像;
第二步:安装 PostgreSQL 客户端、zip 扩展及系统依赖:apt-get update && apt-get install -y libpq-dev zlib1g-dev && docker-php-ext-install pdo pdo_pgsql zip;
第三步:复制项目文件并设置权限:COPY --chown=www-data:www-data . /var/www/html/;
第四步:预热生产环境缓存:RUN APP_ENV=prod APP_DEBUG=0 php bin/console cache:warmup;
第五步:切换 Apache 文档根目录至 public:RUN sed -i 's/DocumentRoot \/var\/www\/html/DocumentRoot \/var\/www\/html\/public/g' /etc/apache2/sites-available/000-default.conf。
编写生产就绪的 docker-compose.yml
方法一:基础三容器编排(推荐用于首次上线)
定义 services → db(postgres:15-alpine)、php(构建自上一步 Dockerfile)、nginx(nginx:alpine);
db 容器挂载 ./docker/postgres/init.sql 到 /docker-entrypoint-initdb.d/,确保首次启动即创建 cms 数据库和 symfony 用户;
php 容器 expose 8000 端口,nginx 容器 ports 映射 80:80,并通过 upstream php:8000 实现反向代理;
方法二:跳过 nginx,改用 Symfony 内置 Web Server(仅限调试,【禁止用于生产】)。
运行 docker-compose up -d --build 后,立刻执行 docker-compose exec php php bin/console doctrine:migrations:migrate --no-interaction 完成数据库结构初始化。











