概述
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服务