83-nginx-2-代理缓存

概述

nginx代理缓存是代理服务器缓存,当有用户A第一次访问后,下一次别的用户访问(或用户A第二次用别的浏览器访问),就会使用缓存,提升访问速度。

配置

test.conf

proxy_cache_path cache levels=1:2 keys_zone=my_cache:10m;

server {
   listen       80;
   server_name  test.com;

   location / {
       proxy_cache my_cache;
       proxy_pass   http://127.0.0.1:8888;
       proxy_set_header Host $host;
   }
}

proxy_cache_path cache levels=1:2 keys_zone=my_cache:10m;

第一个参数指定缓存保存的本地路径

levels参数负责设置缓存目录级别

当levels=1:2时,表示是两级目录,1和2表示用1位和2位16进制来命名目录名称。

在此例中,第一级目录用1位16进制命名,如b;第二级目录用2位16进制命名,如2b。所以此例中一级目录有16个,二级目录有16*16=256个:/cache/b/2b/d7b6e5978e3f042f52e875005925e51b

总目录数为16*256=4096个。

keys_zone参数用来为这个缓存区起名
10m 指内存缓存空间大小为10MB


proxy_cache my_cache;使用定义的缓存区

服务

nginx-cache/test.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <div>This is content, and data is: <span id="data"></span></div>
  <button id="button">click me</button>
</body>
<script>
  var index = 0
  function doRequest () {
    var data = document.getElementById('data')
    data.innerText = ''
    fetch('/data', {
      headers: {
        'X-Test-Cache': index++
      }
    }).then(function (resp) {
      return resp.text()
    }).then(function (text) {
      data.innerText = text
    })
  }
  document.getElementById('button').addEventListener('click', doRequest)
</script>
</html>

nginx-cache/server.js

const http = require('http')
const fs = require('fs')

const wait = (seconds) => {
  return new Promise((resolve) => {
    setTimeout(resolve, seconds * 1000)
  })
}
http.createServer(function (request, response) {
  console.log('request come', request.url)

  if (request.url === '/') {
    const html = fs.readFileSync('test.html', 'utf8')
    response.writeHead(200, {
      'Content-Type': 'text/html'
    })
    response.end(html)
  }

  if (request.url === '/data') {
    response.writeHead(200, {
      'Cache-Control': 'max-age=2, s-maxage=20, private',
      'Vary': 'X-Test-Cache'
    })
    wait(2).then(() => response.end('success'))
  }
}).listen(8888)

console.log('server listening on 8888')

max-age: 客户端缓存时长

s-maxage:代理服务器缓存时长

private:仅客户端可缓存

Vary:仅当设置的属性值一致时使用缓存

注意:修改代码看效果时,需要重启node服务