NGINX反向代理用于上游Django/Gunicorn后端

10

我在nginx邮件列表上发布了这个问题,但没有听到任何回复,所以我想在stackoverflow上试一试 :)

我目前在Amazon EC2上托管了一个Django应用程序。我的所有数据都通过Gunicorn在端口8000上提供服务(这是一个Python WSGI HTTP服务器,采用预分叉工作模型,由Ruby的Unicorn项目移植而来)。我不必担心将静态内容(图像)传递给客户端,因为所有这些都由Amazon的S3服务处理。 Django通过Gunicorn将内容的URL通过json传递给客户端。客户端可以随后下载它。

我的Django应用程序托管在t1.micro实例上。以下是Amazon Web Services提供的规格:

处理器:最多2个EC2计算单元(短期间歇性爆发)。 虚拟内核:1 内存:615 MiB 平台:32位和64位

我在此实例上运行着3个Gunicorn工作进程与我的Django应用程序一起。

对于我的Nginx反向代理服务器,我还使用了一个t1.micro实例。我已经设置好了一切,一切都正常工作。我的/etc/nginx/sites-enabled/default配置如下:

# Gunicorn server
upstream django {
  server         10.0.10.0:8000;
}
# Serve static files and redirect any other request to Gunicorn
server {
  listen       80;
  server_name  23.0.23.23/;
  #root        /var/www/domain.com/;
  #access_log  /var/log/nginx/domain.com.access.log;
  #error_log  /var/log/nginx/domain.com.error.log;

  # Check if a file exists at /var/www/domain/ for the incoming request.
  # If it doesn't proxy to Gunicorn/Django.
  #try_files $uri @django;

  # Setup named location for Django requests and handle proxy details
  location @django {
    proxy_pass         http://django;
    proxy_redirect     off;
    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
  }
}

这个设置很好,但它没有考虑到慢客户端的代理缓冲。它也没有考虑到缓存,也没有考虑我需要多少个nginx工作进程。我该如何配置压缩?我找到了一些资源,说有一种叫做gzip的东西,它支持json吗?如何根据我的t1.micro实例规格微调我的nginx配置?
如果你处于我的情况下,你会使用什么设置?非常感谢您的答案和示例。谢谢 :)

我找到了这个资源,https://github.com/benoitc/gunicorn/blob/master/examples/nginx.conf 你们可以看一下,让我知道如何调整它以满足我的需求! :) - deadlock
1个回答

7

代理缓存

通常来说,如果您生成的网页非常大或发送大文件,代理缓存才会对您有所帮助。不过,设置起来相当容易,但您需要将缓冲区大小调整为最大页面大小的约20%(任何无法适应缓冲区的页面都会被写入磁盘),或者在最大页面上选择性地启用代理缓存。

文档:http://wiki.nginx.org/HttpProxyModule#proxy_buffering

缓存

我不知道您的应用程序及其内容的动态程度,但设置正确的 Cache Control / ETAG 标头生成是您需要关注的第一件事。这将让 Nginx 知道哪些内容可以安全地代理。另外,您可能希望设置多个缓存区以管理磁盘上缓存所占用的空间。

proxy_cache one;
proxy_cache_path  /data/nginx/cache/one levels=1:2 max_size=1G keys_zone=one:1000m;

您需要一些规则来允许您绕过缓存(用于调试或以编程方式)

proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;
proxy_cache_bypass $http_pragma $http_authorization;

当您的应用程序出现错误时,您还希望无条件地从缓存中提供服务:

proxy_cache_use_stale error timeout invalid_header;

文档:

Gzip

在网站上启用gzip始终是CPU时间和带宽之间的权衡。确实,如果您对内容进行gzip压缩,则可以降低通过线路发送的数据量,但是,如果您在T1微型机上运行,则会由于CPU利用率而严重限制代理请求的容量。通常gzip更适合预先压缩并反复提供的静态内容。

(是的,gzip支持json格式,但这是因为gzip成为了传输格式,并且客户端可以透明地解压缩。您应该阅读有关Content-Encoding: gzip的信息)

文档:http://betterexplained.com/articles/how-to-optimize-your-site-with-gzip-compression/

Misc

您还需要设置一些杂项设置:

# Directives turn off 404 error logging.
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    log_not_found off;
}

嗨,@riegie-godwin,如果这个答案对您有帮助或提供了信息,您是否考虑将其标记为正确的答案? - Thomas
抱歉耽搁了。 - deadlock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接