Nginx高性能优化配置实战总结( 二 )


零拷贝第三个基础配置优化是零拷贝,所谓零拷贝的配置是在 Nginx 中的 HTTP 配置模块中添加一个 sendfile on 配置项,它便是一个零拷贝,所谓零拷贝并不代表不拷贝了,而是说它做到了文件的内核态到用户态的零拷贝 。

Nginx高性能优化配置实战总结

文章插图
 
如图所示,如果我们没有使用零拷贝时文件传输是什么样子的?首先 Nginx 在处理文件时,会将文件传入操作系统内核态的 Buffer Cache,然后传递到操作系统上层的用户态,经用户态的 Buffer Cache 再传回内核态中,最后通过 Socket 将文件转发出去 。
这个时候你会发现一个问题,对于静态文件并不需要流转到用户态中,直接通过内核态效率更高,所以这时我们就需要在 Nginx 中开启 sendfile on,这样静态文件就可以通过红色的路径在内核态中完成转发,而不用再去绕道用户态,提高了效率 。
文件压缩Nginx 基础配置优化的最后一项是文件压缩,我们知道服务端往客户端发送的数据越小,占用的延迟越低,用户体验就会越好 。所以往往在代理或 Nginx 中会设置文件压缩,我们主要通过 gzip 方式进行设置,主要的设置项如下:
  • gzip on 负责打开后端的压缩功能;
  • gzip_buffer 16 8k 表示设置 Nginx 在处理文件压缩时的内存空间;
  • gzip_comp_level 6 表示 Nginx 在处理压缩时的压缩等级,通常等级越高它的压缩比就越大,但并不是说压缩比越大越好,还是需要根据实际情况来选择合适的压缩比,压缩比太大影响性能,压缩比太小起不到应有的效果,一般来说推荐你设置成 6 就比较合适;
  • gzip_http_version 1.1 表示只对 HTTP 1.1 版本的协议进行压缩;
  • gzip_min_length 256 表示只有大于最小的 256 字节长度时才进行压缩,如果小于该长度就不进行压缩;
  • gzip_proxied any 代表 Nginx 作为反向代理时依据后端服务器时返回信息设置一些 gzip 压缩策略;
  • gzip_vary on 表示是否发送 Vary:Accept_Encoding 响应头字段,实现通知接收方服务端作了 gzip 压缩;
  • Application/vnd.ms-fontobject image/x-icon; gip 压缩类型;
  • gzip_disable “msie6”; 关闭 IE6 的压缩 。
最后这两项表示设置 zip 的压缩类型及是否关闭 客户端使用 IE6 浏览器请求过来的压缩,以上就是对文件压缩的典型配置,你可以根据具体情况做一些细节上的调整 。
上面就是我们讲了基础优化,但是我们在使用 Nginx 作为代理入口的时候,对于网站优化有效的方式除了需要考虑基础配置优化外,更有用的方式就是优化缓存 。用到缓存优化主要期望提高网站服务访问效率,减少服务端的性能使用 。
缓存配置优化大致可以分为几个部分,分别是浏览器缓存优化、代理缓存优化、HTTPS SSL 缓存优化、KV 服务缓存优化等 。
首先我们需要了解一个问题,客户端如何直观的看到大部分缓存(浏览器缓存、代理缓存、ssl缓存)优化效果呢?推荐你用 Chrome 浏览器中的开发者工具,打开浏览器并点击视图-开发者工具 。例如我们在 URL 地址栏中输入 www.baidu.com 。这个时候我们会看到在 Network 标签栏中会出现对应的访问名称、路径 。然后点击某一个路径,这时会在 Headers 中看到相应的头信息内容 。
我们刚用浏览器打开 www..com 这个网站,表示浏览器发送一次 HTTP 请求,我们能看到服务端会返回给客户端代码经过渲染后的一个效果展示 。如果点击右键查看源代码,这样就可以看到网站返回的 body 内容 。除了 body 之外,一个完整的 HTTP 响应,服务端返回给客户端还有一部分就是 Response Headers,表示服务端返回给客户端的头信息内容 。
上面就是一次 HTTP 请求和响应的过程,如果我们想判断服务端有没有做缓存,缓存的时间是多长 。这些内容都会在头信息中通过服务端展示给客户端,我们可以在 Response Headers 查看头信息 。
比如expires 头信息是控制在什么时间点生成的缓存元素,Cache Control 负责保存这个元素需要缓存多长时间 。
通过使用Chrome 开发者工具我们就能够非常清晰的看到一次页面的打开效果,了解它的请求了是什么(请求头),服务端返回了什么( body及返回 头信息),通过这个工具详细的查看数据并对一个页面缓存情况进行分析,对于开发和运维人员而言是必须要掌握的 。
缓存优化如果缓存的元素在客户端,那么主要有浏览器缓存和 HTTPS 缓存,你可别认为缓存文件是在客户端,这两部分缓存都可以通过 Nginx 进行设置并作主要优化 。


推荐阅读