304缓存
缓存氛围两种
1.强制缓存
强制缓存就是服务器对客户端说多久之内不要再请求我了 直接找缓存
2.协商对比缓存
每次发请求 但是我们服务器可以对比一下,如果可以缓存直接返回304,也可以返回新的内容
cache-control :no-cache 强制缓存
Expires 过期时间 绝对过期时间
last-modified 对比缓存
没有变化返回304 有变化返回内容
if-modifed-since
浏览器
//etag
if-none-match
mime.getType
setHeader('Cache-Control',‘max-age=10’)
// 10秒内不请求我
setHeader('Expires',new Date(Date.now()+10*1000)).toGMTString())
// 兼容方法
浏览器disable-cache 全部禁用缓存
不能一直设置强制缓存
换粗 策略应该配合协议缓存
文件的最后修改时间告诉客户端
res.setHeader('Last-Modified',statObj.ctime.toGMTString())
浏览器再次来时 会带一个头req.headers['if-modified-since']
if you这个时间 和我上次的是不是一个 如果是 则走缓存 返回304 否则 返回新的文件
res.statsCode = 304 res.end()
createReadStream(realPath).pipe(res)
有误差
文件修改频繁 时间可能会有偏差
一秒内改了多次
CDN文件分配到不同服务器上 分发时间不同导致缓存失效
etag 的方式配合
111 xxx
xxx helloword xxs
文件内容判断
需要读取文件的内容对比
md5摘要算法 不叫加密算法 不可逆
require('crypto')// 加密用
node自带核心模块
sha1 sha256
crypto.createHash('md5').update('helloword').digest('base64')
md5摘要的长度是一样的 new Buffer()
加盐算法
sha1 sha256n 多了一个密钥 cookie
let scret = 'jasd'
crypto.createHmac('sha256',scret).update('sds').digest('base64')
res.setHeader('Etag','')
let re =fs.createReadStream(realPath);
rs.on('data',function(data){
md5.update(data)
})
res.on('end',function(){
let r = md5.digest('base64');
if(res.headers['if-no-match']===r){
res.statusCode = 304
res.end()
} else {
res.createReadStream(realPath).pipe(res)
}
res.setHeader('Etag',r)
res.setHeader('content-Type',mime.getType(realPath))
})
if-none-match 搭配使用
两种对比缓存 一种强制缓存 CDN频繁修改文件的需要另一种缓存
对比文件
压缩
compress:true
压缩转化流
zlib = require('zlib') // 核心模块
gzip
响应头
Content-Encoding:gzip
let fs=require('fs')
let file = fs.createReadStream('./download.txt')
file.pipe(zlib.createGzip()).pipe(fs.createWriteStream('1.gz'))
浏览器会询问我支持哪种压缩
Accept-Encodinng:gzip,deflate,br
服务器Content-Encoding:gzip 使用了哪种压缩
res.headers['accept-encoding']
encoding.test(/\bgzip\b/)
host 主机 host === referer 防盗链
虚拟主机
两个域名 挂在同一个服务器上
都是80端口
www.zh1.cn 代理localhost:3001
www.zh2.cn 代理 locahost:3002
代理 跨域proxy
常见的两种代码
正向代理 知道代理的存在 跳版机代理服务器做验证
反向代理 。 nginx 不知道代理的存在
nginx做负载均衡 转发到不同的服务器上
showdowbox
http-proxy 实现http代理 基于request
http-proxy-middleware
require('http-proxy')
let map = {
'w1.cn':'http://localhost:4000',
'w2.cn':'http://localhost:4001'
}
let http = require('http')
let proxy = httpProxy.createProxyServer()
http.createServer(function(req,res){
let head = req.headers['host']
proxy.web(req,res,{
target:map[head]
})
})
// 反响代理