【Java从0到架构师】Nginx 拓展 - HTTPS支持、缓存、Http请求防盗链、限流、高可用(Keepalived)
Nginx
- HTTPS 支持
- SSL 证书
- 重写 - rewrite
- Nginx 跨域解决方案
- Nginx 开启缓存
- Http 请求防盗链
- Nginx 限流方案
- 常见的限流策略 - 计数器算法、漏桶算法、令牌桶算法
- Nginx 限流实现 - 限制并发连接数、限制访问频率
- Nginx 处理 http 请求流程
- Nginx 搭建高可用环境
- Keepalived 安装
- Keepalived 配置
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
- 把不安全的请求方式 —> https 的请求方式
例如输入http://www.baidu.com/
会自动重定向到https://www.baidu.com/
- 更换域名时从 a.com —> b.com
例如输入http://www.360buy.com
会自动重定向到https://www.jd.com/
- 页面伪静态化:将动态请求以静态请求的形式来展示(网站优化,前后端分离的模式下已经见得不多了)
例如:xxx.do
的动态请求,在链接栏里展示为xxx.html
的形式原因是搜索引擎对静态请求收录的更友好(动态请求不会被收录)
rewrite是实现URL重写的关键指令, 根据regex(正则表达式)部分内容. 重定向到replacement, 结尾是flag标记rewrite <regex> <replacement> [flag];关键字 正则 替代内容 flag标记关键字: 其中关键字rewrite不能改变正则: perl兼容正则表达式语句进行规则匹配替代内容: 将正则匹配的内容替换成replacementflag标记: 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=100http 请求的协议
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/nginxsleep 2if [ `ps -C nginx --no-header |wc -l` -eq 0 ];thenkillall keepalivedfi
fi# 赋予执行权限
chmod +x /etc/keepalived/nginx_check.sh
Keepalived 配置
将 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配置完之后就用它访问 }
}
【Java从0到架构师】Nginx 拓展 - HTTPS支持、缓存、Http请求防盗链、限流、高可用(Keepalived)相关推荐
- 【Java从0到架构师】SpringCloud - Hystrix、Zuul
SpringCloud 基本概念 熔断和降级 服务雪崩效应 服务熔断与降级 - Hystrix SpringBoot 集成 Hystrix 熔断降级服务异常报警通知 重点属性 - 熔断隔离策略.超时时 ...
- 【Java从0到架构师】Dubbo 基础 - 设置启动时检查、直接提供者、线程模型、负载均衡、集群容错、服务降级
Dubbo 分布式 RPC 分布式核心基础 分布式概述 RPC Dubbo Dubbo 入门程序 - XML.注解 部署管理控制台 Dubbo Admin 修改绑定的注册 IP 地址 设置启动时检查 ...
- 【Java从0到架构师】分布式框架通信核心基础 - 序列化(JDK、Protobuf)、远程过程调用 RMI
分布式框架通信核心基础 序列化 JDK 的序列化 JDK 序列化的一些细节 Protobuf 序列化 Protobuf 环境搭建与操作 Protobuf 原理分析 实际数据传输 序列化技术选型 远程过 ...
- 【Java从0到架构师】Redis 进阶 - pipline、发布订阅、Bitmap、HyperLogLog、GEO
Redis 原理与实战 Jedis 的基本使用 Redis 数据淘汰策略 Redis 进阶拓展 pipline - 命令批处理,减少大量命令的网络开销,提高操作性能 发布订阅 - subscribe ...
- 【Java从0到架构师】Redis 基础 - 数据类型
Redis 原理与实战 Redis 基础 为什么 Redis 这么快? Redis 安装.启动 Redis 常用配置 Redis 数据类型 通用命令 String - value 可以是字符串.数值. ...
- 【Java从0到架构师】Linux 基础知识、常用命令
Linux 基础知识.常用命令 Linux 基础知识 内核和发行版 常见的 Linux 发行版 Linux 的应用领域 Linux 与 Windows 的区别 Linux 常用命令 *系统目录结构 s ...
- 【Java从0到架构师】git 核心原理和分支管理
git 核心原理和分支管理 核心原理 Git 数据存储结构 git add 流程 - 把数据添加到暂存区 git commit 流程 - 把数据提交到版本库 HEAD 关联关系处理 分支管理 常用命令 ...
- 【Java从0到架构师】项目实战 - 驾考(旧)- Freemarker、MyBatis-Plus
项目实战 - 驾考(旧)- Freemarker.MyBatis-Plus 各种 Object Freemarker 简单使用 常用功能 集成到 SpringBoot MyBatis-Plus 简单使 ...
- 【Java从0到架构师】SpringBoot - 入门_配置文件_YAML
SpringBoot - 入门_配置文件_YAML SpringBoot - 入门 @SpringBootApplication 可运行 jar - spring-boot-maven-plugin ...
最新文章
- [codevs 1913] 数字梯形问题
- 归来吧,haproxy
- Weblogic常见配置
- android html audio,html5 用audio的playbackRate属性控制播放速度在安卓手机不起作用?...
- ef AddDays报错
- iOS小知识点(非UI部分)
- 35岁的程序员,真的要转管理吗?
- 备课笔记190826
- TCP是如何保证数据的可靠传输的
- Design Patterns in ActionScript
- 重启报错_AFAB折旧计提报错:科目xxxxx要求一个成本会计分配 及重启问题
- mdt 计算机名_MDT通过PowerShell脚本自定义变量(自定义计算机名)
- js 页面 json对象转数组
- 基于arm板linux的语音合成,基于ARM7和μCLinux的中文电子语音阅读系统的研究与应用...
- Windows 7 插件KB4474419安装 Symantec Endpoint Protection 只能安装在具有SHA-2代码签名支持更新(KB4474419)的系统上
- linux 中xls格式的文件,如何在命令行中将XLS文件转换为CSV [Linux] | MOS86
- 数据结构c语言版陈越,数据结构 陈越
- Segmentation-Based Deep-Learning Approach for Surface-Defect Detection-论文阅读笔记
- GIT修改用户名——idea提交git用户名/名字不正确
- 单隐层神经网络可以拟合任意单值连续函数