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配置?
如果我们在我的场景中,您会使用什么设置?非常感谢您的回答和示例.谢谢 :)
通常,代理缓冲只会在您生成非常大的网页或发送大型文件时帮助您.无论如何,它很容易设置,但你需要将缓冲区大小调整到大约最大页面的大小+ 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始终是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)