栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Java从0到架构师】Nginx 拓展 - HTTPS支持、缓存、Http请求防盗链、限流

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Java从0到架构师】Nginx 拓展 - HTTPS支持、缓存、Http请求防盗链、限流

Nginx
  • HTTPS 支持
    • SSL 证书
    • 重写 - rewrite
  • Nginx 跨域解决方案
  • Nginx 开启缓存
  • Http 请求防盗链
  • Nginx 限流方案
    • 常见的限流策略 - 计数器算法、漏桶算法、令牌桶算法
    • Nginx 限流实现 - 限制并发连接数、限制访问频率
  • Nginx 处理 http 请求流程
  • Nginx 搭建高可用环境
    • Keepalived 安装
    • Keepalive 配置

Java 从 0 到架构师目录:【Java从0到架构师】学习记录

HTTPS 支持

SSL 和 TLS:

  • SSL( 安全套接字协议):
  • TLS(安全传输层协议):

对称加密和非对称加密:

  • 对称加密:使用同一个密钥进行加密和解密,加密速度快,性能好
  • 非对称加密:使用公钥加密,私钥解密,性能比对称加密差

    应用场景1:进行数据加密(公钥加密,私钥解密)
    应用场景2:验证数据的可靠性,确保数据确实是从私钥拥有者发送过来的(私钥加密,公钥解密)
SSL 证书

启动 HTTPS 模块:

# 需要安装https支持的openssl
yum install -y openssl openssl-devel

# 给模块添加https支持, configure在src目录
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

# src目录执行make, 注意,不需要执行make install
make

# 把编译后的可执行程序替换nginx

在 src 目录下 objs/ngx_modules.c 中可以看到已经添加了 ssl 模块

自己生成 SSL 证书:

# 1、创建服务器私钥,命令会让你输入一个口令: 12345
openssl genrsa -des3 -out server.key 1024
# 生成 server.key

# 2、创建签名请求的证书(CSR):
openssl req -new -key server.key -out server.csr 
# 生成 server.csr

# 3、在加载SSL支持的Nginx并使用上述私钥时除去必须的口令:
openssl rsa -in server.key -out server_nopass.key
# 生成 server_nopass.key

# 4、最后标记证书使用上述私钥和CSR:
openssl x509 -req -days 365 -in server.csr -signkey server_nopass.key -out server.crt
# 生成 server.crt

# nginx.conf 配置ssl支持
server {
	listen       443 ssl;
	server_name  127.0.0.1;
	ssl_certificate      /usr/local/nginx/sbin/server.crt;
	ssl_certificate_key  /usr/local/nginx/sbin/server_nopass.key;
	location / {
		proxy_pass  http://crm;
	}
}

Nginx 热升级流程:略…,因为目前可以直接关闭旧的,然后重启新的

然后访问:https:192.168.52.128,由于我们的证书是自己生成的,浏览器会认为是不安全的

HTTPS 通信流程:

重写 - rewrite
  1. 把不安全的请求方式 —> https 的请求方式
    例如输入 http://www.baidu.com/ 会自动重定向到 https://www.baidu.com/
  2. 更换域名时从 a.com —> b.com
    例如输入 http://www.360buy.com 会自动重定向到 https://www.jd.com/
  3. 页面伪静态化:将动态请求以静态请求的形式来展示(网站优化,前后端分离的模式下已经见得不多了)
    例如:xxx.do 的动态请求,在链接栏里展示为 xxx.html 的形式

    原因是搜索引擎对静态请求收录的更友好(动态请求不会被收录)

rewrite是实现URL重写的关键指令, 根据regex(正则表达式)部分内容. 重定向到replacement, 结尾是flag标记
    rewrite            [flag];
    关键字      正则             替代内容          flag标记

    关键字: 其中关键字rewrite不能改变
    正则: perl兼容正则表达式语句进行规则匹配
    替代内容: 将正则匹配的内容替换成replacement
    flag标记: rewrite支持的flag标记

flag标记说明:
	last  #本条规则匹配完成后,继续向下匹配新的location URI规则
	break  #本条规则匹配完成即终止,不再匹配后面的任何规则
	redirect  #返回302临时重定向,浏览器地址会显示跳转后的URL地址
	permanent  #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

rewrite 可以配置在server,location,if
# nginx.conf 中配置
# 省略其余配置,理解这个配置的意思即可

server {
	listen 80;
	server_name localhost;
	# 配置重写
	# rewrite ^/(.*) http://www.baidu.com/ permanent;     # 匹配成功后跳转到百度,执行永久301跳转
	rewrite .* https:192.168.52.128:443 break;
	
	location / {
		proxy_pass http://crm;
	}
}

server {
	listen      443 ssl ;
	server_name  localhost;
	ssl_certificate      /usr/local/nginx/sbin/server.crt;
	ssl_certificate_key  /usr/local/nginx/sbin/server_nopass.key;
	
	location / {
		proxy_pass http:crm;
	}
}
Nginx 跨域解决方案

什么是跨域问题:参考跨源资源共享(CORS)

请求的URI组成: http://www.520it.com:80/subject/java/getInfo?id=100
 
http 请求的协议
www.520it.com 域名(可以是IP地址)
80 端口,对于http协议默认的是80端口
/subject/java/getInfo 资源在服务端的路径
id=100 请求参数

当一个请求(异步请求)url的 协议域名端口 三者之间任意一个与当前页面url不同即为跨域


Nginx 解决跨域问题的具体配置:参考 X-Content-Type-Options

# 在nginx.conf的 location / {} 中写表示任意请求都允许跨域
# 在请求的目标资源上加上对应的请求的, 允许资源的跨域访问
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers '*';

# Access-Control-Allow-Origin: 设置请求可以从哪些地址发送过来,  * 代表所有的地址
# Access-Control-Allow-Methods: 设置可以跨域请求的方法, OPTIONS 是一个预检方法
# Access-Control-Allow-Headers: 设置允许的请求头信息

后台也可以配置跨域相关

Nginx 开启缓存

后台启动 java 进程:nohup java -jar crm-2.0.0.jar &

有时候为了减轻后台的请求压力,会把对应的请求结果缓存在 nginx 服务器,到时候直接从 nginx 服务器获取对应的缓存结果即可:参考 Nginx 缓存

Nginx 的缓存和 Redis 的缓存有什么区别?

  • Nginx 缓存是为了缓解后台服务器的压力,一般只是缓存一个响应结果
  • Redis 缓存更多的是缓存业务数据,是为业务服务的

在 nginx.conf 中配置:

# http模块:
# 缓存路径: /datas/nginx/cache
# levels 表示结构, 1表示1位16进制,2表示2位16进制, 一个:表示有两级目录
# 缓存的key是one,缓存大小10M
proxy_cache_path /datas/nginx/cache levels=1:2 keys_zone=one:10m;

# location模块
# 配置缓存的区域, 使用one, 对应key_zone中的one
proxy_cache one;
# 配置有效的缓存, 对于响应200的结果, 缓存1分钟
proxy_cache_valid 200 1m;

缓存目录建议手动创建好,makedir -p /datas/nginx/cache

配置好缓存以后,哪怕关闭了运行的 java 进程,浏览器依旧可以访问页面一段时间(缓存时间)

Http 请求防盗链

目的:解决非法请求页面,比如爬虫爬取页面

解决方案:在请求资源的时候,会带上一个 referer 参数,我们可以通过这个参数来控制请求是否合法

nginx 内置了 referer 模块

# valid_referers 
#     none: 允许缺失的头部信息进行访问
#     block: 允许referer头部没有对应的值进行访问
#     server_names: 允许匹配的域名进行访问 对于域名可以使用前缀+通配符(*) 进行匹配
# referer_hash_bucket_size
# referer_hash_max_size
# $invalid_referer:  允许访问, 变量值为空; 不允许访问, 变量值为1

nginx.conf 配置:

# location / {} 中配置
valid_referers none blocked server_names www.crm.com/*;

if ($invalid_referer) {
	return 403;
}
Nginx 限流方案 常见的限流策略 - 计数器算法、漏桶算法、令牌桶算法

参考:高并发场景下的限流算法

  • 计数器算法:在指定的时间内,放行指定数量的请求
  • 漏桶算法:nginx 中默认的限流算法,匀速的放行请求,无法处理突发的流量
  • 令牌桶算法:放行速率取决于令牌,可以处理突发的流量,可以一下子有很多请求进入

Nginx 限流实现 - 限制并发连接数、限制访问频率

限制并发连接数

limit_conn 模块是 nginx 内置的模块

# nginx.conf 配置

# http模块下,配置连接数量限制
limit_conn_zone $binary_remote_addr zone=addr:10m;

# location模块
location / {
	limit_conn_status  500;
	limit_conn_log_level  error;
	limit_rate  50k; # 限制下载速度
	limit_conn  addr  1; # 限制并发连接数 
}

限制访问频率

limit_req 模块是 nginx 内置的模块

# nginx.conf 配置

# http模块下
limit_req_zone $binary_remote_addr zone=one:10m rate=2r/m;

# location模块
location / {
	limit_req zone=one burst=5;
}
Nginx 处理 http 请求流程


Nginx 搭建高可用环境


文件拷贝操作:scp -r crm 192.168.52.128:/usr/llocal/software/

Keepalived 是一个高性能的,服务器高可用或热备解决方案,Keepalived 主要防止服务器单点故障,可以通过与 Nginx 配合实现 web 服务器端的高可用。

Keepalived 以 VRRP 协议为实现基础,使用 VRRP 协议来实现高可用性(HA)

VRRP (Virtual Router Redundacy Protocol) 是用于实现路由器冗余的协议,VRRP 协议将两台或多台路由器设备虚拟成一个设备,向外提供虚拟路由 IP(一个或多个)

Keepalived 安装
# 第一步:安装 keepalived 依赖的包
yum install gcc openssl-devel libnl3-devel popt-devel iptables-devel libnfnetlink-devel -y

# 第二步:编译安装 keepalived
# 将keepalived的安装包 上传到/usr/local/soft 目录下  
cd /usr/local/soft
tar -zxvf keepalived-2.0.20.tar.gz  -C /usr/local/src/
cd /usr/local/src/keepalived-2.0.20/
./configure --prefix=/usr/local/keepalived
make && make install

# 第三步:将 keepalived 安装成 Linux 系统服务
# 安装完成之后,需要做一些工作复制默认配置文件到 默认路径  
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/sbin/keepalived /etc/init.d/

# 第四步:编写nginx检测脚本:
vi /etc/keepalived/nginx_check.sh
# 内容如下: 检查是否存在nginx进程信息

#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx
    sleep 2
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        killall keepalived
    fi
fi

# 赋予执行权限  
chmod +x /etc/keepalived/nginx_check.sh
Keepalive 配置

将 192.168.52.128 和 192.168.52.129 配置虚拟 IP:192.168.52.110,实现高可用(一台服务器挂了会自动转到另一台服务器上)

修改 keepalived 的 Master 配置文件 vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived       
global_defs {      
   router_id wolfcode                           ##路由器标志    
}    
# 集群资源监控,组合track_script进行    
vrrp_script check_haproxy {    
	script "/etc/keepalived/nginx_check.sh"  #检测 nginx 状态的脚本路径  
	interval 2  #检测时间间隔  
	weight -20  #条件成立 权重减20  
}    
vrrp_instance PROXY {    
	# 设置当前主机为主节点,如果是备用节点,则设置为BACKUP   
	state MASTER
	# 指定HA监测网络接口,可以用ifconfig查看来决定设置哪一个    
	interface ens32
	# 虚拟路由标识,同一个VRRP实例要使用同一个标识,主备机    
	virtual_router_id 80    
	# 因为当前环境中VRRP组播有问题,改为使用单播发送VRRP报文  如果VRRP组播没问题,以下这块的内容可以注释掉。  
	# 这个地方需要关注,之前未做此设置,结果主备节点互相不能发现,因此主备节点都升级成了MASTER,并且绑定了VIP    
	# 主节点时,内容为:    
	unicast_src_ip 192.168.52.128
	# 设置优先级,确保主节点的优先级高过备用节点  
	priority 100    
	# 用于设定主备节点间同步检查时间间隔    
	advert_int 2    
	# 设置主备节点间的通信验证类型及密码,同一个VRRP实例中需一致    
	authentication {    
		auth_type PASS    
		auth_pass wolfcode
	}    
	# 集群资源监控,组合vrrp_script进行    
	track_script {    
		check_haproxy    
	}    
	# 设置虚拟IP地址,当keepalived状态切换为MASTER时,此IP会自动添加到系统中    
	# 当状态切换到BACKUP时,此IP会自动从系统中删除    
	# 可以通过命令ip add查看切换后的状态    
	virtual_ipaddress {    
		192.168.52.110  #虚拟ip配置完之后就用它访问    
	}    
}  

修改 keepalived 的 Slave 配置文件 vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived       
global_defs {      
   router_id wolfcode                           ##路由器标志    
}    
# 集群资源监控,组合track_script进行    
vrrp_script check_haproxy {    
	script "/etc/keepalived/nginx_check.sh"  #检测 nginx 状态的脚本路径  
	interval 2  #检测时间间隔  
	weight -20  #条件成立 权重减20  
}    
vrrp_instance PROXY {    
	# 设置当前主机为主节点,如果是备用节点,则设置为BACKUP   
	state BACKUP
	# 指定HA监测网络接口,可以用ifconfig查看来决定设置哪一个    
	interface ens32
	# 虚拟路由标识,同一个VRRP实例要使用同一个标识,主备机    
	virtual_router_id 80    
	# 因为当前环境中VRRP组播有问题,改为使用单播发送VRRP报文  如果VRRP组播没问题,以下这块的内容可以注释掉。  
	# 这个地方需要关注,之前未做此设置,结果主备节点互相不能发现,因此主备节点都升级成了MASTER,并且绑定了VIP    
	# 主节点时,内容为:    
	unicast_src_ip 192.168.52.129
	# 设置优先级,确保主节点的优先级高过备用节点  
	priority 90    
	# 用于设定主备节点间同步检查时间间隔    
	advert_int 2    
	# 设置主备节点间的通信验证类型及密码,同一个VRRP实例中需一致    
	authentication {    
		auth_type PASS    
		auth_pass wolfcode
	}    
	# 集群资源监控,组合vrrp_script进行    
	track_script {    
		check_haproxy    
	}    
	# 设置虚拟IP地址,当keepalived状态切换为MASTER时,此IP会自动添加到系统中    
	# 当状态切换到BACKUP时,此IP会自动从系统中删除    
	# 可以通过命令ip add查看切换后的状态    
	virtual_ipaddress {    
		192.168.52.110  #虚拟ip配置完之后就用它访问    
	}    
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/305604.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号