打包和部署Symfony网站

时间:2018-07-05 15:39:06

标签: php symfony package

我是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(甚至还有更多奇怪的东西)。

2 个答案:

答案 0 :(得分:7)

好吧,我会开枪。

  

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

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

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

  

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

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

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

您还将希望在服务器上将APP_ENV设置为prod,还配置数据库访问和邮件程序。

  

我的主机使用文件夹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]

答案 1 :(得分:4)

TL; DR

由于PHP不是编译语言,因此在这里将代码编译为可执行文件的“构建”过程不相关。

构建无状态容器

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

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

有关here的更多信息。

嗯,不,我不做容器

当然,这可能不是您要走的路,这取决于您的应用遵循the principles of a twelve factor app的数量以及您将在何处托管它。

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

要设置自动部署,您应该首选ssh。如果您没有控制台访问网络托管的权限,那么git-ftp可能是您最好的朋友。通过使用webhooks(例如在Github上),在接收后事件上,您将部署运行脚本的代码,该脚本除其他外将包含作曲家安装(具有锁定的依赖项)以及将所有内容打包到www -数据用户(或Web服务器用户)。

现在,给出正确的答案

话虽如此,我会尽力回答您的问题:

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

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

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

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

您的更新

所以我看到您的主机具有git部署功能。那很好。在这种情况下,必须有一种方法可以在位于此处的存储库中配置接收后挂钩。该接收后可以执行任何bash命令,例如composer安装。但是,这将是composer的可执行文件,但是我不认为这将包括在内。您可以做的是在托管根目录中上载composer.phar。它是一个单独的可执行文件中的作曲者。

然后,在您的接收后钩子(又名您的部署脚本)中,您将运行作曲家安装程序以及提到的chown。

不需要的建议

我了解您的要求是部署到虚拟主机。但是,您正在以非当前行业标准的方式寻求CI / CD的好处。 Web托管并非自然而然地设计用于部署管道。现在的操作方式可能会在将来给您带来麻烦,尤其是在添加其他一些支持服务或扩展等时。

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