使用nginx + FastCGI运行Django应用程序——是运行两个Web服务器还是一个?

7
我即将在一个nginx web服务器上部署Django应用程序,并希望确保我正在正确地构建系统。 似乎普遍认为,如果您在apache服务器上部署Django,则仍应在应用程序前面放置一个nginx服务器来提供静态文件,其中nginx的性能更高。 如果我想使用nginx + FastCGI来托管Django应用程序而不是apache,则是否有理由配置第二个nginx安装程序以坐在服务动态内容的nginx服务器前面,处理静态内容以及重定向到动态内容? 具体而言,静态和动态内容是否有不同的配置参数,使我想要保持服务器分开,还是可以在单个nginx安装中托管所有内容,并将某些URL映射到Django内容,其余内容映射到从同一nginx安装中提供的静态内容? 感谢您的建议!
4个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
5
大多数配置指令可以在location块中使用(即它们不仅限于全局),在实践中这是非常常见的。您只需使用一个nginx实例即可轻松设置此项。 其中一个伟大之处在于,您可以最初以这种方式设置它,然后稍后更改主机块以通过到后端服务器,而所有这些对外界都是不可见的。 因此,现在在一个服务器上进行设置,知道您可以随时添加后端服务器或集群以满足扩展需要。

谢谢,dwc!你提到现在使用一个服务器的好处很有道理,如果我需要稍微分离一下东西,可以通过位置块传递流量。 - Adam

4
回答你关于在另一个nginx前面放置nginx的问题:通常情况下没有好的理由这样做。这个老建议来自于Apache,特别是当mod_python与Apache prefork MPM一起使用时。在这种设置中,每个Django实例将作为单独的进程运行,在mod_python / Apache容器内部,这将使用大量RAM。想法是通过在重的Apache进程前面放置像nginx这样的轻量级事件驱动HTTP服务器,将静态文件服务远离Apache。这节省了RAM并提高了性能。当使用像nginx这样的轻量级服务器处理所有请求时,这不是一个问题。 nginx具有良好的URL重写处理功能,请查看Rewrite模块。 您的问题没有说明您期望的负载(连接/秒)或为什么要首先使用nginx。如果这是用于VPS服务器上的博客或类似的低负载设置,则请查看使用守护程序模式下的带有mod_wsgi的Apache。这具有与FastCGI非常接近的性能和RAM使用情况,并且mod_wsgi最近成为托管Django的官方推荐方式,请参见http://docs.djangoproject.com/en/dev/howto/deployment/modwsgi/。 一般而言,如果可能的话,我建议使用Apache / mod_wsgi,这是一个稳定和灵活的组合。请确保您不是通过使用nginx来过早地优化,而在使用Apache + mod_wsgi时可以很好地完成任务。有关mod_wsgi守护程序模式性能概述,请参见: http://code.google.com/p/modwsgi/wiki/PerformanceEstimates nginx非常棒,但对于Django解决方案而言,nginx在我看来更适合作为许多Apache实例的负载均衡器,或者作为静态文件的单独服务器。这些用法场景只有在负载较大时才有意义。

很好的回应!我会尽可能比较一下 nginx 作为纯代理和 nginx 作为 FastCGI 桥接器的性能,一旦我有机会。 - Adam
谢谢,Adam。但是我的真正意思是你应该研究一下使用守护进程模式的Apache和mod_wsgi。mod_wsgi是一个Apache可加载模块,即仅适用于Apache。守护进程模式在许多方面类似于FastCGI,但是使用更丰富和现代化的WSGI接口而不是CGI。 - user84609
1
我在使用nginx在我的共享Web托管套餐上同时提供静态文件和快速CGI Django进程,因为nginx的内存消耗要少得多(约30Mb用于nginx和Django),而Apache和Django则需要超过100Mb。 - Frozenskys

2
我认为只有在使用mod_python时,将django代理到自己的服务器才真正有意义。例如:使用nginx提供静态服务,并将django代理到运行mod_python的apache实例中。我很高兴地通过fastcgi在lighttpd中运行django,并且同样的lighttpd也提供静态内容服务。

太棒了!感谢你通过lighttpd提供的建议! - Adam

0

我相信可以在一个Nginx服务器上的一个配置文件中配置所有动态和静态内容。


没错。您可以在“server”块中使用多个“location”指令来实现。我在想静态文件和动态文件的参数(keepalives等)是否相互矛盾,以及静态内容和动态内容的访问模式是否会干扰工作进程,如果它们在同一个守护程序中。 - Adam

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