Nginx 缓存机制详解

admin 2024年12月18日22:17:35评论28 views字数 3817阅读12分43秒阅读模式

Nginx 缓存作为性能优化的一个重要手段,可以极大减轻后端服务器的负载。下面我们将介绍 Nginx 缓存配置的相关指令以及 http 缓存机制,以及 Nginx 缓存实践案例分析。

Nginx 缓存机制详解

Nginx 缓存示例

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

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

Nginx 缓存机制详解

Nginx 缓存机制详解

HTTP 缓存机制

HTTP 的缓存流程如下图所示

缓存,可以分为强制缓存和对比缓存

Nginx 缓存机制详解

Nginx 强制缓存

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

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

Nginx 缓存机制详解

Nginx 缓存机制详解

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

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 状态码告诉浏览器继续使用缓存数据。

Nginx 缓存机制详解

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

第一次访问,未使用缓存:

Nginx 缓存机制详解

第二次访问,使用缓存:

Nginx 缓存机制详解

HTTP 请求和响应报文结构如下图所示:

Nginx 缓存机制详解

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

  • 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

Nginx 缓存机制详解

  • If-None-Match
    • 位置: HTTP Request Header
    • 说明: 再次请求服务器时,通过此字段通知服务器客户端缓存的资源的唯一标识。服务器收到请求 header 周发现有 If-None-Match 字段,则与被请求资源的唯一标识进行对比。如果不一样,说明资源被修改过,则返回完整的响应,状态码 200。如果一样,说明资源未被修改过,则返回 304 状态码,告诉浏览器继续使用缓存的数据。

Nginx 缓存实践

实际配置和演示一下,使用缓存的效果!

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

nginx
user  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.js
HTTP/1.1 200 OK
Server: nginx/1.14.0
Date: Sun, 21 Jul 2019 12:35:06 GMT
Content-Type: text/plain
Content-Length: 12
Last-Modified: Sun, 21 Jul 2019 12:33:32 GMT
Connection: keep-alive
ETag: "5d345b9c-c"
Expires: Mon, 22 Jul 2019 12:35:06 GMT
Cache-Control: max-age=86400
Accept-Ranges: bytes

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

Nginx 缓存机制详解

Nginx 缓存机制详解

我们第二次请求时,可以发现 http 报文的体积和响应实践大大缩减,说明我们的缓存发回了作用。

Nginx 缓存机制详解

Nginx 缓存机制详解

作者: SHUWOOM的博客
链接: https://shuwoom.com/?p=4311#comment-3660
推荐阅读 点击标题可跳转

《Docker是什么?》

《Kubernetes是什么?》

《Kubernetes和Docker到底有啥关系?》

《教你如何快捷的查询选择网络仓库镜像tag》

《Docker镜像进阶:了解其背后的技术原理》

《教你如何修改运行中的容器端口映射》

《k8s学习笔记:介绍&上手》

《k8s学习笔记:缩扩容&更新》

《Docker 基础用法和命令帮助》

《在K8S上搭建Redis集群》

《灰度部署、滚动部署、蓝绿部署》

《PM2实践指南》

《Docker垃圾清理》

《Kubernetes(k8s)底层网络原理刨析》

《容器环境下Node.js的内存管理》

《MySQL 快速创建千万级测试数据》

《Linux 与 Unix 到底有什么不同?》

《浅谈几种常见 RAID 的异同》

《Git 笔记-程序员都要掌握的 Git》

《老司机必须懂的MySQL规范》

《Docker中Image、Container与Volume的迁移》

《漫画|如何用Kubernetes搞定CICD》

《写给前端的Docker实战教程》

《Linux 操作系统知识地图2.0,我看行》

《16个概念带你入门 Kubernetes》

《程序员因接外包坐牢456天,长文叙述心酸真实经历》

《IT 行业老鸟,有话对你说》

《HTTPS 为什么是安全的?说一下他的底层实现原理?

免责声明:本文内容来源于网络,所载内容仅供参考。转载仅为学习和交流之目的,如无意中侵犯您的合法权益,请及时联系Docker中文社区!

Nginx 缓存机制详解

Nginx 缓存机制详解

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月18日22:17:35
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Nginx 缓存机制详解https://cn-sec.com/archives/556775.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息