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 配对)。它还提供了 stock 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 条评论