10

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

我目前在 Amazon EC2 上托管了一个 Django 应用程序。我的所有数据都通过端口 8000 上的 Gunicorn 提供(用于 UNIX 的 Python WSGI HTTP 服务器。它是从 Ruby 的 Unicorn 项目移植的 pre-fork worker 模型)。我不必担心将静态内容(图像)传递给客户端,因为所有这些都是由 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 配置?

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

4

1 回答 1

6

代理缓冲

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

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

缓存

我不太了解您的应用程序及其内容的动态性,但在您的应用程序上设置正确的缓存控制/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 始终是 CPU 时间和带宽之间的权衡。诚然,如果您对内容进行 gzip 压缩,您可以减少通过网络发送的数据量,但如果您在 T1 Micro 上运行,由于 CPU 利用率,您将严重限制代理请求的能力。一般来说,gzip 对于静态内容来说是一个更好的主意,您可以预先压缩,然后一遍又一遍地提供服务。

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

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

杂项

您还需要设置一些其他设置:

# Directives turn off 404 error logging.
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    log_not_found off;
}
于 2013-06-08T04:01:11.980 回答