用于 django 应用程序的 nginx + FastCGI --- 运行两个网络服务器还是一个?

Posted

技术标签:

【中文标题】用于 django 应用程序的 nginx + FastCGI --- 运行两个网络服务器还是一个?【英文标题】:nginx + FastCGI for django application---run two webservers or one? 【发布时间】:2010-10-20 07:26:44 【问题描述】:

我即将在 nginx Web 服务器上部署一个 Django 应用程序,并希望确保我正确构建系统。

如果你在 apache 服务器上部署 Django,那么你仍然应该在应用程序前面放置一个 nginx 服务器来提供静态文件,这似乎是常识,而 nginx 在这方面的性能更高。

如果 Django 代码不使用 apache,我想使用 nginx + FastCGI 来托管 Django 应用程序,是否有任何理由配置第二个 nginx 安装以位于提供动态内容的 nginx 服务器前面,处理静态内容以及重定向到动态内容?

具体来说,静态和动态内容是否会有不同的配置参数让我想将服务器分开,或者我可以将它们全部托管在单个 nginx 安装中,其中一些 URL 被映射到 django 内容,其余的被映射到同一个 nginx 安装提供的静态内容?

感谢您的建议!

【问题讨论】:

【参考方案1】:

大多数配置指令都可以存在于位置块中(即,它们不是仅限全局的),这样做是很常见的做法。只使用 1 个 nginx 实例设置它应该没有问题。

其中一个很棒的事情是,您可以最初以这种方式设置它,然后通过切换位置块以传递到后端服务器来改变主意,而外部世界不可见。

因此,现在就在一台服务器上执行此操作,知道您可以稍后在需要扩展时放入后端服务器或集群。

【讨论】:

谢谢,dwc!关于现在使用一台服务器的好处,如果我确实需要将事情分开一点,稍后通过位置块的方式传递流量。【参考方案2】:

回答您关于将 nginx 服务器放在另一个 nginx 前面的问题:不,通常没有充分的理由这样做。这个旧建议来自 Apache,尤其是当 mod_python 与 Apache prefork MPM 一起使用时。在此设置中,每个 Django 实例都将作为一个单独的进程在 mod_python / Apache 容器内运行,这将使用大量 RAM。这个想法是通过在繁重的 Apache 进程前面放置一个轻量级事件驱动的 HTTP 服务器(如 nginx)来保持静态文件服务远离 Apache。这节省了 RAM 并提高了性能。当对所有请求使用像 nginx 这样的轻量级服务器时,这不是问题。

nginx 对 URL 重写有很好的处理,请查看 Rewrite 模块。

您的问题没有说明您期望的负载(连接数/秒),或者您为什么要首先使用 nginx。如果这是针对 VPS 服务器上的博客或类似的低负载设置,那么请考虑在守护程序模式下将 Apache 与 mod_wsgi 一起使用。这具有非常接近 FastCGI 的性能和 RAM 使用率,并且 mod_wsgi 最近成为了官方推荐的托管 Django 的方式,请参阅 http://docs.djangoproject.com/en/dev/howto/deployment/modwsgi/

一般来说,如果可能的话,我会建议使用 Apache / mod_wsgi,这是一个稳定而灵活的组合。确保您没有“过早优化”使用 Apache + mod_wsgi 就可以的 nginx。有关守护程序模式下 mod_wsgi 的性能概述,请参阅: http://code.google.com/p/modwsgi/wiki/PerformanceEstimates

nginx 很棒,但是对于 Django 解决方案,恕我直言,nginx 更适合作为许多 Apache 实例的负载均衡器,或用于静态文件的单独服务器。这两种使用场景都只对大负载有意义。

【讨论】:

很好的回应!一旦有机会,我将尝试比较 nginx 作为代理和 nginx 作为 fastcgi 桥的性能。 谢谢亚当。但我真正的意思是你应该在守护进程模式下使用 mod_wsgi 查看 Apache。 mod_wsgi 是一个 Apache 可加载模块,即仅适用于 Apache。 Daemon 模式在很多方面类似于 FastCGI,但使用更丰富、更现代的 WSGI 接口而不是 CGI 我使用 nginx 在我的共享虚拟主机包上同时提供静态文件和 fastcgi django 进程,因为 nginx 的内存消耗要少得多(nginx 和 django 大约 30Mb)而不是向上Apache 和 django 的 100Mb)【参考方案3】:

我会说代理 django 到它自己的服务器只有在你使用 mod_python 滚动时才真正出现,即:使用 nginx 提供静态服务并将 django 代理到运行 mod_python 的 apache 实例。我很高兴通过 fastcgi 在 lighttpd 中运行 django,同样的 lighttpd 也提供静态内容。

【讨论】:

太棒了!感谢 lighttpd 的建议!【参考方案4】:

我确信可以使用一台 nginx 服务器在一个配置文件中配置所有动态和静态内容

【讨论】:

确实如此。你这样做的方式是在你的“服务器”块中使用多个“位置”指令。我想知道静态和动态文件(keepalives 等)的参数是否相互矛盾,如果静态内容和动态内容的访问模式在同一个守护进程上,它们是否会以某种方式干扰工作进程。

以上是关于用于 django 应用程序的 nginx + FastCGI --- 运行两个网络服务器还是一个?的主要内容,如果未能解决你的问题,请参考以下文章

Django项目部署(nginx+uWSGI+django+virtualenv+supervisor发布web服务器 )

ini 我用于服务Django项目的默认Nginx配置。

HTTPS 协议不适用于 ec2 实例上的 django 和 nginx

nginx+uWSGI+django+virtualenv+supervisor发布web服务器

nginx+uWSGI+django+virtualenv+supervisor发布web服务器

nginx+uWSGI+django+virtualenv+supervisor发布web服务器