一、Nginx的跨域问题
所谓跨域请求,就是从当前域名访问另外一个域名的操作
CORS跨域资源共享
允许浏览器向跨Origin的服务器发起js请求获取响应
常用的解决跨域请求的方式:
SpringBoot Cors(具体代码如下)
package com.imooc.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@Configuration
public class CorsConfig {
public CorsConfig() {
}
@Bean
public CorsFilter corsFilter() {
// 1.添加cors配置信息
CorsConfiguration configuration = new CorsConfiguration();
// 添加前端请求的路径
configuration.addAllowedOrigin("http://localhost:8080");
// 设置是否发送cookie信息
configuration.setAllowCredentials(true);
// 设置允许请求的方式
configuration.addAllowedMethod("*");
// 设置允许的header
configuration.addAllowedHeader("*");
// 2.为URL添加映射路径
UrlBasedCorsConfigurationSource corsSource = new UrlBasedCorsConfigurationSource();
corsSource.registerCorsConfiguration("/**", configuration);
// 返回重新定义好的urlBasedCorsConfigurationSource
return new CorsFilter(corsSource);
}
}
Nginx(具体代码如下)
server {
listen 8080;
server_name localhost;
# 允许跨域请求的域,*代表所有
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' *;
location / {
root html;
index index.html index.htm;
}
}
二、Nginx防盗链配置支持
仅对代码中的imooc.com的域名进来的请求进行展示,其余进来的请求均为404
#对源站点验证
valid_referers *.imooc.com;
#非法引入会进入下方判断
if ($invalid_referer) {
return 404;
}
三、Nginx集群负载均衡解析
单节点
解释说明:一个人搬砖
集群
解释说明:老板雇佣多个人同时搬砖,优点在于系统稳定性及高效性
Nginx集群负载均衡(upstream)
四、网络模型
网络模型分为7层,也就是当用户发起请求到服务器接收,会经历七道工序
层级 | 名称 | 说明 |
---|---|---|
第七层 | 应用层 | 与用户行为交互 |
第六层 | 表示层 | 定义数据格式以及数据加密 |
第五层 | 会话层 | 创建、管理以及销毁会话 |
第四层 | 传输层 | 创建、管理请求到响应端的连接 |
第三层 | 网络层 | 请求端的IP地址 |
第二层 | 数据链路层 | 提供介质访问和链路管理 |
第一层 | 物理层 | 传输介质、物理媒介 |
五、使用Nginx构建tomcat集群
#配置集群
upstream tomcats {
server ip1:port1;
server ip2:port2;
server ip3:port3;
}
server {
listen 80;
server_name www.tomcats.com;
location / {
proxy_pass http://tomcats
}
}
六、负载均衡请求分配策略
1.负载均衡-轮询
说明:每台服务器所接收的请求数量几乎是一样的,是负载均衡默认的一种策略
2.负载均衡-加权轮询
说明:上述可以理解为服务器,服务器性能越好,分配的请求就多一点。能者多劳嘛,哈哈哈
代码示例:
#配置集群
upstream tomcats {
server ip1:port1 weight 1;
server ip2:port2 weight 2;
server ip3:port3 weight 5;
}
说明:weight代表权重大小,数值越大,服务器接收的请求就越多
3.负载均衡-ip-hash
hash算法图片示例
说明:ip的数值%服务器的节点数量 = index,index为几就落到哪台服务器上
代码配置
#配置集群
upstream tomcats {
ip_hash;
server ip1:port1;
server ip2:port2;
server ip3:port3;
}
注意事项:
使用ip_hash算法的时候,不能把后台的服务器直接移除,只能标记为down;
使用ip_hash的时候,如果在过程中,某些服务器宕机,则hash则进行重新计算,对应访问的服务器则重新指定
一致性哈希算法:
说明:服务器节点和用户ip都落在上述环形上,如果有服务器减少,则只有部分用户会跳过减少的服务器,顺时针落在可执行的服务器上,如果增加服务器,增同理,该算法的好处就在于,服务器的节点和用户的节点都不需要重新计算,节省了部分CPU资源
4.负载均衡-URL_hash
其实道理和ip_hash是一样的,不一样的地方就是一个是用ip求hash值,一个是用url求hash值
七、upstream指令参数
指令名称 | 指令说明 | 代码示例 |
---|---|---|
max_conns | 限制最大同时并发的连接数,可以起到限流的作用 | #配置集群 upstream tomcats { server ip1:port1 max_conns=2; server ip2:port2 max_conns=2; server ip3:port3 max_conns=2; } |
slow_start | 缓慢启动,不能使用在单个服务器上,只能使用在集群中,就是在启动过程中权重从0进行缓慢增加 | #配置集群 upstream tomcats { server ip1:port1 slow_start=60s; server ip2:port2 slow_start=60s; server ip3:port3 slow_start=60s; } |
down | 表示服务器的状态,表示服务器不可用的状态 | #配置集群 upstream tomcats { server ip1:port1 down; server ip2:port2 slow_start=60s; server ip3:port3 slow_start=60s; } |
backup | 可以理解为备胎,就是别的服务器宕掉以后,才会访问到这个服务器,没想到啥时候都得有备胎啊 | #配置集群 upstream tomcats { server ip1:port1 down; server ip2:port2 backup; server ip3:port3 slow_start=60s; } |
max_fails | 最大的失败次数,这个命令的作用就是,一台服务器最大的失败次数,如果达到最大的失败的次数以后,等待15s再发给这台服务器请求,对了,需要和fail_timeout进行配合哦。哈哈哈,给你机会你中用啊 | upstream tomcats { server ip1:port1 down; server ip2:port2 backup; server ip3:port3 max_fails=2 fail_timeout=10s; } |
fail_timeout | 和max_fails进行配合使用,就是设置时间的,就是如果达到最大失败次数以后,需要等待的那个时间 | upstream tomcats { server ip1:port1 down; server ip2:port2 backup; server ip3:port3 max_fails=2 fail_timeout=10s; } |
keepalive | 提高吞吐量 | upstream tomcats { server { location / { |
八、缓存
expires 命令控制一下浏览器的缓存,主要是针对一些静态资源 location / { expires 10s; # 允许浏览器缓存该资源10s expires @22h30m; # @指定时间点 后过期 expires -1h; # 在之前1h就已经过期了 expires epoch; # 不使用缓存了 expires off; # 默认关闭 expires max; # 最大时间,永不过期 }
Nginx缓存:上游服务器静态资源缓存到nginx,比如有一台tomcat静态资源服务器,在Nginx中设置了缓存之后,会把从tomcat静态资源服务器请求到的静态资源缓存到Nginx,并且可以设置静态资源的缓存时间upstream webs {
server ip:port;
}
# proxy_cache_path 设置缓存目录
# keys_zone 设置共享内存,dev_cache是共享内存的名字,10m是共享内存的大小
# max_size 设置缓存的最大大小
# inactive 设置文件的过期时间,超过此时间就会被清理
# use_temp_path 设置是否使用临时目录,使用会影响Nginx性能
proxy_cache_path /usr/local/nginx/cache keys_zone=dev_cache:10m max_size=1g inactive=8h use_temp_path=off;
server {
listen 88;
server_name www.tomcats.com;
location / {
proxy_pass http://webs;
# 启用缓存,名字跟keys_zone设置的名字一致
proxy_cache dev_cache;
# 针对200和304状态码的资源进去缓存,缓存时间为8小时
proxy_cache_valid 200 304 8h;
}
}