我即将部署一个由 Django 提供支持的中型网站。我有一个专用的 Ubuntu 服务器。

我真的很困惑该使用哪个服务器软件。于是我心里想:为什么不问 stackoverflow。

我正在寻找的是:

  • 易于设置
  • 快速、轻松地利用资源
  • 可以提供媒体文件
  • 能够在同一服务器上提供多个 djangosites
  • 我宁愿不安装 PHP 或其他任何消耗资源的东西,而且我对它们没有用处。

我听说过 Apache、nginx 和 lighty 上的 mod_wsgi 和 mod_python。这些有哪些优点和缺点?我错过了什么人吗?

@巴里:不知怎的,我觉得 Apache 对我来说太臃肿了。那么替代方案呢?

@布莱恩利:好的,我会再看看 mod_wsgi 。但如果我用 lighty 提供静态文件,为什么还需要 Apache?我还设法用 lighty 来服务 django 应用程序本身。无论如何,这很糟糕吗?抱歉我这么愚蠢:-)

更新:lighty 和 nginx 怎么样——它们是完美选择时的用例?

有帮助吗?

解决方案

由于我正在寻找更深入的答案,因此我决定自己深入研究这个问题。如果我误解了什么,请告诉我。

一些一般建议是使用单独的网络服务器来处理媒体。我所说的单独是指不运行 Django 的网络服务器。该服务器可以是例如:

  • Lighttpd(轻)
  • Nginx(引擎X)
  • 或者其他一些轻量级服务器

那么,对于 Django,你可以走不同的路。您可以:

  • 通过以下方式为 Django 提供服务 阿帕奇 和:

    • 模组Python

      这是稳定且推荐/有据可查的方式。缺点:使用大量内存。

    • mod_wsgi

      据我了解,mod_wsgi 是一个更新的替代方案。它似乎在资源上更快、更容易。

    • mod_fastcgi

      当使用 FastCGI 时,您将 Django 的服务委托给另一个进程。由于 mod_python 在每个请求中都包含一个 python 解释器,因此它使用大量内存。这是绕过该问题的一种方法。此外还存在一些安全问题。

      您要做的就是在单独的进程中启动 Django FastCGI 服务器,然后通过重写配置 apache 以在需要时调用此进程。

或者您可以:

  • 服务姜戈 不使用 Apache 但对于另一台原生支持 FastCGI 的服务器:

    (文档提到,如果您没有任何 Apache 特定需求,则可以执行此操作。我想原因一定是为了节省内存。)

    • 莱特普德

    这是运行 YouTube 的服务器。它看起来快速且易于使用,但是我看过有关内存泄漏的报告。

    • nginx

    我看到基准测试声称该服务器甚至比 lighttpd 更快。不过,它主要是用俄语记录的。

另一件事,由于 Python 的限制,你的服务器应该以分叉模式运行,而不是线程模式。

这是我目前的研究,但我想要更多的意见和经验。

其他提示

我在用着 切罗基.

根据 他们的基准 (对它们持怀疑态度),它比 Lighttpd 和 nginx 更好地处理负载......但这不是我使用它的原因。

我使用它是因为如果你输入 cherokee-admin, ,它会启动一个新服务器,您可以登录该服务器(使用一次性密码)并通过精美的 webmin 配置整个服务器。这是一个杀手级的功能。它已经为我节省了 很多 的时间。它为我的服务器节省了大量资源!

至于 django,我将其作为线程 SCGI 进程运行。效果很好。切诺基也可以让它继续运行。再说一次,非常好的功能。

当前的 Ubuntu repo 版本非常旧,所以我建议您使用 他们的购电协议. 。祝你好运。

正如@Barry所说,文档使用 模组Python. 。我没有使用 Ubuntu 作为服务器,但在 Solaris 上使用 mod_wsgi 有很好的经验。您可以找到以下文档 mod_wsgi 和 Djangomod_wsgi 地点。

快速查看您的要求:

  • 易于设置 我发现 apache 2.2 相当容易构建和安装。
  • 快速、轻松地利用资源 我想说这取决于您的使用情况和流量。* 您可能不想使用 Apache 来服务器所有文件并使用 光TPD (lighty) 到服务器静态文件。
  • 可以提供媒体文件 我想你指的是图像、flash 文件?阿帕奇可以做到这一点。
  • 同一服务器上的多个站点 托管在 Apache 上的虚拟服务器。
  • 而不是安装其他扩展 注释掉 Apache 配置中不需要的任何内容。

官方推荐的部署 django 项目的方法是使用 mod_python 和 apache。这在 文档。 这样做的主要优点是它是记录最好、支持最多且最常见的部署方式。缺点是它可能不是最快的。

我认为最佳配置并不那么为人所知。但这里是:

  1. 使用 nginx 处理请求(动态到应用程序,直接静态内容)。
  2. 使用 python Web 服务器来提供动态内容。

基于 python 的 Web 服务器的两个最快速的解决方案是:

您需要在 google 上查找 django 当前的最佳配置(仍在开发中)。

我在用着 nginx (0.6.32 取自席德) 和 mod_wsgi. 。它工作得很好,但我不能说它是否比其他选择更好,因为我从未尝试过。Nginx 有 内存缓存 内置支持,也许可以与 Django 缓存中间件进行互操作(我实际上并没有使用它,而是使用 python-memcache 手动填充缓存,并在更改时使其失效),因此缓存命中完全绕过 Django(我的开发机器每秒可以处理大约 3000 个请求)。

警告:nginx' mod_wsgi 非常不喜欢命名位置(它试图将它们传递给 SCRIPT_NAME),所以显而易见的‘error_page 404 = @django’会导致许多难以理解的错误。我必须修补 mod_wsgi 源来解决这个问题。

我也很难理解所有的选项。在 这篇博文 我发现 mod_wsgi 与 mod_python 相比有一些好处。

小型 VPS 上的多个低流量站点使 RAM 消耗成为主要问题,而 mod_python 似乎是一个糟糕的选择。使用 lighttpd 和 FastCGI,我成功地将一个简单 Django 站点的最小内存使用量降至 58MiB 虚拟内存和 6.5MiB 常驻内存(在重新启动并服务单个非 RAM 密集型请求之后)。

我注意到,在 Debian Etch 上从 Python 2.4 升级到 2.5 使 Python 进程的最小内存占用增加了几个百分点。另一方面,2.5 更好的内存管理可能会对长时间运行的进程产生更大的相反影响。

把事情简单化: Django 推荐 Apache 和 mod_wsgi(或 mod_python). 。如果提供媒体文件是您服务的重要组成部分,请考虑 Amazon S3 或 Rackspace CloudFiles。

在我看来,最好/最快的堆栈是 varnish-nginx-uwsgi-django。我正在成功使用它。

如果您使用 lighthttpd,您还可以使用 FastCGI 来为 Django 提供服务。我不确定速度与 mod_wsgi 相比如何,但如果内存运行正常,您将获得 mod_wsgi 所获得的一些好处,而 mod_python 则无法获得这些好处。主要的一点是,您可以为每个应用程序提供自己的进程(这对于保持不同应用程序的内存分离以及利用多核计算机确实很有帮助。

编辑:只是补充一下关于 Nginix 的更新,如果内存再次正常工作,Nginix 使用“greenlet”来处理并发。这意味着您可能需要更加小心,以确保一个应用程序不会耗尽服务器的所有时间。

我们使用 nginx 和 FastCGI 进行所有 Django 部署。这主要是因为我们通常部署在 Slicehost,并且不想将所有内存捐赠给 Apache。我想这将是我们的“用例”。

至于有关文档的评论大部分是俄语的——我找到了关于的大部分信息 英文维基 非常有用且准确。该站点也有 Django 的示例配置,您可以从中调整自己的 nginx 配置。

有很多方法可以做到这一点。因此,我建议仔细阅读 DjangoAdvent.com 上与部署过程相关的文章:Eric Florenzano - 使用 FastCGI 部署 Django: http://djangoadvent.com/1.2/deploying-django-site-using-fastcgi/ 也读:Mike Malone-缩放Django Stochastictechnologies博客:完美的Django设置Mikkel Hoegh博客:35 % 响应时间改进-切换-uwsgi-nginx

问候

我收到关于使用 Cherokee 的警告。当您对 Django Cherokee 进行更改时,它会维护旧进程,而不是终止它并启动一个新进程。

关于 Apache 我强烈推荐这篇文章。

http://www.djangofoo.com/17/django-mod_wsgi-deploy-exampl

它易于设置,易于在更改后终止或重置。

只需在终端输入

sudo /etc/init.d/apache2 restart

并且变化立即可见。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top