【问题标题】:YSlow Best Practices with Django apps, How to implement them?Django 应用程序的 YSlow 最佳实践,如何实现它们?
【发布时间】:2009-11-07 16:31:49
【问题描述】:
我有一个 django 1.1.1 应用程序,实际上是在开发中,考虑到最佳实践我运行了 YSlow 测试(应用了 E 级规则集:YSlow V2)它推荐:
添加过期标题的 F 级
-有 37 个静态组件没有遥远的到期日期。
使用内容交付网络 (CDN) 获得 F 级
-有 37 个静态组件不在 CDN 上。
使用 gzip 压缩组件的 F 级
-有17个纯文本组件应该压缩发送
如何用 Django 实现它?
更多背景:Python 2.5,在 webfaction 中部署
例子:
减少 HTTP 请求的 F 级
此页面有 14 个外部 Javascript 脚本。尝试将它们合二为一。
此页面有 4 个外部样式表。尝试将它们合二为一。
可以用Django-Compress解决
【问题讨论】:
标签:
django
performance
django-templates
scalability
【解决方案1】:
在您列出的三个中,有两个可在网络服务器级别寻址。例如,在 Linux/Apache 中:
对于 gzip,编辑 /etc/apache2/mods-available/deflate.conf
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-javascript text/javascript text/css application/javascript
</IfModule>
对于 Expires 标头,首先您需要启用 mod_expires:
>cd /etc/apache2
>sudo ln -s ../mods-available/expires.load mods-enabled/expires.load
然后你需要为你想要的 MIME 类型配置它:
# edit /etc/apache2/sites-available/default
ExpiresActive On
ExpiresByType text/css "access plus 12 hours"
ExpiresByType application/javascript "access plus 12 hours"
ExpiresByType image/png "access plus 12 hours"
ExpiresByType image/gif "access plus 12 hours"
写下我为什么推荐 12 小时 here。
最后一项 (CDN) 通常是您外包给像 Akamai 这样的人。它也相当昂贵。
【解决方案2】:
我非常同意蔡斯的观点。我基于 Steve Souders 和 Nicholas Zakas 的工作开发了一些 django 程序。
我的标准做法是:
- 安装 django-mediagenerator,它是用于:
- 将 JS 和 CSS 与媒体生成器包结合起来
- 将 mediagenerator 配置为使用 google-closure 自动压缩 JS,使用 YUICompressor 自动压缩 CSS
- 所有静态媒体(未上传)也由 mediagenerator 处理。这使您可以使用像 10 年这样的远期过期标头。
- 尽量减少图片的使用,并尝试仅使用 CSS 制作网站的大部分内容。
- 如果我必须使用小图像,则在 CSS 文件中使用 base64 内联(使用 mediagenerator)
- 如果它们是大图像,则将它们组合成一个精灵(不过我很少使用大图像)
- Nginx 和 gunicorn 用于部署
nginx.conf 中的 Nginx gzip 配置:
gzip_http_version 1.1;
gzip_vary on;
gzip_comp_level 6;
gzip_proxied any;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_buffers 64 16k;
gzip_disable “MSIE [1-6].(?!.*SV1)”;
Nginx 远期过期标头:
location /media/ {
alias /home/domains/example.com/project/_generated_media/;
expires 10y;
add_header Cache-Control public;
}
他们唯一剩下的项目是图像上传,在很长一段时间内仍然可以使用,因为当图像改变时,文件名也应该改变。
使用这些技术,我制作了带有 3 个 http 请求的网站。页面渲染后的html文件,头部1个CSS请求,页脚1个JS请求。
【解决方案3】:
这些都与 Django 无关,因为 YSlow 指的是您网站上的静态资产 - JS、CSS 和图像。通过开发服务器提供这些服务必然会导致成绩不及格,但做得更好将取决于您如何配置最终提供这些服务的真实服务器。