【问题标题】:Do I need Nginx with Gunicorn if I am not serving any static content?如果我不提供任何静态内容,我是否需要 Nginx 和 Gunicorn?
【发布时间】:2020-03-24 03:46:53
【问题描述】:

在典型的 python 服务器设置中,建议让 Nginx Web 服务器提供静态内容并将动态请求代理到 Gunicorn 应用服务器。 现在,如果我不通过我的 python 应用程序提供任何静态内容,我还需要在 Gunicorn 前面使用 Nginx 吗?会有什么优势? 非常感谢详细的解释。

所有静态内容都通过 CDN 提供,后端服务器只需要提供 API(REST)。所以当我只提供动态内容时,我需要 Nginx 吗?在高负载等情况下有什么优势吗?

【问题讨论】:

  • 通常你会这样做,如果你想公开一个最小的 API 用于开发目的,如果你提供一个完整的 Web 应用程序,你迟早需要提供静态文件,除此之外,你例如,如果您的计划是为小型 TCP 服务器提供服务,则可以忽略 Gunicorn。
  • @AlejandroVicaria 我指的是完全生产模式。实际上所有的静态内容都是通过 CDN 提供的,后端服务器只需要提供 API(REST)。所以当我只提供动态内容时,我需要 Nginx 吗?在高负载等情况下有什么优势吗?
  • 根据我的经验,虽然使用 nginx 在技术上是最佳实践,但您并不需要它。我猜 nginx 更擅长处理来自世界的传入请求,而 gunicorn 更擅长为您的应用程序提供服务。但实际上,您的系统架构的其余部分应该足够了,您不仅仅依赖于这些因素。例如,在高负载的情况下,您可以让更多的应用程序实例在负载均衡器后面运行。不要给自己更多的维护。
  • 如果您使用 SSL/TLS,我建议您使用 nginx,因为它比任何 python 库都经过了更多的实战测试,而且它可能效率更高。如果没有,那么您不必这样做,但不建议使用 SSL/TLS

标签: python django nginx django-rest-framework gunicorn


【解决方案1】:

不,我不再专门为 python 应用部署 nginx。我可能在将请求拆分到其他应用程序的路径中有一个应用程序负载均衡器/nginx,但不是用于负载管理。如果使用基于 asyncio 的系统,我通常什至不使用应用服务器(uwsgi/gunicorn)。这包括吞吐量非常高的应用程序。每一层反向代理/第 7 层负载均衡都会增加一点延迟——如果不需要,请不要添加。

【讨论】:

    【解决方案2】:

    即使您不使用 NGINX 来提供静态资产 putting gunicorn behind a proxy server is the recommended setup

    例如,将gunicorn 放在代理后面将允许为您的系统增加一些背压,以保护您免受Slowloris 等攻击。

    【讨论】:

    • 谢谢你-不知道Slowloris。但是,我会使用 Cloudflare 作为代理服务器,它包括(除了 CDN 之外)对此的保护。你认为在那种情况下,如果在 Cloudflare 和 gunicorn 之间没有额外的 nginx,我会很好吗?
    【解决方案3】:

    在代理服务器后面运行它是recommended in Gunicorn docs

    从技术上讲,您并不真正需要 Nginx。

    但是这是互联网:您的服务器会收到大量由机器人程序和漏洞扫描脚本发出的格式错误的 HTTP 请求。现在,您的 Gunicorn 进程将忙于解析和处理这些请求,而不是为真正的客户提供服务。

    使用 Nginx 在前面,它会终止这些请求而不转发到您的 Gunicorn 后端。

    这些漫游器中的大多数都向您的 IP 地址发出请求,而不是您的域名。因此,将 Nginx 配置为忽略对 IP 地址的请求并仅处理对您的域发出的请求非常容易。这比依赖 Django 的 ALLOWED_HOSTS 设置更安全、更快捷。

    此外,为 Nginx 查找有关保护服务器的资源要容易得多,例如将恶意 IP 地址或用户代理列入黑名单等。比较这两个谷歌搜索:nginx ban ipgunicorn ban ip。可以看到 Nginx 搜索有更多的资源。

    如果你担心性能,那么请放心,Nginx 不会成为瓶颈。如果你真的想优化性能,数据库查询将是第一个开始。

    【讨论】:

    • 如果将 Gunicorn 专门用于从 API Gateway 代理的 API,您会推荐它吗?如果您有节流、模式验证和其他保护措施,那么 nginx 似乎会为此增加麻烦。
    • @reactive-core 是的,它甚至在Gunicorn's docs 中被推荐。此外,Nginx 还有更多功能,例如限制请求正文大小、关闭慢速连接(以避免慢 loris 攻击)等。您不能在 Gunicorn 中执行此操作。
    猜你喜欢
    • 2019-01-23
    • 1970-01-01
    • 2017-05-31
    • 2019-01-29
    • 2012-02-20
    • 2020-09-20
    • 2015-11-30
    • 2021-07-18
    • 2018-07-19
    相关资源
    最近更新 更多