Apache 或 Nginx 服务于 Django 应用程序? [关闭]
Posted
技术标签:
【中文标题】Apache 或 Nginx 服务于 Django 应用程序? [关闭]【英文标题】:Apache or Nginx to serve Django applications? [closed] 【发布时间】:2012-02-27 23:56:57 【问题描述】:我想部署一个 Django Web 应用程序,因此我需要选择一个 Web 服务器来提供 Python 文件。
我应该提到,我的生产站点将位于一个服务器上,该服务器将托管数据库和 Web 服务器。随着动力的选择,我的目标是将数据库移动到专用服务器等。
这是我的问题:
-
我应该使用一台还是两台网络服务器?这个问题的背景是,很多人建议使用 nginx 来提供静态媒体文件和 Apache 来提供 Python,这招致了以下问题:
-
为什么我们不能只使用一台服务器。我知道 Apache 有时可能是一头野兽,因此我怀疑人们会使用 NginX 来同时提供静态媒体文件和 python 文件。
如果使用一台服务器,Apache 或 NginX 哪个更好。我在 Apache 方面经验丰富,但我只听说过有关 NginX 的好消息。
在此先感谢
【问题讨论】:
根据我的经验,带有 mod_wsgi 的 Apache 带来的麻烦要少得多。 @Barry 你最后做了什么?似乎 Django docs 建议使用 Nginx 作为静态媒体的主要选择,而 Apache 作为 Django 应用程序的 primary choice。 【参考方案1】:我应该使用一台还是两台网络服务器?这个问题的上下文是 很多人推荐使用 NginX 来提供静态媒体文件 和 Apache 为 Python 提供服务,这引发了以下问题: 为什么我们不能只使用一台服务器。我知道 Apache 可能是一头野兽 有时,因此我怀疑人们使用 NginX 来同时服务 静态媒体文件和 python 文件。
如果您目前没有以某种方式配置的其他站点,或者您需要一些在不同服务器之间互斥的特定功能,我认为没有理由使用多个服务器。这只会增加不必要的复杂性和配置。
如果使用一台服务器,Apache 或 NginX 哪个更好。 我在 Apache 方面经验丰富,但我只听说过有关 NginX 的好消息。
与所有“哪个更好”的问题一样,这通常是一个偏好问题。要获得具体答案,您可能需要提出更具体的问题。
如果您已经有使用特定服务器的经验,并且只想快速启动运行,那么我建议您暂时使用您已经知道的内容。您以后可以随时切换到另一个 Web 服务器。 另一方面,这是了解替代方案的好机会。
tl;dr : 我会选择更容易配置和管理的东西。就我个人而言,我会选择 nginx 和 gunicorn,主要是因为它很简单,而且如果你遇到困难,还有很多可用的资源。
在您真正需要之前,我不会太担心性能。所有主要的 Web 服务器都经过试用和测试,因此主要取决于应用程序的要求和实际负载,无论如何都需要监控、建模和测试以进行微调。
与 mod_wsgi 相比,使用 FastCGI 有哪些优势?
Differences and uses between WSGI, CGI, FastCGI, and mod_python in regards to Python?
要阅读的文章(一些旧的,一些新的);
http://gunicorn-docs.readthedocs.org/en/latest/deploy.html https://docs.djangoproject.com/en/dev/howto/deployment/ http://serversforhackers.com/editions/2014/03/25/nginx/ http://blog.dscpl.com.au/2009/05/blocking-requests-and-nginx-version-of.html http://www.thegeekstuff.com/2013/11/nginx-vs-apache/ http://raspberrywebserver.com/raspberrypicluster/comparing-the-performance-of-nginx-and-apache-web-servers.html http://www.bearfruit.org/2013/04/19/reddit-is-melting-our-server-heres-what-we-did-nginx-apache-django-and-mysql/ In production, Apache + mod_wsgi or Nginx + mod_wsgi? http://www.peterbe.com/plog/fcgi-vs-gunicorn-vs-uwsgi http://www.aosabook.org/en/nginx.html http://c2.com/cgi/wiki?PrematureOptimization【讨论】:
【参考方案2】:问题 1)您可以只使用一台服务器,但对于提供静态媒体,像 lighttpd 或 nginx 这样的解决方案会快得多。如果您真的只想使用一台服务器,我会坚持使用 Apache,它具有您需要的所有灵活性,并且是最常见的网络服务器。
问题 2) 取决于您的目的。你可以在这里找到信息:Deploying Django (fastcgi, apache mod_wsgi, uwsgi, gunicorn)
【讨论】:
嗨。为什么 NginX 不能也用于服务 Python - 我的意思是,如果 NginX 对静态文件有好处,那么它肯定对 Pthon 文件也有好处。 可以使用。 Apache 更加普遍和普遍,因此如果您偶然发现一些特殊需求,您更有可能找到成熟的解决方案。另一方面,Chris Pratts 的回答也必须考虑在内。【参考方案3】:我不确定谁向您推荐同时使用 Nginx 和 Apache,但这是一个可怕的想法。无论您选择哪个,都将简单地充当反向代理,仅提供静态资源并将其他所有内容交给像 uwsgi 这样的子进程。
我更喜欢 Nginx,因为它重量轻且开箱即用速度极快。 Apache 可以 一样好,但需要从源代码构建并确切知道要使用什么配置来匹配 Nginx。然而,Apache 有更多的特性并且更容易使用。这完全取决于您和您的应用程序的需求。
但是,无论您选择哪一个,您只需要一个——而不是两者。
【讨论】:
将 nginx 作为 Apache/mod_wsgi 的前端实际上有很多好处,因为它允许 Apache 在运行动态 Python Web 应用程序时使用更少的资源更好地执行。所以这绝对不是一个“可怕的想法”。 嗯...是的,确实如此。如果您已经在运行 nginx,那么 Django 所需要的只是 uwsgi 之类的东西,它比 Apache 在最好的日子里要快几个数量级,而且更轻量级。当您已经有另一台服务器充当反向代理时,根本没有充分的理由让整个 Apache 实例运行。 你敢这么说。甚至 uWSGI 作者自己也没有提出这样的要求。他们知道,当为 Python 正确设置 Apache 时,并没有太大的区别。当您在顶部放置一个胖 Python Web 应用程序时,差异就更不明显了。当您考虑到大多数经过优化的 Python Web 应用程序以大约 10 毫秒的响应运行时,在 Web 服务器层每次请求节省微秒数是没有意义的。所以任何事情都会变慢的原因不会是由于网络服务器,除非你真的搞砸了它的配置。 @ChrisPratt 你认为最新版本的 Django 仍然如此吗?我刚刚阅读了docs,似乎他们建议为静态媒体使用单独的服务器。【参考方案4】:我认为最好的选择是 virtualenv、uwsgi 和 nginx。 我现在更换了所有服务器,我对性能非常满意。
这是关于如何设置网络服务器的好教程 http://senya.pl/2011/03/sexy-nginx-uwsgi-stack-for-django-with-virtualenv/
【讨论】:
嗨 nicowernli。感谢您提供教程的链接。我有一个问题,这个教程的作者坚持从源代码编译所有东西(例如DJango和NginX都是从源代码下载和编译的)而不是通过包管理器获取二进制包? 其实我更喜欢用pip。如果您使用的是 ubuntu/debian,请将 nginx 存储库添加到您的 apt 源列表,从存储库安装 nginx,然后使用 pip 安装 virtualenv、uwsgi 和 Django。我为此写了一个教程,但是是西班牙语 讽刺的是,我现在在西班牙(潘普洛纳)。我知道你可能是南美人,但如果你是西班牙人并且居住在纳瓦拉,那么我就很喜欢 cerveza :) 为什么你喜欢 pip 而不是 aptitude?span> 嗯,是的,我是南美人,实际上来自阿根廷。这是我的博客条目link。我更喜欢 pip,因为您将始终获得最新的稳定版本的软件包。 senya.pl 的链接无效,暂时还是永久?【参考方案5】:我尝试按照 Nicowernli 建议的链接进行操作,但 senya.pl 在那一刻已关闭。 这似乎是一个很好的替代教程.... 试试看,刚看了前两章,但看起来很完整,真的是一步一步来的:
http://www.abidibo.net/blog/2012/04/30/deploy-django-applications-nginx-uwsgi-virtualenv-south-git-and-fabric-part-1/
【讨论】:
【参考方案6】:-
越少越好。
在 Nginx 上部署 Django 应用程序的最佳方式是使用uwsgi。它是纯粹的 WSGI,新版本 Nginx 支持内置。
【讨论】:
【参考方案7】:我使用gunicorn + eventlet作为Python服务器,使用nginx作为反向代理,非常成功。最近我切换到 uWSGI,如果不是更好的话,它似乎也是一个很好的解决方案。尽管在使用 Django 之前我是 apache 用户,但我还没有尝试过 apache 和 Django。这是一篇关于完成这一切的好文章:http://radtek.ca/blog/django-production-deployment-via-nginx-and-gunicorn-and-virtualenv/
【讨论】:
以上是关于Apache 或 Nginx 服务于 Django 应用程序? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
使用 Nginx 和 Apache 服务于 Web 应用程序