- HTTPS 支持
- SSL 证书
- 重写 - rewrite
- Nginx 跨域解决方案
- Nginx 开启缓存
- Http 请求防盗链
- Nginx 限流方案
- 常见的限流策略 - 计数器算法、漏桶算法、令牌桶算法
- Nginx 限流实现 - 限制并发连接数、限制访问频率
- Nginx 处理 http 请求流程
- Nginx 搭建高可用环境
- Keepalived 安装
- Keepalive 配置
HTTPS 支持Java 从 0 到架构师目录:【Java从0到架构师】学习记录
SSL 和 TLS:
- SSL( 安全套接字协议):
- TLS(安全传输层协议):
对称加密和非对称加密:
- 对称加密:使用同一个密钥进行加密和解密,加密速度快,性能好
- 非对称加密:使用公钥加密,私钥解密,性能比对称加密差
应用场景1:进行数据加密(公钥加密,私钥解密)
应用场景2:验证数据的可靠性,确保数据确实是从私钥拥有者发送过来的(私钥加密,公钥解密)
启动 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,由于我们的证书是自己生成的,浏览器会认为是不安全的
重写 - rewriteHTTPS 通信流程:
- 把不安全的请求方式 —> 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 [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 中默认的限流算法,匀速的放行请求,无法处理突发的流量
- 令牌桶算法:放行速率取决于令牌,可以处理突发的流量,可以一下子有很多请求进入
限制并发连接数:
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 请求流程
文件拷贝操作:scp -r crm 192.168.52.128:/usr/llocal/software/
Keepalived 是一个高性能的,服务器高可用或热备解决方案,Keepalived 主要防止服务器单点故障,可以通过与 Nginx 配合实现 web 服务器端的高可用。
Keepalived 以 VRRP 协议为实现基础,使用 VRRP 协议来实现高可用性(HA)
Keepalived 安装VRRP (Virtual Router Redundacy Protocol) 是用于实现路由器冗余的协议,VRRP 协议将两台或多台路由器设备虚拟成一个设备,向外提供虚拟路由 IP(一个或多个)
# 第一步:安装 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配置完之后就用它访问
}
}



