什么是最佳的Drupal部署策略?

53

我正在我的 MacBook 上使用 XAMPP 开展我的第一个 Drupal 项目。这是一个原型,并且得到了客户的积极反馈。

两周后我将在 Linux VPS 上部署该项目。除了从头开始重新做一遍,有更好的方法吗?

  • 安装 Drupal
  • 下载模块(CCK、Views、Date、Calendar)
  • 创建内容
  • ...

谢谢


3
问题37已上升,34被加星了,答案39已上升,现在作为话题关闭......这个问题被问了3年之后。无言以对。 - ohho
1
这个问题可能应该移至Drupal.SE - dotancohen
9个回答

54

一些技巧:

  • 使用源代码控制而非FTP等方式处理文件。不论您使用什么,我们倾向于为每个客户启动一个Unfuddle.com子版本控制帐户,以便他们有一个记录错误的地方,但至关重要的第一步是将网站的完整源代码树置于版本控制中。当在测试服务器或预发布服务器上进行更改时,您可以查看它们是否起作用,然后提交,然后在运行服务器上进行更新。回滚和部署变得简单多了。对于多个Web头的集群,您可以重复该过程,或从单个'规范'服务器rsync。

  • 如果您使用SVN,则还可以使用Drupal和其他模块/主题的CVS检出,而SVN/CVS元数据将能够愉快地共存。

  • 对于文件夹之类的庞大文件夹,如文件目录,请在“适当”的位置使用符号链接指向Webroot外部的服务器端目录。这使得您的源代码控制存储库包括所有代码和符号链接,而不是所有代码和所有用户上传的文件。

  • 数据库更棘手;清理开发/预发布数据库并将其推送到生产环境最容易进行初次推出,但在增量数据库更新时进行操作时,如果生产环境的用户也正在生成内容,则存在一些问题。

去年我做了一个关于Drupal部署最佳实践的演示。随时欢迎查看幻灯片。


感谢您的建议!实际上,在提问之前我已经看过您的演示;-)我一直在寻找替代方案并尝试各种建议。我的VPS供应商建议了另一种选择:虚拟设备 + rsync + SQL dump/restore对此与CVS方式相比有何评论呢? - ohho
rsync可以完美运行,尽管我参与的大多数项目都涉及到分布式团队,其中SVN/CVS作为中央同步机制不仅有助于部署时,而且也需要使用SQL dump/restore方法在“上线”时将数据库推送出去,但是其他方法则需要用于后续更新。 - Eaton
非常好的演示,Eaton。谢谢! - Leandro Ardissone
有没有办法为这个演示文稿找到音频素材? 它看起来非常好,但仅通过观看PPT无法理解每个选择 :) - Michael De Keyser
我同意。我有一个图表可以无缺地工作于代码中。下一个问题是数据库部署! - Andy

21

Features.module是管理Drupal配置更改的强大工具。

内容类型、CCK设置、视图、Drupal变量、上下文、Imagecache预设、菜单、分类法和权限都可以被整合进一个特性中,并且可以被提交到版本控制。从那里,使用Features UI或Drush轻松地管理部署新网站或推送更改到现有网站。

确保安装Strongarm.module以导出存储在变量表中的drupal配置。还可以通过安装uuid_features.module将静态内容/节点(例如:关于我们,常见问题等)放入Features中。

毫不夸张地说,这是与其他开发人员在同一网站上工作的最佳方式,也是将您的网站从开发移动到测试、暂存和生产的最佳方式。


这是我要走的路。我认为这是最现代的解决方案。Drush + Features + Subversion。我还在研究Hudson、Jenkins和Phing,因为我在Drupal社区中看到了它们的提及。 - Tony Topper

16
我们在工作场所进行了广泛讨论,最终我们采用从开发到暂存,再到生产环境推送代码更新(包括模块和主题)的方式。 我们使用Subversion进行此操作,并且目前效果很好。
特别重要的是您需要自动化一个从生产环境回传数据库的过程,以便开发人员可以将其数据库副本尽可能接近生产环境。 在关键任务环境中,您要确保模块更新不会破坏您的数据库。 我们使用的过程如下:
  1. 在开发服务器上安装模块。
  2. 记录所需的任何更改和更新。 如果出现任何问题,请还原并重新执行,直到您拥有稳定、无误差的过程为止。
  3. 测试您的更改! 以正常登录用户身份和匿名用户身份重复您的测试过程。
  4. 如果更新过程涉及运行update.php以外的任何事项,则编写脚本来执行它。
  5. 将生产数据库复制到您的暂存服务器,并立即执行相同的步骤。 如果失败,请诊断故障并返回第1步。 否则,请继续。
  6. 测试您的更改!
  7. 备份您的生产数据库并记录您从SVN检出的修订版本。
  8. 将您的生产Drupal置于维护模式,对您的生产树运行“svn update”,然后执行您的更新过程。
  9. 将Drupal从维护模式中退出并测试所有内容(作为管理员、普通用户和匿名用户)。
这就是全部。 对于像Drupal这样的社区框架,您永远无法真正期望能够在上线后将数据库从测试环境移动到生产环境。 从那时起,所有数据库移动都来自生产环境到测试环境,这在部署过程中会增加一些复杂性。 要小心! :)

请确保匿名化数据库,否则您将从开发版本向真实用户发送通知。 - dresh

5

我很惊讶没有人提到部署模块。以下是其项目页面的摘录:

……旨在允许用户轻松地将内容从一个Drupal网站传输到另一个。Deploy自动管理实体之间的依赖关系(如节点引用)。它被设计为具有丰富的API,可以轻松扩展以在各种内容分期情况中使用。


在 @Eaton 的演示中,它被隐含地提到了。 - viam0Zah

5
我们广泛使用功能模块来捕获功能,然后在生产站点上轻松安装它们。

2
任何版本控制系统(GIT,SVN)+ 特性模块来部署Drupal代码 + 自定义设置(内容类型、自定义字段、模块依赖、视图等)。
由于部署模块仍处于开发模式,因此您可能希望使用Drupal 7中的节点导出模块来部署您的内容/节点。

2

我不熟悉Drupal,但我经常使用Joomla。我通过将网站根目录中的所有文件打包(在我的情况下是tar和gzip,但您也可以使用zip),然后上传并解压缩该归档文件来部署。然后我会进行SQL转储(mysqldump -u用户-h主机-p数据库名称> dump.sql),上传该文件,并使用反向命令插入数据(mysql -u produser -h prodDBserver -p prodDatabase < dump.sql)。如果您没有Shell访问权限,则可以逐个上传文件并编写PHP脚本以导入dump.sql。


嗨,Richard,你能否详细解释一下这个问题!我仍在努力寻找最佳实践。谢谢。 - jtanmay
5
这在拥有用户生成内容的网站上无法实现,因为用户生成内容将被开发站点的副本覆盖。 - Tronathan
1
-1 是为了 Richard Finn,+100 是为了 Tronathan。 - Mark E. Haase

0
我发现并正在实施的一个好策略是使用deploy模块来迁移我的内容,然后结合drush和dbscripts来合并和更新核心和模块。即使您有实时内容、安全性和模块更新,它也会处理数据库合并,而且我目前已将其设置为与svn配合使用。

0

如果您是部署(或Drupal)的新手,则务必一次性完成所有操作。在您正在处理另一个副本时,当用户影响内容时,您必须非常小心。

可以保留与实际内容、分类法、用户等相关的表,而不是它们的结构。然后推送与配置相关的表。但是,这将增加一个数量级的复杂性。

如果部署对您来说是老生常谈的问题,则此处可能有些冒犯,请见谅。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接