我正在寻找对以下问题的过于简化的答案。我试图建立对 Nginx 如何与 Gunicorn 之类的东西一起工作的基本理解。
我是否需要 Nginx 和 Gunicorn 之类的东西才能在 Nginx 上部署 Django 应用程序?
如果是这样,实际处理 HTTP 请求的是什么?
附言。我不想使用 Apache 和 mod_wsgi!
小智 387
过度简化:您需要一些可以执行 Python 的东西,但 Python 并不是处理所有类型请求的最佳选择。
[免责声明:我是 Gunicorn 开发人员]
不那么简单:不管你使用什么应用服务器(Gunicorn、mod_wsgi、mod_uwsgi、cherrypy),任何类型的非平凡部署都会有一些上游的东西来处理你的 Django 应用程序不应该处理的请求。此类请求的简单示例是提供静态资产 (images/css/js)。
这导致经典“三层架构”的两个第一层。即,网络服务器(在您的情况下为 Nginx)将处理许多对图像和静态资源的请求。然后需要动态生成的请求将传递到应用程序服务器(在您的示例中为 Gunicorn)。(顺便说一句,三层中的第三层是数据库)
从历史上看,这些层中的每一层都将托管在不同的机器上(并且很可能在前两层中有多台机器,即:5 个 Web 服务器将请求分派给两个应用服务器,后者又查询单个数据库)。
在现代时代,我们现在拥有各种形状和大小的应用程序。并非每个周末项目或小型企业站点实际上都需要多台机器的马力,并且可以在单个机器上愉快地运行。这催生了一系列托管解决方案的新条目。一些解决方案会将应用程序服务器与 Web 服务器(Apache httpd + mod_wsgi、Nginx + mod_uwsgi 等)结合起来。将数据库与这些 Web/应用程序服务器组合之一托管在同一台机器上并不少见。
现在在 Gunicorn 的情况下,我们做出了一个特定的决定(从 Ruby 的 Unicorn 复制),在依赖 Nginx 的代理行为的同时,将事情与 Nginx 分开。具体来说,如果我们可以假设 Gunicorn 永远不会直接从 Internet 读取连接,那么我们就不必担心客户端速度很慢。这意味着 Gunicorn 的处理模型非常简单。
分离还允许 Gunicorn 用纯 Python 编写,从而最大限度地降低开发成本,同时不会显着影响性能。它还允许用户使用其他代理(假设它们正确缓冲)。
至于您关于实际处理 HTTP 请求的第二个问题,简单的答案是 Gunicorn。完整的答案是 Nginx 和 Gunicorn 都处理请求。基本上,Nginx 将接收请求,如果它是一个动态请求(通常基于 URL 模式),那么它将将该请求提供给 Gunicorn,Gunicorn 将处理它,然后将响应返回给 Nginx,然后将响应转发回原始请求客户。
所以最后,是的。您需要 Nginx 和 Gunicorn(或类似的东西)才能正确部署 Django。如果您特别希望使用 Nginx 托管 Django,那么我会调查 Gunicorn、mod_uwsgi 和 CherryPy 作为 Django 方面的候选者。
小智 45
我喜欢这个简单的解释:
Nginx 将面对外界。它将直接从文件系统提供媒体文件(图像、CSS 等)。但是,它不能直接与 Django 应用程序对话;它需要一些东西来运行应用程序,从网络向它提供请求,并返回响应。
那是 Gunicorn 的工作。Gunicorn 将创建一个 Unix 套接字,并通过 wsgi 协议向 nginx 提供响应 - 套接字双向传递数据:
Run Code Online (Sandbox Code Playgroud)The outside world <-> Nginx <-> The socket <-> Gunicorn
https://gist.github.com/Atem18/4696071
| 归档时间: |
|
| 查看次数: |
98413 次 |
| 最近记录: |