我在nginx邮件列表上发布了这个帖子,但没有收到任何人的回复,所以我想我会在stackoverflow上给它一个解决方法:)
我目前在Amazon EC2上托管了一个Django应用程序。我的所有数据都是通过Gunicorn在端口8000(用于UNIX的Python WSGI HTTP服务器)上提供的。它是从Ruby的Unicorn项目移植的前叉工作者模型。我不必担心将静态内容(图像)传递给客户端,因为所有这些都是由亚马逊的S3服务为我处理的。 Django通过json将内容的URL通过Gunicorn传递给客户端。然后客户端可以下载它。
我的Django应用程序托管在t1.micro实例上。以下是亚马逊网络服务提供的规范:
处理器:最多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配置?
如果您在我的场景中,您会使用哪些设置?非常感谢您的回答和示例。谢谢:)
答案 0 :(得分:5)
通常,代理缓冲只会在您生成非常大的网页或发送大型文件时帮助您。无论如何,它很容易设置,但你需要将缓冲区大小调整到大约最大页面的大小+ 20%(任何不适合缓冲区的页面都写入磁盘),或选择性地启用代理缓冲你最大的页面。
docs: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;
docs:
在您的网站上启用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;
}