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 缓存实际
理论配置和演示一下,应用缓存的成果!
配置文件的内容,如下所示:
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 给咱们。
咱们第二次申请时,能够发现 http 报文的体积和响应实际大大缩减,阐明咱们的缓存发回了作用。
作者: Escape
链接: escapelife.site/posts/b167e14a.html