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

noa*_*ale 8 django nginx gunicorn

我在nginx邮件列表上发布了这个,但没有收到任何人的回复,所以我想我会在stackoverflow上给它一个破解:)

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

我的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;
  }
}
Run Code Online (Sandbox Code Playgroud)

此设置很好,但它不考虑慢速客户端的代理缓冲.它也没有考虑缓存,也没有考虑到我需要的nginx工作者的数量.如何配置压缩?我发现资源表明有一些叫做gzip的东西,这是否支持json?如何根据我的t1.micro实例规范微调我的nginx配置?

如果我们在我的场景中,您会使用什么设置?非常感谢您的回答和示例.谢谢 :)

Tho*_*mas 5

代理缓冲

通常,代理缓冲只会在您生成非常大的网页或发送大型文件时帮助您.无论如何,它很容易设置,但你需要将缓冲区大小调整到大约最大页面的大小+ 20%(任何不适合缓冲区的页面都写入磁盘),或选择性地启用代理缓冲你最大的页面.

docs: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;
Run Code Online (Sandbox Code Playgroud)

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

proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;
proxy_cache_bypass $http_pragma $http_authorization;
Run Code Online (Sandbox Code Playgroud)

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

proxy_cache_use_stale error timeout invalid_header;
Run Code Online (Sandbox Code Playgroud)

文档:

Gzip已

在您的站点上启用gzip始终是CPU时间和带宽之间的权衡.确实,如果您对内容进行gzip,则可以降低通过线路发送的数据量,但如果您在T1 Micro上运行,则会因CPU利用率严重限制代理请求的容量.一般来说gzip对于静态内容来说是一个更好的想法,你可以预先压缩然后反复服务.

(是的,gzip支持json,但这是因为gzip成为有线格式,并且被客户端透明地解压缩.你应该阅读Content-Encoding: gzip)

docs: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;
}
Run Code Online (Sandbox Code Playgroud)