直接将 AWS ELB 与 Gunicorn 一起使用(没有 nginx)有啥缺点?

Posted

技术标签:

【中文标题】直接将 AWS ELB 与 Gunicorn 一起使用(没有 nginx)有啥缺点?【英文标题】:What are the disadvantages of using AWS ELB directly with Gunicorn (no nginx)?直接将 AWS ELB 与 Gunicorn 一起使用(没有 nginx)有什么缺点? 【发布时间】:2018-02-25 03:42:01 【问题描述】:

我在 Google 上找到的用于在 AWS 上运行 django 应用程序的典型设置都建议使用类似的设置

ELB -> nginx -> gunicorn -> django

我想知道为什么这里真的需要 nginx 部分? ELB 还不够代理吗?

在我们的例子中,我们在 ECS 上的单个 docker 容器中运行多个 Gunicorn/django 实例。

【问题讨论】:

【参考方案1】:

没有 Nginx,它可以正常工作,并且您仍然可以免受大多数 DDOS 攻击,这些攻击可能会导致暴露的 gunicorn 服务器瘫痪。

我只能看到 Nginx 有助于添加到堆栈中,如果它会为您的静态文件提供服务。但是,最好通过 S3 来提供您的静态文件(加上云端作为奖励),因为它具有高可用性和可靠性。

来源: http://docs.gunicorn.org/en/latest/deploy.html#nginx-configuration https://***.com/a/12801140

【讨论】:

如果客户端很慢,它会让你的 gunicorn 服务器变慢。 Nginx 让 gunicorn 可以轻松处理慢速客户端,并且只发送完全接收到的请求(所有 TCP 数据包),不确定 ELB 是否这样做。 @user1501382 您可以随时使用异步工作器(例如 gevent)来提高 gunicorn 的性能。当然,当您遇到大量负载时,您必须自动扩展您的 gunicorn 应用程序实例。为了性能和节省成本,nginx 对这两种情况都没有帮助。正如 OP 所说,只有当您想在同一主机上提供静态内容时,nginx 才会有所帮助。在大多数情况下,再次使用 CDN 是更好的选择。【参考方案2】:

为了得到满意的答案,我不得不进行大量搜索:

    ELB 不会让您免受 DDoS 攻击,它更像是一个通用负载均衡器。 ELB 直接将传入的请求发送到 Gunicorn 服务器。它在将请求转发到 Gunicorn 之前没有收到完整的请求,即,如果由于客户端的 Internet 连接不良或其他原因导致请求的标头/正文发送缓慢,则 Gunicorn 服务器将等待请求完成在它开始处理请求之前。一般来说,允许同一台服务器同时作为 Web 服务器和应用程序服务器是一种不好的做法,因为这会占用应用程序服务器 (Gunicorn) 的资源。 Nginx 还有助于提供静态文件和 GZIP 压缩,从而加快从客户端/服务器发送/接收数据的速度。

另外,即使在Gunicorn的文档中,前面也推荐使用Nginx。

【讨论】:

以上是关于直接将 AWS ELB 与 Gunicorn 一起使用(没有 nginx)有啥缺点?的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 AWS 自己的 ELB 证书进行 HTTPS/SSL 连接吗?

将 WCF 与负载平衡 (AWS) 一起使用时,安全上下文令牌无效

通过 AWS 上的 ELB 在 Kubernetes 上公开单个 Kafka 代理

如何让 Amazon 的 ELB 与 HTTPS/SSL 与 Web Sockets 一起工作?

如何使 ChromeCast 与在 AWS ELB 后面运行的发送者应用程序一起工作

如何在自动缩放组中添加 aws new elb