起因
目前在做的一个工作是和同事一起优化整个应用的其中一个页面,这个页面是通过点击链接打开一个entity window并显示相关数据。由于在应用中我们有多处类似的窗口,所以我们打算将其作为一个案例来编写一个关于我们的程序前后端的Performance Enhancement Guide。由同事负责后端的优化(本人只会前端)。他在做的过程中发现本地传回的response并没有进行压缩,所以他教我如何开启本地的压缩来提升性能。所以这篇文章来记录一下如何在IIS中开启压缩以及其他的一些知识点。
基本概念
我们先来了解一下会用到的术语的定义
IIS简介
官方定义: Internet Information Services (IIS)是一个灵活安全便于管理的Web Server用于hosting网络上的任何资源(e.g. media streaming, 网络应用)
主要竞争对手: Apache, Nginx
运行平台: 只能用于Windows系列平台上,虽然免费但是无法单独安装(附带在Windows系统中)。目前IIS Express作为IIS的简化版本可以被独立安装。
注意:IIS的功能默认是关闭的,需要通过Windows Feature设置并开启
知道了IIS是什么以后,我们再来掌握一下这篇文章的主角,HTTP压缩是什么,有几种类型,采用什么算法进行的压缩,效果如何
HTTP压缩
简言之,HTTP压缩就是通过压缩算法减少请求资源的大小从而提高宽带利用率(bandwidth utilization)的方法
HTTP请求的压缩与解压过程
客户端发送请求并告诉服务器端所接受的压缩编码方式(e.g. gzip, deflate, sdch, br),服务器端(也可能是cdn的服务器)接受请求并根据程序的定义和支持的方式压缩相应资源,在压缩资源后生成相应的response header与response body返回给客户端,客户端接收完请求后进行解码和其他的渲染或者重排等工作
browser生成Reqeust Header并通过Accept-Encoding告知服务器端其支持的压缩格式,如果指定多个,则按优先度排列,最希望获取的格式在最前面。如图中,gzip是最优先的压缩格式
服务器端接受请求后按优先级顺序和自己是否选择压缩算法,完成压缩后生成Response Header并在其中通过Content-Encoding的方式来告知Browser其选择的压缩算法,可以是一种或多种压缩算法,取决于服务器和程序本身的设置
注意:Cache的将会是压缩后的资源。
关于动态和静态的问题着实困扰了我很久,查看了一些资料才分清楚。在IIS和Web Application中,动态静态其实包括两个方面,其一是我开始理解的动态内容和静态内容,但是还有另外一个概念是动态压缩和静态压缩。
让我们先来区分一下什么是Web Application的动态内容和静态内容。在IIS中,用戶可以设置对两种内容的进行压缩,静态的和动态的。
两种内容形式
静态内容指文件并不会根据用户输入发生改变,e.g. JS, CSS, Image and HTML。再如项目一般都有HTML模板,通常不同页面的Navigation或者footer部分都是固定的。而这些内容就会作为Web Application的静态内容
动态内容指存储于数据库并且当用户浏览时动态生成或者改变的内容。指来自ASP.NET, PHP, ASP或其他框架的response
两种压缩方式
动态压缩对于配置在dynamicTypes中的mime类型的请求启用,即每一次请求,server都会对请求的内容进行压缩但是不进行缓存。而静态压缩对于配置在staticTypes中的mime类型的请求启用,当文件第一次被请求时,IIS会将其压缩,然后放入临时文件夹,之后再次对该文件的请求将直接读取临时文件夹中压缩后的版本而不是重新压缩。默认情况下IIS是采取static compression和pre-compression方式的并且会自动保存静态内容在硬盘上。至于哪些类型的文件使用动态压缩哪些使用静态压缩是可以在applicationHost.config(目前只在Windows找到了IIS Express的这个文件但是不能用于IIS)中设置的。这种压缩方式依赖于两个Modules,dynamic module(compdyn.dll)和static module(compstat.dll)。
压缩算法GZIP简介
GNU zip(gzip)是compress压缩方法的替代者,使用gzip压缩后会生成.gz后缀的文件。在Windows中已经包括了gzip的库c:\windows\system32\inetsrv\gzip.dll
IIS压缩的优势
极大的压缩了文件大小,尤其是对于纯文本类型的文件。压缩比甚至可高达70%
缺点
消耗额外的CPU资源用于解压
如何启用本地IIS的压缩
在本地IIS中开启gzip之后只有部分的css文件被gzip了,其他的静态文件并没有被压缩。目前查了资料但是还没有能够成功在本地项目使用gzip。
压缩效果
通过几个文件我们来看下gzip的压缩效果
- signalR 2.2.1
minify之前: 123KB
minify之后: 36.3KB
minify & gzip之后: 11.3KB
可以看到压缩后是原大小的十分之一左右,即使是于minify的版本相比依然减少了三分之二 - 打包的多个js文件bundle.js
minify之前: --
minify之后: 5.74MB
minify & gzip之后: 0.8MB (Response Header中的content-length的单位是byte)
references
- https://www.iis.net/
- !https://www.iis.net/overview/reliability/dynamiccachingandcompression
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Compression
- https://vwo.com/knowledge/dynamic/
- http://support.exsitewebware.com/cgi/page.cgi/articles.html/Content_Management/Static_vs_Dynamic_Content
- https://msdn.microsoft.com/en-us/library/ms750613.aspx
- http://stackoverflow.com/questions/200839/whats-the-difference-between-staticresource-and-dynamicresource-in-wpf
- https://technet.microsoft.com/en-us/library/cc730629(v=ws.10).aspx微软官方给出的enable compression不同的方法
- http://www.gzip.org/