304详解 gzip压缩 虚拟主机

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]

})

})

// 反响代理

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值