【问题标题】:Packing and deploying Symfony web site打包和部署 Symfony 网站
【发布时间】:2018-12-14 04:05:56
【问题描述】:

我是 Symfony 的新手,来自 .NET 世界。使用 Symfony (4) 文档,我设法创建了简单的网站。现在我想把它付诸实践,但我正在努力寻找任何有用的信息,我应该怎么做才能“打包”所有必要的东西并部署它。确实,有描述部署的页面 (How to Deploy a Symfony Application),但我发现它缺少以下信息:

  • 包含/排除什么(显然我不想打包dev 依赖项,部署composer 文件似乎也没有任何意义)
  • 要更改什么(有 .env 文件 - 包含 APP_ENVAPP_SECRET - 我在哪里使用这些值?)
  • 我的主机使用文件夹www 进行公开演示,在将public 目录重命名为www 之前是否必须更改/配置某些内容?
  • 我是否必须配置 .htaccess 以不通过 PHP 路由图像/css/js?

我目前的项目结构是:

+ bin
+ config
+ public
  + css
  - index.php
+ src
  + Controller
  - Kernel.php
+ templates
+ var
+ vendor
- .env
- .gitignore
- composer.json
- composer.lock
- symfony.lock

编辑(2018-07-17):

  • 我正在使用 git
  • 托管能够从名为production 的git 分支进行部署(每当我推送到此分支时,它都会调用composer install --no-dev
  • 配置公共目录名称在composer.json 中完成

composer.json 中的额外配置示例:

"extra": {
    "symfony": {
        "allow-contrib": false
    },
    "public-dir": "www"
}

关于我最初的问题 - 我现在使用 git 使用托管部署功能。在这种情况下,我确实需要作曲家文件。我最初的想法是构建和打包最少的东西,然后将此包部署到服务器。 (现在我还部署了bin、作曲家文件或.gitignore(可能还有更奇怪的东西)。

【问题讨论】:

  • 不确定,但是我应该提交vendorvar 目录的内容吗? (== 将依赖项放入我的 git 存储库 - 这对我来说听起来很奇怪)版本控制如何帮助我只选择运行网站所需的生产文件?这在任何地方都有描述吗?
  • 所以基本上你的意思是:1. 在服务器上安装 composer(不确定是否可能,我使用的是付费 PHP 托管,而不是任何 VPS),2. 克隆我的项目,3. 运行 composer install ...但它不会向服务器添加开发依赖项吗?这真的有必要吗?
  • @RiggsFolly: 绝对不是:/ ...但这不是重点,我可以在本地(以不同的路径)进行这个仪式,以准备在没有不需要的东西的情况下部署项目 - 但我不认为这种方法回答了我提出的所有问题。
  • 你能把你的web_dir改成public吗?您的主机上有什么服务器(nginx、apache 或两者)?您可以在主机上设置环境变量吗?您对托管服务器有 ssh 访问权限吗?你的主机上有 GIT 吗?对您的问题的回答很大程度上取决于您的托管服务提供商。
  • 通常我不会提交 vendor、var、.gitignore 文件/文件夹。在 Cloudways,我以简单的方式部署了 symfony:cloudways.com/blog/install-symfony-4-on-cloud

标签: php symfony package


【解决方案1】:

好吧,我会拍的。

要包含/排除的内容(显然我不想打包 dev 依赖项,并且部署作曲家文件似乎也没有 任何意义)

我注意到您没有.gitignore。如果你不使用 GIT(你应该)看看默认的 gitignore,它会告诉你哪些文件夹是你不需要的。

您是对的,供应商不是必需的。 Composer 的锁定文件包含您正在使用的确切版本。将文件复制到服务器后,只需执行composer install。 “部署”的最简单方法是使用 git(hub),并在您的服务器上设置一个 ssh 密钥,并授予它对您的 git repo 的读取权限。 (部署密钥)

要更改的内容(有 .env 文件 - 包含 APP_ENV 和 APP_SECRET - 我在哪里使用这些值?)

.env 文件默认只能在开发模式下工作。 (注意 composer.json 中的 require-dev 部分)。

Symfony 建议在生产环境中使用“真实”环境变量,但您可以使用.env 文件。为此,您必须在 composer.json 中将 "symfony/dotenv"require-dev 移动到 require。 (之后进行更新)

您还需要将 APP_ENV 设置为服务器上的 prod,同时配置 db access 和 mailer。

我的主机使用文件夹 www 进行公开展示,在将公共目录重命名为 www 之前我是否必须更改/配置某些内容?

我不会完全回答这个问题,那会花费太长时间。使用 VirtualHost 将 apache 配置为指向您的公共目录。更多内容:https://symfony.com/doc/current/setup/web_server_configuration.html

我是否必须将 .htaccess 配置为不路由图像/css/js 槽 PHP?

如果你安装了 apache 包,你会得到一个 .htaccess 文件,它会忽略文件。

# If the requested filename exists, simply serve it.
# We only want to let Apache serve files and not directories.
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]

这种方式请求的文件不会命中您的 PHP 代码。 但是,如果文件不存在,Symfony 将处理该请求。 我建议忽略常见的文件扩展名,例如:

# Do not allow image requests to hit symfony
RewriteCond %{REQUEST_URI} \.(gif|jpg|jpeg|png|ico|map)$ [NC]
RewriteRule .* - [L]

【讨论】:

  • web 文件夹也可以更改。检查这个symfony.com/doc/current/configuration/…
  • 你可以添加以 --no-dev 标志运行作曲家安装
  • 感谢您的回复!我更新了原始问题 - 我当然在使用 VCS :) ...我仍在努力理解对 .env 文件的依赖(如果未设置 ENV var,则 index.php 需要)。并感谢对静态文件的 mod 重写,这将很方便 :)
  • 您还应该有一个 .env.dist 文件(上面的目录中未显示),其中包含加载的 .env 文件的默认值。 dist 文件应该在你的仓库中,真正的 env 文件应该被忽略。在新服务器上安装它时,应将 dist 文件复制到 .env,并更改值以使用服务器的配置。 (在 git 中应该忽略 env 文件,因为它因每台机器而异)阅读:symfony.com/doc/current/…symfony.com/doc/current/configuration/…
【解决方案2】:

TL;DR

由于 PHP 不是一种编译语言,因此此处不涉及将代码编译为可执行文件的“构建”过程。

构建无状态容器

但是,如果您正在开发一个 Web 应用程序并且想要部署它,那么最好的方法(即行业标准)是从中“构建”一个无状态容器。在那个容器中,通常会有 Apache + PHP,或 Ngnix + PHP-FPM(甚至只是 PHP 和 PHP-PM)。这将是您的应用程序进程,通过端口 80 公开:一个漂亮、无状态且可扩展的 docker 容器。

在构建容器的过程中,您的想法是安装您选择的 PHP 版本(带有相关扩展)以及将通过 HTTP 端口运行的 Web 服务器或进程。然后,您使用 git 将代码拉入容器并设置环境变量,然后执行 composer install。结果将是一个包含应用程序版本的 docker 映像,可通过端口 80 访问。

更多关于 here.

嗯,不,我不做容器

当然,这可能不适合您,这取决于您的应用程序对the principles of a twelve factor app 的关注程度以及您将在何处托管它。

如果您想部署到共享主机,您需要更改主机提供商的文档根目录的public 文件夹。由于您无法访问共享主机中的 PHP 运行时,因此您需要复制 .env 文件并将其发送到网络主机(这是一种非常不安全的做法)。

要设置自动部署,您应该首选ssh。如果您没有控制台访问您的虚拟主机,那么git-ftp 可能是您最好的朋友。通过使用 webhook(例如在 Github 上),在接收后事件中,您将部署运行脚本的代码,该脚本将具有作曲家安装(具有锁定的依赖项)和所有内容到 www -data 用户(或网络服务器用户)。

现在,正确的答案

话虽如此,我会尽力回答你的一些问题:

  1. 你是对的。 vendor/ 应该远离。但是不是composer.lock。基本上,您必须部署存储库中的所有代码。

  2. 在您的部署脚本中(是的,您将拥有一个),您应该创建一个要添加的新 .env 文件。是的,您需要其中的所有参数,但显然需要生产环境的值。

  3. 是的,您应该将 symfony 的 public 文件夹重命名为 www。就我而言,你不应该遇到问题。也就是说,除非您使用 symfony 服务器进行开发。但是在您的项目中一个简单的php -S localhost:8000 -t www 就足以用于开发目的。我一直在使用它。

    1. 如果您使用的是 apache,是的,您应该在部署中包含一个 .htaccess。

您的更新

所以我看到您的主机具有 git 部署功能。那挺好的。在这种情况下,必须有一种方法可以在位于那里的 repo 中配置一个 post-receive 钩子。该 post-receive 可以执行任何 bash 命令,例如 composer install。但是,这将是 composer 可执行文件,但我不认为它会被包含在内。您可以做的是在您的托管根目录中上传composer.phar。它是作曲家,在一个可执行文件中。

然后,在您的 post-receive 钩子(也就是您的部署脚本)中,您将运行 composer install 和提到的 chown。

非请求建议

我了解您的要求是部署到虚拟主机。但是,您正在以一种不是当前行业标准的方式寻求 CI/CD 的好处。 Web 托管自然不是为部署管道而设计的。你现在这样做的方式可能会在未来给你带来一些痛苦,尤其是在添加一些其他支持服务或扩展等时......

现在,如果您的应用程序小而简单,您可能可以忽略我的话。

【讨论】:

  • 感谢您的发言!为了增加更多洞察力,我在 .NET 生态系统中生活了多年 - 编译、打包、打包总是(通常)包含最少的东西 - 没有开发依赖项,没有 .git,没有依赖元数据 - 只有二进制文件,也许还有配置文件......我'我对当前的解决方案很好,但我仍然对 composer install --no-dev 不满意 - 结果仍然臃肿。在 PHP 世界中这是正常的吗?我必须手动挑选东西吗?这个东西呢:github.com/dg/composer-cleaner
  • 你太担心这个了 :) PHP 不是一种编译语言,它没有二进制文件,所以你有原始的 php 文件在生产中......完全正常。
猜你喜欢
  • 2020-01-05
  • 2012-03-05
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 2012-11-27
  • 2013-10-23
相关资源
最近更新 更多