题 为什么我需要Nginx和Gunicorn之类的东西?


我正在寻找以下问题的过于简化的答案。我正在尝试建立一个基本的理解Nginx如何与Gunicorn一起工作。

我是否需要Nginx和Gunicorn之类的东西在Nginx上部署Django应用程序?

如果是这样,实际处理HTTP请求的是什么?

PS。我不想使用Apache和mod_wsgi!


182
2017-11-15 21:16




Apache和mod_wsgi是在django应用程序和http请求之间实现桥接的最简单方法,它在生产环境中也非常强大。对于许多开发人员来说,这意味着“Apache比nginx更好”,如果他们知道但是知道它,但是因为“betamax优于VHS”,唉,Dogma规则 - MagicLAMP


答案:


过度简化:您需要执行Python的东西,但Python并不是处理所有类型请求的最佳选择。

[免责声明:我是Gunicorn的开发者]

简化:不管你使用什么app服务器(Gunicorn,mod_wsgi,mod_uwsgi,cherrypy),任何类型的非平凡部署都会有一些上游来处理你的Django应用程序不应该处理的请求。此类请求的简单示例是提供静态资产(images / css / js)。

这导致了经典“三层架构”的两个第一层。即,网络服务器(在你的情况下是Nginx)将处理许多图像和静态资源请求。然后,需要动态生成的请求将传递到应用程序服务器(在您的示例中为Gunicorn)。 (顺便说一句,三层中的第三层是数据库)

从历史上看,这些层中的每一层都将托管在不同的机器上(前两层中很可能是多台机器,即:5台Web服务器将请求分派给两台应用服务器,后者又查询单个数据库)。

在现代,我们现在有各种形状和尺寸的应用。并非每个周末项目或小型企业站点实际上都需要多台机器的马力,并且在一个盒子上运行得非常愉快。这已经在托管解决方案阵列中产生了新的条目。一些解决方案将app服务器与Web服务器结合(Apache httpd + mod_wsgi,Nginx + mod_uwsgi等)。并且在与这些web / app服务器组合之一相同的机器上托管数据库并不罕见。

现在在Gunicorn的情况下,我们做出了一个特定的决定(从Ruby的Unicorn复制),以便在依赖Nginx的代理行为的同时将事物与Nginx分开。具体来说,如果我们可以假设Gunicorn永远不会直接从互联网上读取连接,那么我们就不必担心速度慢的客户端。这意味着Gunicorn的处理模型非常简单。

分离还允许Gunicorn用纯Python编写,这可以最大限度地降低开发成本,同时不会显着影响性能。它还允许用户使用其他代理(假设它们正确缓冲)。

关于你实际处理HTTP请求的第二个问题,简单的答案是Gunicorn。完整的答案是Nginx和Gunicorn处理请求。基本上,Nginx将收到请求,如果它是动态请求(通常基于URL模式),那么它会将该请求提供给Gunicorn,后者将处理它,然后向Nginx返回响应,然后将响应转发回原始客户。

所以最后,是的。你需要Nginx和Gunicorn(或类似的东西)进行适当的Django部署。如果你特意想用Nginx主持Django,那么我会调查Gunicorn,mod_uwsgi,也许还有CherryPy作为Django方面的候选人。


267
2017-11-15 21:49



感谢您抽出宝贵时间撰写如此详细的答案!有关这种“三层架构”的任何推荐读物吗? - a.m.
很好的答案,但我不理解慢客户端的问题。 - Mads Skjern
@MadsSkjern我在这里猜测,但是如果你假设所有客户端都很快,那么你可以使用一个固定的工作进程池,而不必编写许多或所有客户端被阻塞等待客户端的情况。 - Jonathan Hartley
@上午。 en.wikipedia.org/wiki/Multitier_architecture - Jonathan Hartley
我的django应用程序只服务json没有静态内容我可以只用gunicorn和没有nginx - Sar009


我简单地喜欢这个解释:

Nginx将面对外界。它将提供媒体文件(图像,   CSS等)直接来自文件系统。但是,它无法说话   直接到Django应用程序;它需要能够运行的东西   应用程序,从Web提供请求并返回响应。

这是Gunicorn的工作。 Gunicorn将创建一个Unix套接字并提供服务   通过wsgi协议对nginx的响应 - 套接字传递数据   两个方向:

The outside world <-> Nginx <-> The socket <-> Gunicorn

https://gist.github.com/Atem18/4696071


20
2017-12-13 07:52



它不一定是套接字,以防其他人想知道。 - akshay


我正在寻找一个过于简化的答案......

我是否需要Nginx和Gunicorn之类的东西在Nginx上部署Django应用程序?

如果是这样,实际处理HTTP请求的是什么?

过于简化的答案:

是。

Nginx和Gunicorn。

由于您在Nginx上部署,当然您需要Nginx。

由于您正在部署Django,这是一个Web框架,您需要在Web服务器(Nginx)和Web框架(Django)之间建立联系。在Python世界中,这样的东西被称为WSGI服务器(但它认为它像中间件),其中的例子包括Gunicorn和uWSGI。处理请求时,Nginx将请求代理到Gunicorn或uWSGI,后者又调用Django代码并返回响应。

这个文件 而保罗的回答将帮助你更好地学习它。


0
2017-10-26 21:42