为什么要使用gzip压缩
服务端给客户端响应时若启用压缩功能,可以减少传输时所需的带宽,大大提高响应速度。
如上图所示,nginx在把响应报文发送到客户端之前,可以对静态资源文件进行压缩,这样传输文件的大小变得很小,传输速度会大幅度提高,之后浏览器再进行解压,得到所请求的静态资源。
具体配置
先直接上配置文件吧,具体配置如下所示:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location ~* \.(jpg|gif|png)$ {
gzip on;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/json application/x-javascript application
/css application/xml application/xml+rss text/javascript application/x-httpd-php im age/jpeg image/gif image/png;
root /home/picture;
}
location ~* \.(txt|xml)$ {
gzip on;
gzip_http_version 1.1;
gzip_comp_level 2;
root /home/txt;
gzip_types text/plain application/json application/x-javascript application
/css application/xml application/xml+rss text/javascript application/x-httpd-php im age/jpeg image/gif image/png;
}
}
}
可以看到我的配置文件里分别配置了图片静态资源的压缩和txt文件的静态资源压缩。这里是为了之后进行对比,首先我们来分别说明一下每行配置语句的意义。
gzip on; #顾名思义,是开启gzip压缩的配置
gzip_http_version 1.1; #这里指的是gzip应用于http协议的版本,现绝大多数都是http1.1,配置为1.1即可。
gzip_comp_level 2;#这里配置的是gzip的压缩倍率,默认是1,可以配置0-9,但压缩倍率并不是越大越好,因为压缩和解压操作时非常耗费cpu资源的,设置的过高会导致压缩和解压缩的时间变得很长,反而会降低响应时间。
gzip_types #配置需要压缩的静态资源文件类型。
针对不同类型文件的压缩效果对比
话不多说先上图,我们来分别看一下效果吧。
对图片的压缩效果:
可以看到,resource size为578kb,压缩后经过网络传输的图片大小依旧为578kb。这是什么原因?
其实也很简单,jpg和png本来就是一种压缩格式,也就是说图片文件本来就已经被压缩过了,自然再进行压缩也就没有效果了。
那我们再来看一下对txt文件的压缩效果:
可以看到压缩前的大小是1.9MB,压缩后经过网络传输的大小为29.7KB,差距是非常的明显的。再上一张压缩前的效果来对比一下压缩时间吧
可以看到gzip开启前的响应时间是14.33秒,而压缩开启后仅为几百毫秒,对响应速度的提升效果是非常显著的。