我是Symfony的新手,来自.NET世界。使用Symfony(4)文档,我设法创建了一个简单的网站。现在,我想将其投入使用,但是我正在努力寻找任何有用的信息,以便“打包”所有必要的东西并进行部署,该怎么做。确实,有描述部署(How to Deploy a Symfony Application)的页面,但是我发现它缺少有关以下信息:
dev
依赖项,并且部署composer
文件似乎也没有任何意义).env
文件-包含APP_ENV
和APP_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):
production
的git分支进行部署(每当我推送到该分支时,它将调用composer install --no-dev
)composer.json
中配置公用目录名称 composer.json
中的额外配置示例:
"extra": {
"symfony": {
"allow-contrib": false
},
"public-dir": "www"
}
关于我的原始问题-我现在正在使用git部署的托管功能。在这种情况下,我也需要作曲家文件。我最初的想法是构建并打包最少的东西,然后将此包部署到服务器。 (现在我仍然部署了bin
,作曲家文件或.gitignore
(甚至还有更多奇怪的东西)。
答案 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)
由于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服务器用户)。
话虽如此,我会尽力回答您的问题:
您是正确的。 vendor/
应该远离。但是不是composer.lock
。基本上,您必须部署存储库中的所有代码。
在部署脚本中(是的,您将拥有一个),应创建一个要添加的新.env文件。是的,您需要在那里的所有参数,但显然需要生产环境的值。
是的,您应该将symfony的public
文件夹重命名为www
。就我而言,您不应该遇到问题。也就是说,除非您使用symfony服务器进行开发。但是您的项目中简单的php -S localhost:8000 -t www
就足以满足开发目的。我一直都在用它。
所以我看到您的主机具有git部署功能。那很好。在这种情况下,必须有一种方法可以在位于此处的存储库中配置接收后挂钩。该接收后可以执行任何bash命令,例如composer安装。但是,这将是composer的可执行文件,但是我不认为这将包括在内。您可以做的是在托管根目录中上载composer.phar
。它是一个单独的可执行文件中的作曲者。
然后,在您的接收后钩子(又名您的部署脚本)中,您将运行作曲家安装程序以及提到的chown。
我了解您的要求是部署到虚拟主机。但是,您正在以非当前行业标准的方式寻求CI / CD的好处。 Web托管并非自然而然地设计用于部署管道。现在的操作方式可能会在将来给您带来麻烦,尤其是在添加其他一些支持服务或扩展等时。
现在,如果您的应用程序又小又简单,您可能会忽略我的话。