【问题标题】: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 和图像。通过开发服务器提供这些服务必然会导致成绩不及格,但做得更好将取决于您如何配置最终提供这些服务的真实服务器。

        【讨论】:

          猜你喜欢
          • 2014-03-18
          • 1970-01-01
          • 1970-01-01
          • 2014-04-18
          • 1970-01-01
          • 2011-02-18
          • 1970-01-01
          • 1970-01-01
          • 2013-10-07
          相关资源
          最近更新 更多