如何在 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,以便您可以有效地使用自动缩放?

如何在 amazon micro ec2 服务器(Amazon Linux)上安装 SVN 客户端

如何在 Amazon EC2 上配置基于内存的 Auto Scaling?