Nginx 缓存作为性能优化的一个重要伎俩,能够极大加重后端服务器的负载。上面咱们将介绍 Nginx 缓存配置的相干指令以及 http 缓存机制,以及 Nginx 缓存实际案例剖析。

Nginx 缓存示例

实例演示,缓存是怎么呈现的,怎么查看!

当咱们代开某个网站,如 baidu.com,咱们能够看到 size 这一列有一些 js 标识为 disk cache,这里就是利用到了缓存。

HTTP 缓存机制

HTTP 的缓存流程如下图所示

缓存,能够分为强制缓存和比照缓存

Nginx 强制缓存

介绍强制缓存是什么?以及可能造成这个起因的配置参数!

浏览器不会向服务器发送任何申请,间接从本地缓存中读取缓存数据并返回 200 状态码,如下图所示。如果缓存过期再找服务器,其过程如下:

能够造成强制缓存的字段,有如下几个:

Expires

地位: HTTP Response Header

阐明: Expires 是服务端返回的到期工夫。如果下一次申请如果小于服务端返回的过期工夫,则间接应用缓存数据。Expires 是 HTTP1.0 的货色,当初浏览器默认都是应用 HTTP1.1。而且因为该值是有服务端生成,而客户端的工夫和服务端的工夫有可能不统一,导致存在肯定误差。所以 HTTP1.1 应用 Cache-Control 代替。

# 示例Expires: Mon, 22 Jul 2019 11:08:59 GMT
Cache-Control

地位: HTTP Response Header

阐明: 缓存策略定义

  • max-age: 标识资源可能被缓存的最大工夫
  • public: 示意该响应任何中间人,包含客户端和代理服务器都能够缓存
  • private: 示意该响应只能用于浏览器公有缓存中,中间人(代理服务器)不能缓存此响应
  • no-cache: 须要应用比照缓存(Last-Modified/If-Modified-Since/Etag/If-None-Match)来验证缓存数据
  • no-store: 所有内容都不会缓存,强制缓存和比照缓存都不会触发

Nginx 比照缓存

介绍应用缓存和不应用缓存的区别和比照!

浏览器在第一次申请数据时,服务器会将缓存的标识与数据一起返回给浏览器,浏览器将这两个缓存到本地缓存数据库中。

再次申请数据时,就会在申请 header 中带上缓存的标识发送给服务器,服务器依据缓存标识比照,如果发生变化,则返回 200 状态码,返回残缺的响应数据给浏览器,如果未产生更新,则返回 304 状态码通知浏览器持续应用缓存数据。

如下图比拟所示,在第一次申请时,没有应用缓存。而在第二次应用缓存时,能够显著看到两者申请的工夫不一样,后者工夫少很多。这是因为服务端如果进行缓存比拟后发现未更新,只返回 header 局部,并返回 304 状态码告诉客户端应用本地缓存,没有将报文的 body 局部返回给浏览器,所以申请工夫和报文大小才显著优化。别小看这几十毫秒,当访问量很大时,这里就优化了很多工夫、缩小了很多服务器压力。

第一次拜访,未应用缓存:

第二次拜访,应用缓存:

HTTP 申请和响应报文构造如下图所示:

会造成比照缓存的字段如下:

  • Last-Modified

    • 地位: HTTP Response Header
    • 阐明: 第一次申请时,服务器会在响应头里设置该参数,通知浏览器该资源的最初批改工夫。

      # 示例Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
  • If-Modified-Since

    • 地位: HTTP Request Header
    • 阐明: 再次(留神不是第一次)申请服务器时,客户端浏览器通过此字段告诉服务器上次申请时,服务器返回的资源最初批改工夫。服务器收到申请后,发现 header 中有 If-Modified-Since 字段,则与被申请资源的最初批改工夫进行比照。若资源的最初批改工夫大于 If-Modified-Since,则阐明资源被批改过,则响应返回残缺的内容,返回状态码 200。 若资源的最初批改工夫小于或等于 If-Modified-Since,则阐明资源未修改,则返回 304 状态码,通知浏览器持续应用所保留的缓存数据。
  • Etag
  • 地位: HTTP Response Header

    • 阐明: 服务器响应申请时,通知浏览器以后资源在服务器的惟一标识(由服务端生成)。
    • 优先级: 高于 Last-Modified 与 If-Modified-Since

  • If-None-Match

    • 地位: HTTP Request Header
    • 阐明: 再次申请服务器时,通过此字段告诉服务器客户端缓存的资源的惟一标识。服务器收到申请 header 周发现有 If-None-Match 字段,则与被申请资源的惟一标识进行比照。 如果不一样,阐明资源被批改过,则返回残缺的响应,状态码 200。 如果一样,阐明资源未被批改过,则返回 304 状态码,通知浏览器持续应用缓存的数据。

Nginx 缓存实际

理论配置和演示一下,应用缓存的成果!

配置文件的内容,如下所示:

nginxuser  nginx;pid /run/nginx.pid;worker_processes  auto;worker_rlimit_nofile 100000;events {    worker_connections  2048;    multi_accept on;}http {    sendfile on;    access_log off;    error_log  /data/log/nginx-1.0/error.log  error;    proxy_cache_path /data/nginx-1.0/cache levels=1:2 keys_zone=cache_zone:10m inactive=60m;    server {        listen 80;        server_name localhost;        root /usr/local/services/nginx-1.0/html/;        location / {        }        location ~.*\.(gif|jpg|png|css|js)(.*) {            proxy_cache cache_zone;            proxy_cache_valid 200 302 24h;            expires 1d;            add_header X-Proxy-Cache $upstream_cache_status;        }    }}

理论的测试状况,如下所示:

[root@VM_16_4_centos conf]# curl -I http://localhost/test.jsHTTP/1.1 200 OKServer: nginx/1.14.0Date: Sun, 21 Jul 2019 12:35:06 GMTContent-Type: text/plainContent-Length: 12Last-Modified: Sun, 21 Jul 2019 12:33:32 GMTConnection: keep-aliveETag: "5d345b9c-c"Expires: Mon, 22 Jul 2019 12:35:06 GMTCache-Control: max-age=86400Accept-Ranges: bytes

咱们再以图片为例,当咱们第一次申请 http://localhost/google_logo.jpg,服务端返回了该资源的惟一标识 Etag 给咱们。

咱们第二次申请时,能够发现 http 报文的体积和响应实际大大缩减,阐明咱们的缓存发回了作用。

作者: Escape
链接: escapelife.site/posts/b167e14a.html