Django的最干净且最快的服务器设置方式是什么?

47

我将要部署一个由Django提供支持的中等规模网站。我有一台专用的Ubuntu服务器。

我对于使用哪种服务器软件感到非常困惑。所以我想:为什么不问stackoverflow呢。

我正在寻找:

  • 易于设置
  • 快速且资源消耗少
  • 可以服务媒体文件
  • 能够在同一服务器上提供多个Django站点
  • 我宁愿不安装PHP或其他占用资源并且我不需要的东西。

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

@Barry:我感觉Apache对我来说太臃肿了。其他选择怎么样?

@BrianLy:好的,我会更多地了解mod_wsgi。但是如果我使用lighty提供静态文件,为什么还需要Apache?我已经成功使用lighty提供了Django应用本身。这样做有什么问题吗?抱歉我这么蠢:-)

更新:Lighty和Nginx怎么样 - 这些是什么情况下的完美选择?

13个回答

27
自己寻找更深入的答案后,我决定自己深入研究这个问题。如果我有任何误解,请告诉我。
一些常规建议是使用单独的Web服务器来处理媒体。这里的“单独”是指不运行Django的Web服务器。例如:
- Lighttpd (Lighty) - Nginx (EngineX) - 或其他轻量级服务器
然后,对于Django,你可以选择不同的路径。你可以:
- 通过Apache服务Django并且: - 使用mod_python - 这是稳定、推荐/文档完善的方法。缺点:占用大量内存。 - 使用mod_wsgi - 据我了解,mod_wsgi 是一种更新的替代方法。它似乎更快,资源消耗更低。 - 使用mod_fastcgi - 当使用FastCGI时,你将把 Django 的服务委托给另一个进程。由于 mod_python 在每个请求中都包括一个 Python 解释器,所以它会占用大量内存。这是一个避开该问题的方法。但需要注意一些安全问题。你需要在一个单独的进程中启动 Django FastCGI 服务器,然后通过重写配置 Apache 在需要时调用此进程。
或者你可以:
- 不使用Apache,但使用另一个原生支持FastCGI的服务器服务Django,例如: - Lighttpd - 这是运行Youtube的服务器。它似乎快速易用,但我听说过有关内存泄漏的报告。 - Nginx
  • 我看过一些基准测试,声称这个服务器甚至比lighttpd更快。不过大多数文档都是用俄语写的。

另外,由于Python的限制,您的服务器应该在分叉模式下运行,而不是线程模式。

这就是我的当前研究,但我希望得到更多的意见和经验。


4
mod_python模块不需要消耗更多的内存。认为它会这样做已经成为一种城市传说,实际上人们遇到的内存问题是由于mod_python/Python的安装方式和Apache的配置方式造成的。第一个问题是在过去Python通常没有安装共享库,这意味着mod_python必须静态链接它,导致使用本地内存进行地址重定位。另一个问题是人们使用prefork,这对于PHP来说很好,但对于Python来说效果很差。 - Graham Dumpleton

9

我正在使用Cherokee

根据他们的基准测试(但要谨慎对待),它比Lighttpd和nginx都更好地处理负载... 但这不是我使用它的原因。

我使用它是因为如果你键入cherokee-admin,它会启动一个新的服务器,你可以登录(使用一次性密码)并通过一个漂亮的Webmin配置整个服务器。这是一个杀手级功能。它已经为我节省了很多时间。而且它正在为我的服务器节省很多资源!

至于Django,我正在作为线程化的SCGI进程运行它。效果很好。Cherokee也可以让它保持运行。再次非常好的功能。

当前的Ubuntu存储库版本非常老旧,所以我建议你使用他们的PPA。祝你好运。


6

正如@Barry所说,文档使用mod_python。我没有在Ubuntu上作为服务器使用过,但在Solaris上使用mod_wsgi有很好的经验。您可以在mod_wsgi网站上找到mod_wsgi和Django的文档。

您要求的快速概述:

  • 易于设置 我发现 Apache 2.2 构建和安装相当容易。
  • 快速且资源消耗低 我认为这取决于您的使用情况和流量。 * 您可能不想使用 Apache 服务器来提供所有文件,并使用 LightTPD(lighty)来提供静态文件。
  • 可以提供媒体文件 我假设您指的是图像、Flash 文件?Apache 可以做到这一点。
  • 同一服务器上的多个站点 在 Apache 上进行虚拟服务器托管。
  • 不想安装其他扩展 在 Apache 配置中注释掉您不想要的任何内容即可。

我有一个这样的设置 - 我使用mod_wsgi来服务站点的大部分内容,但有Alias指令强制Apache处理从/media和/admin_media提供静态文件。鉴于我们正在谈论一个“中型站点”,可能没有必要去纠缠于“更简单”的替代方案。 - Sean McSomething

5

官方推荐使用mod_python和apache来部署django项目。这在文档中有详细描述。优点是这是最好记录、最受支持和最常用的部署方式。缺点是它可能不是最快的。


2
尽管 #django freenode 上的 Django 支持社区认为文档已经过时,但官方推荐的方式是使用 mod_wsgi。 - temoto
我在Apache上无法运行它,尝试了很多次,也没有找到很好的支持,教程只展示了一部分。看来你必须成为一个Apache专家。我建议使用带有Eventlet的Nginx/Gunicorn或使用套接字的Nginx/uWSGI。两者都非常好用且易于配置! - radtek

3
我认为最佳配置并不是很清楚,但是以下是:

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

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

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


2

在我看来,最好/最快的技术堆栈是varnish-nginx-uwsgi-django。 我目前已经成功地使用它。


2
有多种方法和途径可以实现这个目标。因此,我建议仔细阅读与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
敬礼

2

+1. 推荐使用Apache + mod_wsgi。不过缺少有关这些声明的链接。 - muhuk
2
配置Apache并不比Nginx/Lighttpd简单。 - temoto

2
我正在使用 从Sid获取的(版本为0.6.32)与mod_wsginginx。它运行得非常好,尽管我不能说它比其他选择更好,因为我从未尝试过其他选择。Nginx内置了memcached支持,可以与Django缓存中间件进行交互(实际上我并没有使用它,而是使用python-memcache手动填充缓存,并在进行更改时使其失效),因此缓存命中完全绕过了Django(我的开发机器每秒可以提供约3000个请求)。
一个注意事项:nginx的mod_wsgi不喜欢命名位置(它试图将它们传递到SCRIPT_NAME中),因此显然的“error_page 404 = @django”会导致许多晦涩的错误。我不得不修补mod_wsgi源代码来解决这个问题。

2

我也很难理解所有的选项。在这篇博客文章中,我发现了一些比较mod_python更好的mod_wsgi的优点。

在小型VPS上运行多个低流量网站时,RAM消耗是主要问题,而mod_python似乎不是一个好的选择。使用lighttpd和FastCGI,我已经成功将简单Django网站的最小内存使用量降至58MiB虚拟和6.5MiB常驻(在重新启动和服务单个非RAM重负载请求后)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接