最干净和最快的服务器设置Django的

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

我真的很困惑要使用哪个serversoftware。 所以我认为自己:为什么不问stackoverflow。

我在找什么是:

  • 易于设置
  • 快速简单的资源
  • 可以提供媒体文件
  • 能够在同一台服务器上提供多个djangosite
  • 我宁愿不安装PHP或其他任何吸收资源,而我没有用。

我听说过Apache,nginx和lighty上的mod_wsgi和mod_python。 这些是谁的优点和缺点,我错过了一个人?

@巴里 :不知何故,我觉得阿帕奇是为我臃肿。 那么替代scheme呢?

@BrianLy :好的,我会再看看mod_wsgi。 但是,为什么我需要Apache,如果我用轻型静态文件? 我也设法轻松地为django应用程序本身服务。 反正这样不好? 对不起,这么愚蠢:-)

更新 :什么是lighty和nginx – 当这些是完美的select时,哪些是用例呢?

由于我正在寻找更深入的答案,我决定深入研究这个问题。 如果我误解了任何内容,请告诉我。

一些一般的build议是使用一个单独的networking服务器来处理媒体。 单独来说,我的意思是一个没有运行Django的web服务器。 这个服务器可以是例如:

  • Lighttpd(Lighty)
  • Nginx(EngineX)
  • 或者其他一些轻量级的服务器

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

  • 通过Apache服务Django,并且:

    • mod_python的

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

    • mod_wsgi的

      据我所知,mod_wsgi是一个较新的select。 资源似乎更快,更容易。

    • 的mod_fastcgi

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

      你所做的是,你在一个单独的进程中启动你的Django FastCGI服务器,然后通过重写来configurationapache来在需要时调用这个进程。

或者你可以:

  • 不使用Apache的情况下为 Django服务,但使用另一台支持FastCGI的服务器:

    (文档中提到,如果你没有任何Apache的特定需求,你可以做这个,我想这个原因一定是为了节省内存。)

    • Lighttpd的

    这是运行Youtube的服务器。 它似乎快速和易于使用,但是我已经看到有关记忆力衰退的报道。

    • nginx的

    我见过基准声称这个服务器比lighttpd还要快。 这大部分都是用俄语logging的。

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

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

我正在使用切诺基 。

根据他们的基准 (与他们的盐粒),它比Lighttpd和Nginx更好地处理负载…但是这不是我使用它的原因。

我使用它,因为如果你键入cherokee-admin ,它启动一个新的服务器,你可以login(与一次性密码),并通过一个完美的webminconfiguration整个服务器。 这是一个杀手级的function。 这已经为我节省了很多时间。 这是我的服务器节省了大量的资源!

至于django,我把它作为一个线程SCGI进程运行。 效果很好。 切诺基也可以保持运行。 再次,非常好的function。

目前的Ubuntu回购版本是非常旧的,所以我build议你使用他们的PPA 。 祝你好运。

正如@Barry所说,文档使用了mod_python 。 我没有使用Ubuntu作为服务器,但是在Solaris上使用了mod_wsgi。 你可以在mod_wsgi站点findmod_wsgi和Django的文档。

快速审查您的要求:

  • 易于安装我发现Apache 2.2相当容易build立和安装。
  • 资源快速简单我会说,这取决于您的使用和stream量。 *您可能不想使用Apache来服务所有文件,并使用LightTPD (lighty)来服务器静态文件。
  • 可以提供媒体文件我假设你的意思是图像,Flash文件? Apache可以做到这一点。
  • 同一服务器上的多个站点在Apache上托pipe的虚拟服务器
  • 而不是安装其他扩展在Apacheconfiguration中注释掉你不想要的任何东西。

正式推荐的部署django项目的方法是使用mod_python和apache。 这在文档中有描述。 主要的专业人员是这是最好的logging,最受支持,最常见的部署方式。 这意味着它可能不是最快的。

我认为最好的configuration是不是很清楚。 但是这里是:

  1. 使用nginx提供服务请求(直接向应用程序dynamic转换,静态内容)。
  2. 使用Python Web服务器来提供dynamic内容。

基于python的web服务器的两个最快捷的解决scheme是:

  • 热电联产
  • fapws2

你需要看看谷歌find当前最好的configurationDjango(仍在开发)。

我用mod_wsgi使用nginx (0.6.32 取自Sid )。 它工作得很好,虽然我不能说是否比替代品好,因为我从来没有尝试过。 Nginx内置了memcached支持,可以与Djangocaching中间件互操作(我实际上没有使用它,而是使用python-memcache手动填充caching,并在更改时使其无效),所以caching命中完全绕过Django (我的开发机器每秒可以处理约3000个请求)。

警告: mod_wsgi非常不喜欢命名的位置(它试图在SCRIPT_NAME传递它们),所以显而易见的' error_page 404 = @django '会导致许多模糊的错误。 我不得不修补mod_wsgi来解决这个问题。

我也在努力去理解所有的select。 在这个博客文章中,我发现mod_wsgi相比mod_python有一些好处。

小型VPS上的多个低stream量站点使内存消耗成为主要关注点,而mod_python似乎是一个糟糕的select。 使用lighttpd和FastCGI,我设法将一个简单的Django站点的最小内存使用率降低到58MiB虚拟和6.5MiB常驻(在重新启动和服务一个非RAM大量请求之后)。

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

保持简单: 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。 我想这将是我们的“用例”。

至于关于文件主要是俄文的评论 – 我发现英文wiki上的大部分信息是非常有用和准确的。 这个站点也有Django的示例configuration,您可以从中调整自己的nginxconfiguration。

有很多方法可以做到这一点。出于这个原因,我build议仔细阅读DjangoAdvent.com上有关部署过程的文章:Eric Florenzano – 使用FastCGI部署Django: http ://djangoadvent.com/1.2/deploying -django-site-using-fastcgi /阅读:Mike Malone – 扩展Django Stochastictechnologies博客:完美的Django设置Mikkel Hoegh博客:35%Response-time-improvement-switching-uwsgi-nginx

问候

我有使用切诺基的警告。 当你修改Django时,Cherokee维护OLD进程,而不是杀死它并开始一个新进程。

在Apache上我强烈推荐这篇文章。

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

它易于设置,易于杀死或更改后重置。

只需inputterminal

 sudo /etc/init.d/apache2 restart 

并立即看到变化。