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

  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    <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.128192.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)相关推荐

  1. 【Java从0到架构师】SpringCloud - Hystrix、Zuul

    SpringCloud 基本概念 熔断和降级 服务雪崩效应 服务熔断与降级 - Hystrix SpringBoot 集成 Hystrix 熔断降级服务异常报警通知 重点属性 - 熔断隔离策略.超时时 ...

  2. 【Java从0到架构师】Dubbo 基础 - 设置启动时检查、直接提供者、线程模型、负载均衡、集群容错、服务降级

    Dubbo 分布式 RPC 分布式核心基础 分布式概述 RPC Dubbo Dubbo 入门程序 - XML.注解 部署管理控制台 Dubbo Admin 修改绑定的注册 IP 地址 设置启动时检查 ...

  3. 【Java从0到架构师】分布式框架通信核心基础 - 序列化(JDK、Protobuf)、远程过程调用 RMI

    分布式框架通信核心基础 序列化 JDK 的序列化 JDK 序列化的一些细节 Protobuf 序列化 Protobuf 环境搭建与操作 Protobuf 原理分析 实际数据传输 序列化技术选型 远程过 ...

  4. 【Java从0到架构师】Redis 进阶 - pipline、发布订阅、Bitmap、HyperLogLog、GEO

    Redis 原理与实战 Jedis 的基本使用 Redis 数据淘汰策略 Redis 进阶拓展 pipline - 命令批处理,减少大量命令的网络开销,提高操作性能 发布订阅 - subscribe ...

  5. 【Java从0到架构师】Redis 基础 - 数据类型

    Redis 原理与实战 Redis 基础 为什么 Redis 这么快? Redis 安装.启动 Redis 常用配置 Redis 数据类型 通用命令 String - value 可以是字符串.数值. ...

  6. 【Java从0到架构师】Linux 基础知识、常用命令

    Linux 基础知识.常用命令 Linux 基础知识 内核和发行版 常见的 Linux 发行版 Linux 的应用领域 Linux 与 Windows 的区别 Linux 常用命令 *系统目录结构 s ...

  7. 【Java从0到架构师】git 核心原理和分支管理

    git 核心原理和分支管理 核心原理 Git 数据存储结构 git add 流程 - 把数据添加到暂存区 git commit 流程 - 把数据提交到版本库 HEAD 关联关系处理 分支管理 常用命令 ...

  8. 【Java从0到架构师】项目实战 - 驾考(旧)- Freemarker、MyBatis-Plus

    项目实战 - 驾考(旧)- Freemarker.MyBatis-Plus 各种 Object Freemarker 简单使用 常用功能 集成到 SpringBoot MyBatis-Plus 简单使 ...

  9. 【Java从0到架构师】SpringBoot - 入门_配置文件_YAML

    SpringBoot - 入门_配置文件_YAML SpringBoot - 入门 @SpringBootApplication 可运行 jar - spring-boot-maven-plugin ...

最新文章

  1. [codevs 1913] 数字梯形问题
  2. 归来吧,haproxy
  3. Weblogic常见配置
  4. android html audio,html5 用audio的playbackRate属性控制播放速度在安卓手机不起作用?...
  5. ef AddDays报错
  6. iOS小知识点(非UI部分)
  7. 35岁的程序员,真的要转管理吗?
  8. 备课笔记190826
  9. TCP是如何保证数据的可靠传输的
  10. Design Patterns in ActionScript
  11. 重启报错_AFAB折旧计提报错:科目xxxxx要求一个成本会计分配 及重启问题
  12. mdt 计算机名_MDT通过PowerShell脚本自定义变量(自定义计算机名)
  13. js 页面 json对象转数组
  14. 基于arm板linux的语音合成,基于ARM7和μCLinux的中文电子语音阅读系统的研究与应用...
  15. Windows 7 插件KB4474419安装 Symantec Endpoint Protection 只能安装在具有SHA-2代码签名支持更新(KB4474419)的系统上
  16. linux 中xls格式的文件,如何在命令行中将XLS文件转换为CSV [Linux] | MOS86
  17. 数据结构c语言版陈越,数据结构 陈越
  18. Segmentation-Based Deep-Learning Approach for Surface-Defect Detection-论文阅读笔记
  19. GIT修改用户名——idea提交git用户名/名字不正确
  20. 单隐层神经网络可以拟合任意单值连续函数

热门文章

  1. 处理器好点是否上网就快些?
  2. 你们的苹果手机,关闭哪些功能比较省电?
  3. 配置docker阿里云镜像加速
  4. Java定义字符串(2种方式)
  5. SpringMVC_day1
  6. sql server序列_在SQL Server中实现序列聚类
  7. aws rds监控慢sql_AWS RDS SQL Server中的本机差异备份概述
  8. Codevs 1794 修剪花卉
  9. ASP.NET Aries 4.0 开源发布:已完成基础功能优化重写
  10. 开发落网电台windows phone 8应用的计划(10)-----收尾