0

为了开发我们的 Django Web 应用程序,我想转移到一个自治系统,该系统会自动更新应用程序临时副本的源(来自 VCS),该应用程序的属性与应用程序的实时版本几乎相同。SO #625256上已经介绍了这样做的一般想法。Django 文档还讨论了设置虚拟主机以在同一个 Apache 上托管 2 个 Django 实例。我需要设置的许多部分已经到位。

我的具体问题是——如果此设置将在 Windows Server 2000 下运行,我应该选择什么服务器软件?

Apache+mod-wsgi 似乎是自然的选择,但根据Graham Dumpleton mog-wsgi 的这篇博客文章,在 Windows 上运行的 Apache 无法重新加载它的单个进程,需要重新启动整个 Apache 服务。这是不行的,因为我不希望实时站点在我们更新登台代码时退出。

对于这种情况,服务器软件的最佳选择是什么?

  1. 维护 2 个可以独立重启的 Apache 副本(这感觉很糟糕)
  2. 迁移到 Apache 以外的东西?
  3. ???
4

2 回答 2

2

使用 Apache 时,Windows 上没有“单个进程”,只有一个 Apache 工作进程。此外,Windows 上也没有守护程序模式。无论如何,这一切都意味着两个 Django 实例确实在一个进程中运行,尽管在不同的子解释器中。所以是的,导致重新加载一个 Django 站点的代码将对另一个站点产生影响,因为它们处于同一进程中。

如果一个在 UNIX 系统上,则可以向工作/守护进程发送终止信号,并且它们将重新启动,而无需重新启动整个 Apache。在 UNIX 上,即使在与接受 HTTP 请求的端口的侦听器套接字相同的进程中的多个站点始终保持打开状态,这也不会过度导致问题,因此在重新启动期间到达的后续请求只会排队并处理一次工作/守护进程再次运行。

在 Windows 上,当您正确选择整个 Apache 时,必须重新启动。这意味着在很短的时间内,侦听器套接字将被关闭,并且会有一个小窗口,请求将导致连接失败。这是一个多长时间的窗口,你真的需要做一些测试。通常这不是一个大问题,因为足够短以至于请求在那个精确时刻命中的概率很低。换句话说,如果您只谈论暂存环境,因为它不会经常重启,您可能会过度担心。如果您试图在同一个 Apache 实例上运行开发站点,那么这将是一个问题。

话虽如此,如果您希望暂存实例尽可能接近生产,那么仍然需要运行 Apache,因此不同端口上的多个 Apache 实例将是唯一合乎逻辑的解决方案。您可以在 CherryPy WSGI 服务器或粘贴 WSGI 服务器上运行 Django 并代理到它,但它是一个不同的托管系统,并且会表现出不同的程度,以至于您可能不会发现在生产设置时最终会出现的问题。

总而言之,我建议您实际上进行一些测试,在这些测试中针对 Apache 运行基准测试并同时执行重新启动,看看有多少请求因此失败。这将帮助您了解这是否是您认为的大问题。

于 2009-11-06T03:49:36.900 回答
1

默认情况下,Django 会话是持久的和数据库支持的。重启网络服务器不会中断会话;当服务器恢复时,用户将像以前一样继续。重新启动后,cookie 提供会话密钥,数据库调用会话变量,我们继续进行不间断。

http://docs.djangoproject.com/en/dev/topics/http/sessions/

如果您担心会话被劫持,请缩短到期时间,在关闭浏览器的情况下销毁 cookie,并定期从数据库中清除过期会话。

至少我是这么读的。

我会坚持使用最常见的实现,因为这会让您获得最大的支持。我希望这是 unix 上的 apache+mod_wsgi。三分之二将不得不做。显然,登台和生产连接到同一个数据库。

你引起了我的兴趣,因为我正在考虑在另一个域名下建立一个“暂存”部署,所以在我们完成所有测试并准备好备用之后,我们只需将 apache conf 中的“servername”变量交换为上线。通过优雅的重启,我希望用户不会注意到它......除了突然出现的所有新功能:-)

于 2009-11-06T10:00:30.440 回答