如何在 Amazon EC2 上使用 Gunicorn 设置 Nginx 代理缓冲?
Posted
技术标签:
【中文标题】如何在 Amazon EC2 上使用 Gunicorn 设置 Nginx 代理缓冲?【英文标题】:How can I setup Nginx Proxy Buffering with Gunicorn over Amazon EC2? 【发布时间】:2013-05-20 09:11:25 【问题描述】:我的 Django 应用程序托管在 Amazon EC2 上。 Gunicorn 在同一台机器上运行并提供我拥有的所有动态内容。没有静态内容。我有两台这样的机器(两台机器都在一个微型实例上运行 Ubuntu 11.04。它们很容易水平扩展)并且我在这两台服务器前面都有一个 ELB(弹性负载均衡器)。
举个例子,这两个 gunicorn/django ubuntu 机器的外部 ip 是:
12.34.567.12:8000 & 21:43:765:21:8000 (gunicorn runs on port 8000).
如果我将这些地址中的任何一个放入我的浏览器,我就可以与我的服务器交互并发送/检索数据。
当我在这两台机器前面放置一个 ELB 时,我可以用来与 BOTH DJANGO/GUNICORN SERVERS 交互的新地址是:
dualstack.myloadbalancer-123456789.us-east-1.elb.amazonaws.com:8000
当我在互联网上阅读大量资源时,许多人建议在 ELB 后面的 Django 应用服务器前面放置一个 nginx 盒子,以缓冲慢速客户端的请求。我认为这将是一个很好的功能,因为我不想丢失任何请求。下图会解释的更清楚:
就像上图一样,我如何配置位于 django app/gunicorn 服务器前面的 nginx 盒子充当反向代理,以便它可以缓冲慢速客户端的请求? (这样,它不会超时,而是保留请求而不会丢失它)
【问题讨论】:
【参考方案1】:我相信你正在寻找 nginx HttpProxyModule。 你在 nginx 中定义一个上游
upstream webservers
server 12.34.567.12:8000;
server 21.43.765.21:8000;
然后通过 proxy_pass 将请求转发到上游。
server
listen 443; //Port you want nginx to listen on
location /
proxy_set_header Host $http_host;
proxy_read_timeout 330;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://webservers ;
除非我弄错了,否则 HttpProxyModule 会在传递整个请求之前对其进行缓冲。 这可能会破坏一些在此过程中需要流式传输或交互的项目,但这是您面临的限制。
我的 nginx 有点生锈了,所以它可能无法正常工作,但应该是这样的
【讨论】:
您的回答似乎很有希望。所以现在我的问题是,我现在是否将我的客户端指向 nginx 服务器(假设 nginx 服务器的外部 ip 是 10.12.13.22)?由于 nginx 正在缓冲来自 12.34.567.12:8000 和 21.43.765.21:8000 的请求,我会将它们指向 10.12.13.22:8000 吗? 在示例中,端点将是 10.12.13.22:443,因为它是使用listen
指令选择的。但是,这可以是您想要的任何端口。
是的,确实如此,我忘记接受你的回答了!谢谢你提醒我!【参考方案2】:
如果您希望使用 Ubuntu 服务器在 EC2 上进行托管,那么除了 Nathan 提到的教程之外,这些都是一些不错的教程。
http://ijcdigital.com/blog/django-gunicorn-and-nginx-setup/ 这个是在 Ubuntu 中设置 Nginx 和 Gunicorn。 http://ydevel.tumblr.com/post/22850778860/configuring-an-https-site-with-django-on-nginx 这也是用于设置 Https 配置。 http://adrian.org.ar/automatic-setup-of-django-nginx-and-gunicorn-on-ec2/ 这个很有趣,因为它解释了如何使用 Bellatrix(一个不错的 boto 库)在 EC2 中使用 Gunicorn 安装 Nginx。至少要经历一次。非常好祝您部署顺利。如果您觉得答案有帮助,请采纳答案
【讨论】:
我编辑了我的问题以使其更清晰。与其在与应用服务器相同的机器上运行 nginx,不如在单独的机器上运行它以缓冲请求不是更理想吗?我所有的内容都是动态的,没有一个是静态的。我对 nginx 的唯一用途就是代理缓冲。【参考方案3】:你肯定希望 nginx 坐在 gunicorn 前面。这是一个常见的设置,您可以找到很多资源来帮助您入门。我喜欢这个教程:http://senko.net/en/django-nginx-gunicorn/,它还将引导您完成 supervisord 并设置 virtualenv。
【讨论】:
我正在编辑我的问题以使其更清晰。我对 nginx 或它的配置不太熟悉。据我所知,人们说它是一个非常好的 nginx 代理缓冲区。因此,它不会让慢速连接超时,而是保留它们并缓冲它们请求的数据。我在每台机器上运行 3 个 gunicorn 工人。我将如何配置 nginx 以很好地使用此设置?我将用于配置 nginx 的适当字段和值是什么?非常感谢您的专业知识!以上是关于如何在 Amazon EC2 上使用 Gunicorn 设置 Nginx 代理缓冲?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Amazon 的 EC2 上运行 Java 服务器?
如何在 Amazon EC2 上使用 Gunicorn 设置 Nginx 代理缓冲?
如何在 Amazon EC2 上部署 Java webapp,以便您可以有效地使用自动缩放?
如何在 Amazon EC2 上部署 Java webapp,以便您可以有效地使用自动缩放?