【问题标题】:Symfony 1.4 best practice production & development configurationSymfony 1.4 最佳实践生产和开发配置
【发布时间】:2011-10-05 12:06:32
【问题描述】:

我刚刚开始使用 Symfony。

我使用 Git/github 作为管理项目的一种方式。我为日志和缓存设置了两个忽略,这很好。

我现在需要建立一个生产站点。目前,在这个小项目中,我在同一台服务器上开发和生产,但文件位置和数据库不同。

例如

www.example.com/mysymfonyproject_dev/  < development area
&
www.example.com/mysymfonyproject/      < Live / Production site

在服务器上它的/homes/sites/example.com/www/mysymfonyproject_dev & /home/sites/example.com/www/mysymfonyproject

所以现在我已将我的项目克隆到新的生产文件夹。
它当然会忽略日志和缓存文件夹,但现在我需要更改 database.yml 文件,并且可能需要更多以使生产区域正常工作。

处理这个问题的最佳方法是什么?
是否有其他文件我应该添加到.gitignore,可以说明该站点的版本,例如开发或生产。

或者有没有其他方法可以在不使用 git 的情况下做到这一点?

最佳做法是什么?

您可以想象,我不想在每次对生产站点执行 git push 时都更新 database.yml 文件。

更新:

我有一个开发环境。我正在寻找的是部署到生产的分步指南。我可以使用 git 来做到这一点,但例如,我该如何设置环境,以便在部署时所有设置都正确。我确实看到 database.yml 可以有不同的登台和生产设置,但是我在哪里告诉 symfony 哪个站点是什么?就像 symfony 怎么知道 www.example.com/kickboxing 是生产而 www.example.com/kickboxing_dev 是登台?

更新 2:

最后,对于我的具体要求,这似乎运作良好。

1 <?php                                                                                                                          
2 
3 
4 require_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php');
5 
6 $theurl = explode('/', $_SERVER['PHP_SELF']);
7 $mydir = $theurl[1];
8 
9 
10 if ($mydir == "mysymfonyproject")  //live
11 {
12     $configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'prod', false);
13     sfContext::createInstance($configuration)->dispatch();
14 }
15 else // dev 
16 {
17     $configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'dev', true);
18     sfContext::createInstance($configuration)->dispatch();
19 }

我认为在您可以配置主机文件的本地机器上使用 $_SERVER['SERVER_NAME'] 会更好,例如mysymfonyproject.local 只需添加到索引文件中,然后 git 存储库就可以了,所有文件都是可移植的。

【问题讨论】:

  • Symfony 是环境感知的,你为什么不在 symfony 配置文件中设置环境?
  • 我绝对可以,这就是为什么我要问这个问题,我该如何做到这一点,以及在我的设置下什么是最佳实践。
  • 你看过 symfony 的“入门”指南和“symfony 的简单介绍”吗?如果您遇到任何具体问题,我会很乐意提供帮助,但您现在所问的问题在官方文档中已经解释得很清楚了。 symfony-project.org/doc/1_4
  • 抱歉,我可能遗漏了一些东西,诚然,我还没有完整地阅读所有内容,但是在这两个简短的指南中,它在哪里解释了设置环境?

标签: git deployment symfony1 doctrine


【解决方案1】:

既然你更新了你的问题,我可以给你一些相关信息。

正如您现在所知,您在 symfony 中有一个级联配置系统,它允许不同的参数,例如您的开发和生产环境的数据库连接(以及许多其他内容)。

关于部署,symfony 自带一个任务,就是利用 rsync 来部署。一般来说,您不需要对其进行太多调整,默认情况下它不会部署任何“开发”前端控制器,因此它适合大多数基本需求。请注意,即使部署脚本应该完全排除 dev 前端控制器的部署,e 即使你会部署它们,它们默认也有一个小的安全检查,只允许从本地主机访问。如果需要从部署中排除其他文件,可以编辑 config/rsync_exclude.txt

在此处部署的详细信息: http://www.symfony-project.org/gentle-introduction/1_4/en/16-Application-Management-Tools#chapter_16_deploying_applications

但要注意的是,此部署脚本不处理数据库部署。您应该手动执行此操作。如果您需要将数据库更改部署到现有数据库,您也可以手动操作,或查看 Doctrine Migrations(假设您使用 Doctrine)。

更新:您可以为不同的应用程序和/或环境使用一个前端控制器 (index.php)。您可以检查主机名或其他内容,但我发现并采用的最简洁的解决方案是设置 Apache 环境变量。在我的 Vhost 配置中,我会这样做:

<VirtualHost *:80>
  Servername www.myproject.dev
  ...
  SetEnv SYMFONY_APP frontend
  SetEnv SYMFONY_ENV dev
  SetEnv SYMFONY_DEBUG 1
</VirtualHost>

请注意,我当然会为每个应用程序/环境组合使用单独的 Vhost。你不应该部署虚拟主机配置,所以通常你只需要在每台主机上设置一次。我修改后的 index.php 是这样的:

<?php

require_once dirname(__FILE__) . '/../config/ProjectConfiguration.class.php';

$app = isset($_SERVER['SYMFONY_APP']) ? $_SERVER['SYMFONY_APP'] : 'frontend';
$env = isset($_SERVER['SYMFONY_ENV']) ? $_SERVER['SYMFONY_ENV'] : 'prod';
$debug = isset($_SERVER['SYMFONY_DEBUG']) ? $_SERVER['SYMFONY_DEBUG'] : false;

$configuration = ProjectConfiguration::getApplicationConfiguration($app, $env, $debug);
sfContext::createInstance($configuration)->dispatch();

通过这个设置,我可以从我的存储库中删除 frontend_dev.php 和除 index.php 之外的任何其他前端控制器。

【讨论】:

  • 谢谢,我想我的问题是在这种情况下如何使用 git 管理环境。此人说明了可能的黑客攻击 (4pmp.com/2010/10/…)。真的很难我认为最好的选择是在 index.php 中编写一些条件来查看 url 并根据它设置环境,例如localhost 或 example.com/mysymfonyproject_dev 设置为“dev”,example.com/mysymfonyproject 设置为“live”,对于 dev 和 live 的不同域当然可能比仅域中的文件夹更好。
  • 我不明白为什么您需要在 Git 中进行 hack,或者您是否有多个具有不同配置的开发环境。也就是说,您确实可以更改 index.php,我个人使用 Apache 环境变量来设置应用程序/环境,请参阅我的更新回复。
  • 我真的很喜欢你使用 apache 环境变量的方式。谢谢会使用我认为的类似的东西。是的,我确实有多个开发领域。我的本地 mac,其他开发人员的本地窗口,登台服务器和 live。谢谢你的建议。
【解决方案2】:

在生产服务器上,最佳做法是:

  • 除了在 prod 中运行应用程序绝对需要的工具之外,不要使用任何工具
  • 在预生产环境中准备部署的产品,访问权限比生产环境更开放。

但在您的情况下,很可能没有预生产环境,并且访问权限不是问题,Git 可能是有意义的。

在这种情况下,我建议通过将实际值保存在VCS 存储库之外来处理配置文件。

然后您可以利用内容过滤器在结帐时构建actual database.yml values
'smudge' 脚本(在您的存储库的 .gitattributes 文件部分中声明)可以检测它在哪个环境中执行,并选择适当的源以获得构建文件的正确值。
详情请参阅“Git Config excludesfile for just a branch”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多