主要内容
- nginx配置浏览器缓存
- nginx的Gzip配置
1. nginx配置浏览器缓存
1.1 缓存效率的测试
在上节中我们讲解到缓存能够通过在服务器中对查询的数据建立一个副本,这样一来对于之后的查询将不再经过后端服务器的逻辑查询,而是由缓存服务器直接给出接口数据并返回,这样既减少了后端服务器负载以及网络消耗。
下面我们对同一接口在使用缓存以及不使用缓存的情况下qps的测试:
测试后端服务器代码:
<?php
$host = "127.0.0.1";
$username = "root";
$password = "root";
$dbname = "starsky";
try{
$conn = new PDO("mysql:host=$host;dbname=$dbname",$username,$password);
$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$restful = $conn->prepare("select id,title,author from article where id = 1");
$restful->execute();
$result = $restful->setFetchMode(PDO::FETCH_ASSOC);
$data = [];
foreach($restful->fetchAll() as $k => $v){
$data[$k] = $v;
}
echo json_encode($data);
}catch(PDOException $e){
echo json_encode(["message" => $e->getMessage()]);
}
?>
前端与客户端交互我们分为缓存server与不缓存的server,nginx配置如下:
不加缓存的nginx请求配置:
server
{
listen 80;
server_name www.starsky-nginx.com;
root /www/blog;
index index.html index.php;
location ~ \.php$ {
proxy_pass http://www.blogs-s.com:8080;
}
}
对请求进行缓存的配置:
server
{
listen 80;
server_name www.blogs.com;
root /www/blog;
index index.html index.php;
location /api/ {
proxy_cache imooc_cache;
proxy_pass http://www.blogs-s.com:8080/api/;
proxy_cache_valid 200 304 12h;
proxy_cache_valid any 10m;
proxy_cache_key $host$uri$is_args$args;
include proxy_params;
}
location ~ /clear_cache(.*) {
allow all;
proxy_cache_purge imooc_cache $host$1$is_args$args;
}
}
使用jemter进行测试
- 测试每秒600并发,循环3次
不加缓存的测试结果如下:


通过观察上面的测试结果信息可以看出,在不加缓存的情况下,我们的请求需要经过nginx与客户端建立连接,匹配并转发请求给后端代理服务器,在由后端服务器解析代码连接数据库查询数据,中间的过程是比较长的,也带来了网络io的消耗。此时他的每秒最大处理请求数为506.
下面让我们来看看缓存带来的效果:


通过观察上图中的测试结果,发现每秒最大处理请求数明显处理效率更高,达到了每秒1694的,这是使用缓存与不使用缓存之间的区别。造成这样区别的原因在于缓存不需要再由nginx转发请求,而是由服务器缓存的副本直接命中并给出数据。减少了像后端服务器转发,网络传输等过程。
1.2 nginx浏览器缓存
http缓存控制头介绍
Last-Modified :标示这个响应资源的最后修改时间。web服务器在响应请求时,告诉浏览器资源的最后修改时间。
If-Modified-Since :当资源过期时(使用Cache-Control标识的max-age),发现资源具有 Last-Modified 声明,则再次向web服务器请求时带上头
If-Modified-Since ,表示请求时间。web服务器收到请求后发现有头 If-Modified-Since 则与被请求资源的最后修改时间进行比对。若最后修改时间较新,说明资源有被改动过,则响应整片资源内容(写在响应消息包体内),HTTP 200;若最后修改时间较旧,说明资源无新修改,则响应 HTTP 304 (无需包体,节省浏览),告知浏览器继续使用所保存的 cache 。
2. nginx的Gzip配置
3.1 gzip的指令
- gzip :该指令用于开启或者关闭Gzip 功能
gzip on | off;
默认情况下,该指令设置为off,即不启用Gzip功能。只有将该指令设置为on时,各指令设置才有效。
- gzip_buffers:该指令用于设置Gzip压缩文件使用缓存空间的大小
gzip_buffers number size;
number,指定Nginx服务器需要向系统申请缓存空间的个数。
size,指定每个缓存空间的大小。
根据该配置项,Nginx服务器在对响应输出数据进行Gzip压缩时需向系统申请numbersize大小的空间用于存储压缩数据。从Nginx 0.7.28开始,默认情况下number size 的值为128,其中size 的值取系统内存页一页的大小,为4KB或者8KB,即:
gzip_buffers 32 4k I 16 8k;
- gzip_comp_level:该指令用于设定Gzip压缩程度,包括级别1到级别9。级别1表示压缩程度最低,压缩效率最高;级别9表示压缩程度最高,压缩效率最低,最费时间。
gzip_comp_level level; 默认值设置为级别1。
- gzip_disable : 针对不同种类客户端发起的请求,可以选择性地开启和关闭Gzip功能。该指令从Nginx 0.6.23启用,用于设置一些客户端种类。Nginx服务器在响应这些种类的客户端请求时,不使用Gzip功能缓存响应输出数据。
gzip_disable regex ..·i
其中,regex根据客户端的浏览器标志(User-Agent,UA)进行设置,支持使用正则表达式。
- gzip_http_version:早期的一些浏览器或者HTTP客户端,可能不支持Gzip自解压,因此用户有时会看到乱码,所以针对不同的HTTP协议版本,需要选择性地开启或者关闭Gzip功能。该指令用于设置开启Gzip功能的最低HTTP协议版本。
gzip http version 1.011.1;
默认设置为1.1版本,即只有客户端使用1.1及以上版本的HTTP协议时,才使用Gzip 功能对响应输出数据进行压缩。从目前来看,绝大多数的浏览器都支持Gzip自解压,一般采用默认值即可。
- gzip_min_length:Gzip压缩功能对大数据的压缩效果明显,但是如果压缩很小的数据,可能出现越压缩数据量越大的情况(许多压缩算法都有这样的情况发生),因此应该根据响应页面的大小,选择性地开启或者关闭Gzip 功能。该指令设置页面的字节数,当响应页面的大小大于该值时,才启用Gzip 功能。响应页面的大小通过 HTTP响应头部中的 Content-Length 指令获取,但是如果使用了Chunk编码动态压缩,Content-Length或不存在或被忽略,该指令不起作用。
gzip_min_ length length;
默认设置为20,设置为0时表示不管响应页面大小如何统统压缩。笔者建议将该值设置为1KB或以上,以防止出现数据越压越大的情况:
gzip_min_length 1024;
7.gzip_proxied:该指令在使用Nginx服务器的反向代理功能时有效,前提是在后端服务器返回的响应页头部中,Requests 部分包含用于通知代理服务器的Via头域。关于Nginx服务器的反向代理功能将在本书后面的专门章节介绍。它主要用于设置Nginx服务器是否对后端服务器返回的结果进行Gzip压缩。
gzip_proxied off l expired | no-cache | no-store | private | no_last_modified | any ..·;
off,关闭Nginx服务器对后端服务器返回结果的Gzip压缩,这是默认设
expired,当后端服务器响应页头部包含用于指示响应数据过期时间的 expired头域时,启用对响应数据的Gzip压缩。
no-cache,当后端服务器响应页头部包含用于通知所有缓存机制是否缓存的 Cache-Control头域、且其指令值为no-cache时,启用对响应数据的Gzip压缩。
no-store,当后端服务器响应页头部包含用于通知所有缓存机制是否缓存的Cache-Control头域、且其指令值为no-store时,启用对响应数据的Gzip压缩。
private,当后端服务器响应页头部包含用于通知所有缓存机制是否缓存的Cache-Control头域、且其指令值为private时,启用对响应数据的Gzip压缩。
no_last_modified,当后端服务器响应页头部不包含用于指明需要获取数据最后修改时间的Last-Modified头域时,启用对响应数据的Gzip压缩。
给大家推荐一个网址,其中对HTTPHeader 的各个头域进行了详细的说明: http://en.wikipedia.org/wiki/HTTP_headerso
- gzip_types 指令
Nginx服务器可以根据响应页的MIME类型选择性地开启Gzip压缩功能。该指令用来设置MIME类型,被设置的类型将被压缩。
gzip_types mime-type ...;
其中,mime-type变量的取值默认为texthtml,但实际上,在 gzip指令设置为on时
Nginx服务
器会对所有的texthtml类型页面数据进行Gzip压缩。该变量还可以取“*”,表示对所有MIME类型的页面数据进行Gzip压缩。一般情况下我们压缩常规的文件类型时,可以设置为:
gzip_types text/plain application/x-javascript text/css text/html application/xml;
- gzip_vary指令
该指令用于设置在使用Gzip功能时是否发送带有“Vary: Accept-Encoding”头域的响应头部。该头域的主要功能是告诉接收方发送的数据经过了压缩处理。开启后的效果是在响应头部添加了Accept-Encoding: gzip,这对于本身不支持Gzip压缩的客户端浏览器是有用的。
gzip_vary on | off;
默认设置为off。事实上,我们可以通过Nginx配置的add_header指令强制Nginx服务器在响应头部添加“Vary: Accept-Encoding”头域,以达到相同的效果:
add header Vary Accept-Encoding gzip;
注意
该指令在使用过程中存在bug,会导致IE4及以上浏览器的数据缓存功能失效。