Canonical 多年来使用过各种内容管理系统,包括 Drupal 和 Zope,我们的大量网站都在 WordPress 上运行;事实上,现在仍然有很多网站是这样。我们的开发者门户就是这些标准的 WordPress 实例之一,对于一个流量不大的简单网站来说,它已经足够好用了,但我们开始觉得它不够用了。Ubuntu 手机 项目及其配套的应用程序开发 SDK 的发布意味着这个网站将开始受到更多关注——来自一个非常不同的受众——而且它需要做的事情也比现在多得多。
过去,在 WordPress 之上构建新功能对我们来说一直很困难,所以我们主要坚持使用 vanilla 安装提供的功能。这种方法已经无法满足需求了;我们有太多想做的事情,但根本做不到。当我们想添加 API 文档时,我们最终构建了一个基于 Django 的全新站点来完成这项工作,并且完全绕过了 WordPress 站点。
此外,我们对网站的可用性有了全新的要求。我们知道如何实现高可用性 (HA),但这意味着要从单个服务器实例迁移到云端,特别是迁移到我们的私有 OpenStack 云。为了有效地为中国用户服务,我们还必须在该国境内提供本地缓存服务器。这两者都将需要对支持该网站的基础设施进行彻底的改变。
最后,在所有众多新的技术要求中,还有一个社会要求。我们将在中国与魅族合作发布第二款手机,他们希望拥有针对和支持中国用户的应用程序。为了实现这一目标,我们将与中国移动合作举办一个应用程序开发者大赛和一系列研讨会。这意味着我们必须使整个网站除了英语之外,还要提供中文版本,这是 WordPress 无法开箱即用的功能。因此,我们开始寻找替代方案。
CMS 选项
在开源内容管理方面有很多选择,我们研究了我们能找到的尽可能多的选项。每种方案都有其优点和缺点,并且在简单性和功能之间有所取舍。我们考虑了从静态网站生成器到从头开始编写新程序,然后再回到原点。虽然没有完美的解决方案,但我们发现 DjangoCMS 在众多方案中脱颖而出。
WordPress 是我们进行功能比较的基准,而 DjangoCMS 提供了几乎所有相同的功能。DjangoCMS 提供了页面内容和导航的轻松管理、用户和组管理、WYSIWYG 编辑器(当使用 djangocms_text_ckeditor 时)以及博客系统(通过与 Zinnia 配对)。它还提供了标准 WordPress 没有的功能。首先是国际化支持,DjangoCMS 为页面内容和导航提供了开箱即用的支持。使用 Django 也意味着我们可以使用我们首选的数据库 PostgreSQL,而不是 MySQL。DjangoCMS 甚至提供了更广泛的权限和访问控制系统,允许不同的组管理网站的不同部分。
决定采用基于 Django 的方案对我们来说尤其有利,因为 Canonical 在使用 Django 和 Python 方面积累了大量的知识和经验,远远超过我们在 WordPress 和 PHP 方面的经验。我们甚至有用于 Django 模板系统的现有 Web 主题,以及 django_openid_auth,它允许我们使用 Ubuntu SSO 进行用户和组身份验证。我们的系统管理员也非常熟悉将基于 Django 的网站部署到
虽然 DjangoCMS 有很多优点,但它并非开箱即用的完美解决方案,我们必须进行更改才能使其按照我们需要的方式工作。例如,默认的文本插件会清理您输入的内容,因此如果您尝试添加 WYSIWYG 支持之外的原始 HTML,它会将您的标签 < > 转换为 < >。值得庆幸的是,DjangoCMS 支持添加自定义插件,并且创建一个 RawHTML 插件类型以在我们需要时使用它并没有花费太多精力。CMS 还要求我们为编辑器级别的用户设置一些额外的权限,这些权限在他们从 Ubuntu SSO 登录时未设置,因此我们必须向 django_openid_auth 添加一些回调来授予这些权限。
我们尚未克服的一个问题是图片插件缺少调整大小的选项,但这到目前为止只造成了轻微的不便。基于 Django 管理界面构建的管理界面在可用性方面也还有很多不足之处,特别是对于那些习惯了 WordPress 更完善的管理页面的人来说。但是内联页面编辑功能意味着我们不必经常进入管理界面。
事实证明,使用 DjangoCMS 正确完成高可用性比我们预期的要容易得多。我们知道我们将在 OpenStack 云上运行它的多个实例,因此我们需要它们都提供相同版本的媒体文件。默认情况下,Django 将静态文件和上传的媒体都存储在本地文件系统中,但这将意味着为页面上传的图像仅存在于其中一个前端实例上。幸运的是,Django 具有可配置的文件存储后端,并且使用 django-swiftstorage 作为后端让我们使用 Swift,OpenStack 的分布式对象存储服务(类似于 Amazon 的 S3),用于静态文件和上传的文件。最棒的是,DjangoCMS 插件和 Zinnia 博客引擎都可以与它一起使用,就像魔法一样。
在我们将所有部件组合在一起,调整配置并进行了一些代码更改之后,DjangoCMS 成为了我们之前 WordPress 系统的直接替代品。部署和迁移过程没有出现任何重大问题,我们很快就能够将目光转向使用新的自定义代码扩展网站的功能。我们已经添加了一个 Web 应用程序生成器表单,它可以为 Ubuntu 手机构建现成的应用程序包。最近,我们将单独的 API 文档网站合并回主站点,这使它们再次集中在一个地方,并且顺便说一句,通过利用 Swift 存储上传嵌入式图像,使 API 文档更加有用。
事实证明,DjangoCMS 恰好在简单性、灵活性和强大功能之间取得了平衡。DjangoCMS 是开源的、高度可配置的,并且构建在设计良好的平台之上,这使得我们很容易采用和扩展它。DjangoCMS 可以在本地运行以进行开发,在传统的服务器实例上运行,也可以使用 OpenStack 和 Juju 进行大规模部署。最棒的是,整个网站,包括特定于 developer.ubuntu.com 的部分,都是开源的,并且可供社区贡献。
CMS
本文是 The Open CMS column 专栏的一部分,由 Robin Muilwijk 协调。分享您使用开源内容管理系统 (CMS) 和平台(如 Drupal、Joomla、Plone、WordPress 等)的故事。
9 条评论