文章目录
- 2-0 在Nginx中解决跨域问题
- 2-1 在Nginx中配置静态资源防盗链
- 2-2 Nginx的模块化设计解析
- Nginx安装包说明
- 2-3 Nginx的集群负载均衡解析
- 2-7 四层、七层与DNS负载均衡
- 2-8 OSI网络模型
- 2-9 使用Nginx搭建3台Tomcat集群
- 2-9 使用JMeter测试单节点与集群的并发异常率
- 2-10 负载均衡 - 轮询
- 2-11 负载均衡 - 加权轮询
- 2-12 upstream的指令参数之max_conns![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2ae621af9d0adb15efc35c88635c5e57.png)
- worker进程设置1个,便于测试观察成功的连接
- 2-14 upstream的指令参数之slow_start
- 2-17 upstream的指令参数之down和backup
- 2-19 upstream的指令参数之max_fails和fail_timeout
- 2-21 使用Keepalive提高吞吐量
- 负载均衡之ip_hash
- 2-25 一致性hash算法
- 2-26 负载均衡原理 - url hash 与 least_conn
- 2-28 Nginx控制浏览器缓存 - 1
- 2-29 Nginx控制浏览器缓存 - 2
- 2-30 Nginx的缓存
- 2-31 Nginx的反向代理缓存
- 2-33 使用Nginx配置SSL证书提供HTTPS访问(无云服务,暂未实现)
- 2-34动静分离的那些事儿
2-0 在Nginx中解决跨域问题
跨域问题
跨域问题的本质:两个站点域名不一样,就会出现跨域问题。所以跨域问题的本质是域名不同。
跨域问题的出现是出于安全问题,浏览器拒绝跨站点的访问,从而限制ajax从一个站点向另一个站点请求或访问资源,W3C标准规范
CROS跨域资源共享
CROS:全称Cross-Origin Resource Sharing,允许浏览器向跨Origin的服务器发起js请求获取响应。
解决跨域的常用形式:Jsonp、StringBoot Cors、Nginx。
axios测试跨域
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
// 为给定 ID 的 user 创建请求
axios.get('http://www.imooc.com:90/imooc/img/face1.png')
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
</script>
</body>
</html>
解决跨域问题
SpringBoot配置
/**
* @Description: 跨域访问
* @Author: hmm
* @Date: 2021/7/18
*/
@Configuration
public class CorsConfig {
public CorsConfig(){
}
@Bean
public CorsFilter corsFilter(){
// 1.添加cros配置信息
CorsConfiguration config = new CorsConfiguration();
// tomcat部署前端项目url
config.addAllowedOrigin("http://192.168.168.11:8080");
// nginx部署前端项目url
config.addAllowedOrigin("http://192.168.168.11:90");
config.addAllowedOrigin("http://192.168.168.11:89");
// 放行所有站点
config.addAllowedOrigin("*");
// 设置是否发送coolie信息
config.setAllowCredentials(true);
// 设置允许的请求方式
config.addAllowedMethod("*");
// 设置允许的header
config.addAllowedHeader("*");
// 2.为url添加映射路径
UrlBasedCorsConfigurationSource corsSource = new UrlBasedCorsConfigurationSource();
corsSource.registerCorsConfiguration("/**", config);
// 3.返回重新定义好的corsSource
return new CorsFilter(corsSource);
}
}
Nginx跨域配置支持
修改imooc.conf,在相关server模块添加如下配置:
#允许跨域请求的域,*代表所有
add_header 'Access-Control-Allow-Origin' *;
#允许带上cookie请求
add_header 'Access-Control-Allow-Credentials' 'true';
#允许请求的方法,比如 GET/POST/PUT/DELETE
add_header 'Access-Control-Allow-Methods' *;
#允许请求的header
add_header 'Access-Control-Allow-Headers' *;
2-1 在Nginx中配置静态资源防盗链
网站的图片、视频等资源如果不想被其他网站引用,可加入防盗链功能,加入后则只能自己域名访问,其他域名一概不能访问.
# 对源站点验证
valid_referers *.imooc.com;
# 非法引入会进入下方判断
if ($invalid_referer) {
return 404;
}
2-2 Nginx的模块化设计解析
Nginx模块
-
nginx core:实现了一部分的底层通信协议,为其他模块、nginx进程等提供运行时的环境,可以看作JVM。
-
event module:事件模块 (linux默认的事件机制:epoll,是操作系统层面的事件处理机制)。
-
phase handler:处理客户端请求以及相应内容的响应
-
output filter:过滤器,会过滤一部分的内容,把内容再返回到浏览器,再去做响应。例如gzip,压缩的过程就是过滤的过程。
-
upstream:反向代理模块,会把真正的请求转发到真实的服务器,去响应真实的内容。
-
load balancer:负载均衡,实现集群、负载均衡的一些配置。
-
extend module:继承模块,相当于第三方模块 。
Nginx安装包说明
- auto 自动:nginx会自动检测识别操作系统和编译脚本
- CHANGES:历史版本号,包含nginx的一些历史版本信息
- CHANGES.ru:俄罗斯版本
- conf 配置 :默认存放的配置文件,安装完毕后会将 安装包conf 目录中的文件 拷贝到安装目录中
- configure:做编译配置
- contrib:提供相应工具
- html:默认存放的一些静态文件,安装完毕后会将 安装包html 目录中的文件 拷贝到安装目录中
- LICENSE:说明,协议说明等
- Makefile:编译make之后生成的文件
- man:nginx守则
- objs:整合第三方插件,安装完毕后会放在objs下方
- README:
- src:nginx源码
- core:核心源码
- event:事件处理的一些机制,封装了相应的方法、模块;
- http:upstream 反向代理;upstream_round_robin 负载均衡
- mail:nginx可以作为一个邮件的代理服务器去收发邮件的
- misc:辅助的功能、辅助的代码
- os:操作系统 和系统级别的封装在这里
- stream:流 包含upstream反向代理流
CHANGES文件:
conf目录:
html目录:
2-3 Nginx的集群负载均衡解析
单节点
很累---> 压力大
生病---> 服务器瘫痪
虽说单节点处理,按正常理论上来说,请求多少都会处理完,,但是会有瓶颈,多节点就是为了解决瓶颈问题
集群
优点:整体性能高、效率高
缺点:成本提高
原则:1 + 1 > 2
集群与负载均衡
Nginx的作用:网关、反向代理器、负载均衡器
upstream:所有的tomcat服务器,代表上游服务器。
注意:用户的所有请求都会有可能到达集群中其它任意一个tomcat节点,这就涉及到nginx的负载均衡。
负载均衡:把用户的所有请求平均的分配的其他后台的所有tomcat节点,当然也可以根据每一个后台服务器本身能承载的并发量大小,去根据它的权重去配置,也可以根据url地址到达某些特定的tomcat里。
当Tomcat1服务器挂了,由于它在这个集群环境中,虽然之前的请求访问了Tomcat1,当它挂了后,以后请求不会再去访问Tomcat1,而是向其他服务器去请求。
2-7 四层、七层与DNS负载均衡
负载均衡的作用:
- 能够为企业网络设备或者服务器带来更好的服务,提高吞吐量、提升并发性能、增强服务器的处理能力。
- 可以提高服务器计算能力,使得我们的网络设备更加灵活。
- 当有大量的并发请求来到服务器的时候,能够把这些请求分配到多台计算机节点上,让更多的节点来处理请求和响应,如此就可以大大缩减用户请求的等待时间。
四层负载均衡
四层负载均衡是基于IP + 端口的负载均衡。
原理是通过转发请求到后台的服务器,它只负责转发并且会记录当前连接是由哪个服务器处理的,后续这个连接的请求就会由同一台服务器去处理,其实相当于长连接,这个长连接一旦打开就会一直处理连接的状态,它的性能就会非常高。
四层是基于传输层的,主要基于 TCP和UDP。
1.F5硬负载均衡
- 基于硬件的硬负载均衡,功能强,性能高,稳定性好
- 商业级别的负载均衡,很贵,因为是基于硬件的
2.LVS四层负载均衡
- 是Linux内核的四层负载,和协议无关,主要负责转发一些请求的,是基于CS端的
3.Haproxy四层负载均衡
- 支持转发功能,灵活性非常高,除了四层以外也能够做七层的负载均衡
4.Nginx 四层负载均衡
- 新版本里也能够做四层负载均衡,一般还是做七层负载均衡,以七层为主,主要是基于HTTP的一个负载均衡
- 在nginx1.9版本后,新增了一个基于stream的四层负载均衡,可以用于实现四层协议的转发、代理等等
七层负载均衡
七层负载均衡是基于URL或IP的负载均衡,是基于应用层的,是针对于HTTP协议的一个负载均衡。
1.Nginx七层负载均衡:
- 对http协议或邮箱协议做负载均衡,性能强劲
2.Haproxy七层负载均衡:
- 灵活性很高
3.apache七层负载均衡:
- 性能远不如nginx高,当并发达到百万级别后性能会越来越差
四层与七层负载均衡对比
四层
- 一般会使用LVS;
- 四层负载均衡主要适用于处理基于tcp、udp协议的负载均衡;
- 四层是用于转发请求,而不是处理请求,它可以把用户请求转发给其他应用去处理。
举例:黄牛不会处理用户诉求,只会把票卖你,比如想买第一排的票,但是他没有,你爱买不买,买了后也需要自己去找座位。
七层
- 主要使用Nginx。
- 七层一般用于处理http协议的,适用于web服务器,比如tomcat、apache、nginx;
- 七层是会处理请求的,比如Nginx可以去处理(压缩或者缓存)静态资源等内容。
举例:售票处可以根据用户需求处理, 会提供一些相应服务。
DNS地域负载均衡
客户端与DNS服务器交互,从DNS服务器获取当前的某一个IP,通过域名解析到的IP(是后端某个服务器的公网IP),DNS会根据客户端所在地域去进行反馈,采取请求的就近原则访问最近的服务器。
优点:所有的负载均衡工作交由DNS服务器去处理,根据IP地址采用就近原则访问最近的服务器,提高用户的访问速度。
2-8 OSI网络模型
OSI网络模型
网络模型就是OSI(Open System Interconnect),意思为开放网络互联,是由国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)共同出版的,他是一种网络互联模型,也是一种规范。
网络模型分为七层,也就是当用户发起请求到服务器接收,会历经七道工序,或者说用户利用互联网发送消息给另一个用户,也会历经七道工序。这七层可分为:
层级 | 名称 | 说明 | 对应网络协议 |
---|---|---|---|
第七层 | 应用层 | 与用户交互 | HTTP、HTTPS、FTP、SMTP、POP3 |
第六层 | 表示层 | 定义数据格式以及数据加密 | Telnet、Rlogin、SNMP、Gopher |
第五层 | 会话层 | 创建、管理以及销毁会话 | SMTP、DNS |
第四层 | 传输层 | 创建、管请求端到响应端(端到端)的连接 | TCP、UDP |
第三层 | 网络层 | 请求端的IP地址 | IP、ICMP、 ARP、 RARP、 AKP、 UUCP |
第二层 | 数据链路层 | 提供介质访问与链路管理 | FDDI、Ethernet、Arpanet、PDN、 SLIP、 PP |
第一层 | 物理层 | 传输介质、物理媒介 | IEEE 802.1A、IEEE 802.2到IEEE 802.11 |
以上七层每层可以与上下相邻层进行通信。
-
应用层(Application):
这是面向用户的,最靠近用户,为了让用户和计算机交互,在计算机里会有很多软件,比如:eclipse、idea、qq、nginx等,这些都是应用软件,用户可通过这些应用软件和计算机交互,交互的过程其实就是接口的调用,应用层为用户提供了交互的接口,以此为用户提供交互服务。
最常见的协议有:HTTP、HTTPS、FTP、SMTP、POP3等。Nginx在本层,为七层负载均衡。
举例:我要寄一封信给远在天边的老外LiLei,会打开快递软件下单,这个时候我是用户,快递软件是应用服务,是建立在计算机上的,提供给用户交互的一种服务或称之为手段。 -
表示层(Presentation):
该层提供数据格式编码以及加密功能,确保请求端的数据能被响应端的应用层识别。
举例:我写中文给LiLei,他看不懂,这时我就会使用翻译软件把中文译成英文,随后信中涉及到一些比较隐私的信息我会加密下,这个时候翻译软件和加密器就充当了表示层的作用,他用于显示用户能够识别的内容。 -
会话层(Session):
会话可以理解为session,请求发送到接受响应的这个过程之间存在会话,会话层充当了这一过程的管理者,从创建会话到维护会话最后销毁会话。
举例:我每次写信给LiLei都会记录在一个小本本上,寄信时间日期、收信时间日期、这本上存有每次通信记录,这小本本相当于是一个会话的管理者。或者说,平时在打电话,首先需要拨打电话,这是建立会话,对方接听电话,此时正在通话(维持并管理会话),通话结束后会话销毁,那么这也是一次会话的生命周期。 -
传输层(Transport):
该层建立端到端的连接,它提供了数据传输服务,在传输层通信会涉及到端口号。
本层常见协议:TCP、UDP。LVS在传输层,也就是四层负载均衡。
TCP(transmission control protocol –传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据)
UDP(user datagram protocol–用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。
举例:我和LiLei通信过程中会借助快递公司,快递公司会分配快递员取件和寄件,那么这个快递员则充电传输层的作用。 -
网络层(Network):
网络通信的时候必须要有本机IP和对方的IP,请求端和响应端都会有自己的IP,IP相当于你家地址门牌号,在网络上云服务器有固定的公网IP,普通计算机也有,只不过是动态IP,运营商每天会分配不同的IP给你的计算机。所以网络层也称之为IP层,IP是互联网的基础根本,能提供IP分配的设备则为路由器或交换机。
举例:对于拥有固定IP的云服务来说,它们都是由腾讯云、阿里云等这样的供应商提供,他们为云服务器提供固定IP;电信、移动、联通等运营商为你的计算机动态分配IP,每天都不同;则这些供应商和运营商都是网络层。同理,快递员由物流公司分配和管理,物理公司就是网络层。 -
数据链路层(Data Link):
这一层会提供计算机MAC地址,通信时会携带,为了确保请求投递正确,所以他会验证检测MAC地址,以确保请求响应的可靠性。
举例:快递员在投递派送的过程中,他(或客服)会预先打电话给你,确认你家的地址对不对、有没有人、货到付款有没有准备好钱等,这时快递员(或客服)就充当了数据链路层的职责。 -
物理层(Physical):
端到端请求响应过程中的媒介,物理介质,比如:网线、中继器等设备,都是你在端到端交互过程中不可缺少的基础设备。
举例:快递员在投递的过程中,你写的信会历经已写交通运输工具,比如首先通过飞机运输到国外,在海关统一拿到信以后会通过汽车运输到LiLei所在城市的物流集散地,最后快递员通过三轮电瓶车寄到LiLei家里,这时飞机、汽车、三轮电瓶车都是物理层的媒介。
参考:
OSI七层模型及TCP/IP四层模型
OSI七层协议模型、TCP/IP四层模型和五层协议体系结构之间的关系
2-9 使用Nginx搭建3台Tomcat集群
实际案例
1、实际使用2台服务器:
Nginx:192.168.168.11:81
Tomcat1:192.168.168.11:8080
Tomcat2:192.168.1.5:8080
2、修改imooc.conf文件:
# 配置上游服务器
upstream www.tomcats.com {
server 192.168.168.11:8080;
server 192.168.1.5:8080;
}
server {
listen 81;
server_name www.tomcats.com;
location / {
proxy_pass http://tomcats;
}
}
3.SwitchHosts配置域名
4.访问Nginx
Nginx:192.168.168.11:81 、 www.tomcats.com:81
实际是以Nginx的形式访问到Tomcat集群
upstream配置一台server,其实是反向代理功能;
配置多台,就是Tomcat集群
2-9 使用JMeter测试单节点与集群的并发异常率
2-10 负载均衡 - 轮询
轮询:
- 负载均衡中最简单的,也是默认的策略;
- Nginx不会去管服务器的硬件性质,只会将请求平均的分配到每一台集群服务器上;
Nginx 负载均衡默认使用轮询机制: - 工作量平均分配
- 适用于服务器性能配置一致的环境中
- 最基础的负载均衡策略
三台服务器,按照第一台,第二台,第三台,依次循环
2-11 负载均衡 - 加权轮询
- 服务器的配置可能不同,高的配置可以接受更多的请求,低的配置接受更少的请求
- 使用权重属性来实现加权轮训——使用weight属性来配置,如果不配置,默认为1
- 值越低,接受的请求越少
# 配置上游服务器,通过weight配置权重
upstream www.tomcats.com {
server 192.168.168.11:8080;
server 192.168.1.5:8080 weight=2;
}
server {
listen 81;
server_name www.tomcats.com;
location / {
proxy_pass http://tomcats;
}
}
2-12 upstream的指令参数之max_conns
指令参数max_conns
用于限制一台服务器的最大连接数,(服务器指的是配置到upstream的服务器);
根据服务器本身能承受的最大流量去配置合适的数值,默认值是0,表示没有任何限制,如果有设置数值,用于服务器的过载保护,起到保险丝的作用,也就是限流;
老版本中商业版才能使用,新版本可以使用;
在使用多个工作进程worker process时,会使用到共享内存,每个工作进程都能生效 。
配置
worker进程设置1个,便于测试观察成功的连接
# worker进程设置1个,便于测试观察成功的连接数
worker_processes 1;
upstream tomcats {
server 192.168.168.11:8080 max_conns=2;
server 192.168.1.5:8080 max_conns=2;
}
1、修改imooc.conf:
2、修改nginx.conf:
3、jmeter测试max_conns:
502错误表示拒绝服务(因为达到连接的上限)
2-14 upstream的指令参数之slow_start
slow_start
slow_start代表缓慢的加入到集群中,当期望服务器加入到集群中不直接接受大量请求时使用。
slow_start当负责均衡策略为轮询并且配置了(weight)权重时才有效,默认值为0秒,在配置的时间内,会把权重从0到配置的值进行递增。
可以用来观察流量从少到多的一个过程。
当负载均衡策略时hash和rendom时无效。
当upstream中配置单个服务器时无效。
在商业版中才有这个参数。
配置
upstream tomcats {
server 192.168.168.11:8080 weight=6 slow_start=60s;
server 192.168.1.5:8080 weight=2;
}
注:
该参数不能使用在hash和random load balancing中。
如果在 upstream 中只有一台 server,则该参数失效。
2-17 upstream的指令参数之down和backup
down
down 标识服务器状态为不可用状态, 配置为down之后,服务器不可用了;
down用于标记服务节点不可用。
upstream tomcats {
server 192.168.168.11:8080 down;
server 192.168.1.5:8080 weight=2;
}
backup
backup表示当前服务器节点是备用机,只有在其他的服务器都宕机以后,自己才会加入到集群中,被用户访问到:
upstream tomcats {
server 192.168.168.11:8080 backup;
server 192.168.1.5:8080 weight=2;
}
注:backup参数不能使用在hash和random load balancing中。
2-19 upstream的指令参数之max_fails和fail_timeout
max_fails和fail_timeout 需配合使用
max_fails
max_fails:表示失败几次,则标记server已宕机,剔出上游服务。默认值为1.
fail_timeout
fail_timeout:表示失败的重试时间。默认值为10s.
配置
max_fails=2 fail_timeout=15s
如上配置,则代表在15秒内请求某一server失败达到2次后,则认为该server以及挂了或宕机了,随后再过15秒,这15秒内不会有新的请求到达刚刚挂掉的节点上,而是会请求到正常运作的server,15秒后会再有新请求尝试连接挂掉的server,如果还是失败,重复上一过程,直到恢复。
2-21 使用Keepalive提高吞吐量
keepalived: 设置长连接处理的数量
proxy_http_version:设置长连接http版本为1.1
proxy_set_header:清除connection header 信息
upstream tomcats {
server 192.168.168.11:8080;
keepalive 32;
}
server {
listen 81;
server_name www.tomcats.com;
location / {
proxy_pass http://tomcats;
# 设置长连接http版本为1.1:http1.1版本支持长连接,默认1.0
proxy_http_version 1.1;
# 清除connection header 信息:提高解析请求效率
proxy_set_header Connection "";
}
}
keep-alive 32; 保持长连接数最大为32个,减少创建关闭连接损耗
吞吐量对比
- 配置前
- 配置后
负载均衡之ip_hash
hash算法 (和HashMap类似)
将用户的ip,通过hash算法得到的值 去 % 当前能够使用的服务器数量得到一个下标值;然后该下标值就决定用户请求落到哪一台服务器上;
上述所有的IP前三段内容一致,当使用不同的内网计算机节点,去访问网页时,都会访问到同一个后端服务;不同的外网去测试时,去访问网页时,会访问到不同的后端服务。
虽然用户会话可以保证在同一个tomcat里,但是有时用户IP会动态变化,导致会话有可能拿不到。
对于同一个用户,是可以访问到固定的tomcat,如果这个用户发起大量并发请求,可能会导致被访问的服务器宕机。
不能把后台服务器直接移除,只能标记down。要不然hash算法会发生更改,那么所有的算法会重新计算,会导致所有的用户会话、缓存失效。
配置
upstream tomcats {
ip_hash;
server 192.168.168.11:8080;
server 192.168.1.5:8080;
}
server {
listen 81;
server_name 192.168.168.11;
location / {
proxy_pass http://tomcats;
}
}
参考:
http://nginx.org/en/docs/http/ngx_http_upstream_module.html#ip_hash
2-25 一致性hash算法
hash算法带来的问题
当Tomcat3宕机了,模数从3变为2,之前所有的求模都要重新计算.
总结:
不管服务器节点增加或减少(宕机),hash算法都会重新进行计算,重新计算会导致用户在原来服务器的会话全部会丢失,并且在原服务器设置的缓存也会请求不到,最终会造成用户的请求时间更多。
解决方案: 一致性hash算法
根据服务器的ip或者主机名进行hash,使服务器分布在0 ~ (2^32-1)的圆环上(按顺时针方向放置),用户请求会根据顺时针方向的就近原则访问到某一个节点服务器。
服务器减少:
节点3服务器宕机了,原来访问节点3的用户请求会访问到节点4,节点3的缓存、会话会丢失,但是其余用户访问无改变。
服务器增加:
总结:
一致性hash算法可以保证绝大多数的用户请求依然能访问到原来的节点服务器,仅仅只有一部分用户请求会发生更改,这样会大大减少hash算法的风险。
2-26 负载均衡原理 - url hash 与 least_conn
负载均衡之url hash
假设account(某一个url)有大量请求,Tomcat3会导致过热,这时可以把Tomcat3替换成Nginx,这台Nginx下方可以挂多个Tomcat。
配置:
upstream tomcats {
# url hash
hash $request_uri;
server 192.168.168.11:8080;
server 192.168.1.5:8080;
}
server {
listen 81;
server_name www.tomcats.com;
location / {
proxy_pass http://tomcats;
}
}
负载均衡之least_conn
Tomcat3服务器连接数少,当有新请求时,请求都会访问Tomcat3。
根据最少连接数进行请求。
upstream tomcats {
# url hash
# hash $request_uri;
# 最少连接数
least_conn;
server 192.168.168.11:8080;
server 192.168.1.5:8080;
}
server {
listen 81;
server_name www.tomcats.com;
location / {
proxy_pass http://tomcats;
}
}
2-28 Nginx控制浏览器缓存 - 1
反向代理器的资源文件会缓存到浏览器,上游服务器包含静态文件会缓存到nginx端。
浏览器的缓存会加速单个用户(当前浏览器的访问者)的访问。
nginx端的缓存会优化内网的传输,nginx在获取上游服务器的资源时,也会去做请求,会有内网带宽的损耗,需要有一个请求和响应的时间,如果上游服务器的静态资源缓存到 nginx 端,内网的损耗就没那么大了,也会减少用户整个请求的响应时间。
演示
- home/imooc目录下新建cache.html
- imooc.conf配置文件
server {
listen 90;
server_name localhost;
location / {
root /home/foodie-shop;
index index.html;
}
# 注:使用root时, imooc必须在home路径后
location /imooc {
root /home;
}
location /static{
alias /home/imooc;
}
}
- 强制刷新
http://192.168.168.11:90/static/cache.html
页面,代表初次访问
初次访问:状态码是200(重新获取文件),大小534B,时间167ms
- 第2次访问http://192.168.168.11:90/static/cache.html
页面
状态码是304(304代表是缓存)
- 浏览器设置禁用缓存,无论刷新多少次,状态码都是200
expires 指令
对于浏览器的缓存,可以使用expires指令做一定的控制,主要是针对一些静态资源文件缓存,比如 html、css、js、图片等。
expires [time]
- 配置imooc.conf
server {
listen 90;
server_name localhost;
location / {
root /home/foodie-shop;
index index.html;
}
# 注:使用root时, imooc必须在home路径后
location /imooc {
root /home;
}
location /static{
# 缓存设置
expires 15s;
alias /home/imooc;
}
}
- 刷新页面
请求的响应头部会多出属性
Cache-Control: max-age=15; # 相对过期时间
Exipires(过期时间) 的值 Date(当前时间) 的值恰好只差 15s
- 修改cache.html,由于Last_Modified(修改时间)发生了更改,当再次请求时,就不会再使用缓存
2-29 Nginx控制浏览器缓存 - 2
expires @[time]
其中22h30m指的是晚上22点半。
Date 和 Expires 的时间差 等于 Cache-Control 中的 max-age
server {
listen 90;
server_name localhost;
location / {
root /home/foodie-shop;
index index.html;
}
# 注:使用root时, imooc必须在home路径后
location /imooc {
root /home;
}
location /static{
alias /home/imooc;
# 缓存设置
# expires 15s;
expires @22h30;
}
}
expires -[time]
表示在当前时间点之前的time时缓存已过期.
Date 和 Expires相差1h。
server {
listen 90;
server_name localhost;
location / {
root /home/foodie-shop;
index index.html;
}
# 注:使用root时, imooc必须在home路径后
location /imooc {
root /home;
}
location /static{
alias /home/imooc;
# 缓存设置
# expires 15s;
# expires @22h30;
expires -1h;
}
}
expires epoch
表示不去设置缓存。
设置后Response Headers中的expires的值是1970那个起始时间
server {
listen 90;
server_name localhost;
location / {
root /home/foodie-shop;
index index.html;
}
# 注:使用root时, imooc必须在home路径后
location /imooc {
root /home;
}
location /static{
alias /home/imooc;
# 缓存设置
# expires 15s;
# expires @22h30;
# expires -1h;
expires epoch;
}
}
expires off
表示默认浏览器缓存机制。
设置后Response Headers中的cach-control 和 expires字段就没有了
server {
listen 90;
server_name localhost;
location / {
root /home/foodie-shop;
index index.html;
}
# 注:使用root时, imooc必须在home路径后
location /imooc {
root /home;
}
location /static{
alias /home/imooc;
# 缓存设置
# expires 15s;
# expires @22h30;
# expires -1h;
# expires epoch;
expires off;
}
}
expires max
表示最大缓存时间,缓存永不过期。
设置后标识缓存永不过期,cache-control的值就会特别大
server {
listen 90;
server_name localhost;
location / {
root /home/foodie-shop;
index index.html;
}
# 注:使用root时, imooc必须在home路径后
location /imooc {
root /home;
}
location /static{
alias /home/imooc;
# 缓存设置
# expires 15s;
# expires @22h30;
# expires -1h;
# expires epoch;
# expires off;
expires max;
}
}
2-30 Nginx的缓存
- 浏览器缓存
加速用户访问,提升单个用户(浏览器访问者)体验,缓存在本地。 - Nginx缓存
1.缓存在Nginx端,提升所有访问到nginx这一端的用户
2.提升访问上游(upsteam)服务器的速度
3.用户访问仍然会产生请求流量
控制浏览器缓存:
location /files {
alias /home/imooc;
# expires 10s;
# expires @22h30m;
# expires -1h;
# expires epoch;
# expires off;
expires max;
}
2-31 Nginx的反向代理缓存
在Nginx端,也能够为上游服务器里的静态文件做到缓存的作用,从而实现用户请求的过程中能够加速访问以及提高请求的体验。
配置imooc.conf:
upstream tomcats {
server 192.168.168.11:8080;
server 192.168.1.5:8080;
}
# proxy_cache_path 设置缓存保存的目录
# keys_zone 设置共享内存以及占用的空间大小
# max_size 设置缓存大小
# inactive 超过此时间,则缓存自动清理
# use_temp_path 关闭临时目录
proxy_cache_path /usr/local/nginx/upstream_cache keys_zone=mycache:5m max_size=200g inactive=30s use_temp_path=off;
server {
listen 81;
server_name www.tomcats.com;
# 开启并使用缓存
proxy_cache mycache;
# 针对200和304的状态码设置缓存过期时间
proxy_cache_valid 200 303 8h;
location / {
proxy_pass http://tomcats;
}
}
访问http://www.tomcats.com:81/imooc/img/face1.png
,/usr/local/nginx/upstream_cache 目录会生成缓存;超过30s后,缓存被自动清理。
2-33 使用Nginx配置SSL证书提供HTTPS访问(无云服务,暂未实现)
-
https://www.imooc.com/
(慕课网)已配置https,显示连接安全
-
http://www.tomcats.com:81/foodie-shop/
未配置https,显示连接不安全
-
使用https访问
https://www.tomcats.com:81/foodie-shop/
,网站无法打开
-
配置https后,接口等也是以https所存在的