0

这个问题的演变

这开始是为了寻找在 Linux 上运行 Django、通过 Django-PyODBC 访问 SQL Server 以及像在 Windows 上运行 Django 一样有效地支持 Unicode 的其他建议。

在未能为 Linux 中的 ODBC 驱动程序提供与 Windows ODBC 驱动程序相同级别的 Unicode 支持的良好解决方案之后;这个问题变成了应对在 Windows 中没有 Apache 守护程序模式的负面影响。

问题

如果在 Windows 上运行 Apache+mod_wsgi,每次部署新的 Django 代码时都需要重新启动 Apache 服务器。有关原因的详细信息,请参阅格雷厄姆的回答

当您可能需要重新启动 Apache,拒绝服务直到它完全重新启动时,如何运行一组可靠的应用程序和服务?

问题

我们使用 SQL Server 2005,我们需要支持Microsoft Office 应用程序中生成的unicode 字符和某些字符(如smart-quotes )。

在 SQL Server 2005 上运行 Django 需要我们使用 Django-PyODBC。它在 Windows/Linux/Mac OS X 上运行良好;但是,如果您需要 unicode 支持,那么您在 Linux / Mac OS X 上就不走运了 - Unix 中 SQL Server 的 ODBC 驱动程序处于 unicode 合规性的不同阶段。如果您指定客户端字符编码为 UTF-8 (*),则开源驱动程序FreeTDS适用于某些字符;但不支持所有字符。

在我们的测试中,在 Windows 2003 上运行 Django 并使用 Microsoft ODBC 驱动程序允许我们正确插入/更新/选择几种不同语言的任何字符,以及 Office 应用程序中的 Microsoft 智能字符。

但是在 Windows 上运行意味着每次我们部署新代码时都需要重新启动 Apache——这意味着几秒钟内没有服务。


(*) 坦率地说,我们设法让 FreeTDS 接受某些字符的唯一方法是在client charsetfreetds.conf 中添加一个条目:

[a_db_server]
    host = a_db_server
    port = 1433
    tds version = 8.0
    client charset  = UTF-8
4

2 回答 2

2

关于在使用 Apache/mod_wsgi 时在 Windows 上重新加载,请阅读我对以下内容的回复:

Django live/staging 的服务器软件选择

于 2009-11-11T21:32:20.300 回答
0

接受自己的答案可能是不好的形式,但它适合我们的情况,它可能会帮助其他人......


首先也是最重要的:我们放弃了寻找可以与 PyODBC 一起正常工作并像 Microsoft 原生 ODBC 驱动程序一样支持 unicode 的 ODBC 驱动程序。FreeTDS 部分工作,并且一些商业驱动程序在我们的测试中并没有削减它。我们考虑了一个 ODBC-JDBC 桥,但从未真正测试过它。

我们也考虑过使用ODBC 路由器,但考虑到多用户解决方案的价格、更复杂的可能性以及 Django 应用程序的低负载场景;我们决定坚持在 Windows 上运行 Django,并尝试应对每次部署任何 Django 应用程序的新版本时重新启动 Apache 服务器的要求。

我们为应对 Apache 重启并仍然提供服务可用性所做的工作:

  • 我们将Apache 服务器作为代理/负载平衡器部署到(目前)在 Windows 上运行的两台 Apache 服务器的集群中
  • 在集群中的每个 Windows Apache 服务器上,我们都在运行所有 Django 应用程序
  • 当必须将新代码部署到服务器时,我们:
    • 通过 Apache 的 balancer-manager 接口禁用集群中的一台服务器
    • 应用更新并在禁用的服务器中安装任何新的 Django 应用程序
    • 在禁用的服务器中测试修改
    • 通过 Apache 的 balancer-manager 接口重新启用集群中的服务器
    • 对第二台服务器执行相同的步骤

只要启用并运行集群中的一台服务器,我们的用户就可以使用应用程序和服务 - 不会中断。同时我们获得了一些负载平衡(在我们的例子中,我们此时真的不需要它)。

代理 Apache 服务器会重写所有重定向和 cookie 响应标头,因此只要人们通过代理访问服务,就不需要对 Django 代码进行任何修改。

于 2009-11-13T18:55:49.493 回答