网关中间件-Nginx(一)

第一部分我们主要介绍如下几点:

1.nginx的基本概念

2.nginx结合业务场景实现负载均衡

3.常见问题的举例

这一部分主要介绍Nginx中限流,缓存,动静分离,以及Nginx的集群搭建,如果涉及举例的话,依然使用上一部分的业务

一、限流

1.为什么要限流?

对于服务器来说,当有大量的高并发查询时,假设当负载均衡的2个实例处理能力达到极限的时候,导致系统可能宕机的风险,那么查询就无法完成,所以在有限资源的情况下。我们应如何保证系统不宕机?这时候我们就应该使用限流的方式来控制请求涌入服务器,保证可用性。

2.限流的方式

1.服务端和客户端限流

主要配置是使用Nginx中的ngx_http_limit_conn_module模块来完成

服务端限流

  • 使用服务端限流来控制当前的虚拟主机的访问量.

客户端限流

  • 使用客户端端限流来控制当前ip请求的客户端只能访问一次.
# 服务端限流,限制总流量,获取服务器虚拟主机的名字
limit_conn_zone $server_name zone=perserver:10m;
# 客户端限流 获取客户端的ip地址
limit_conn_zone $binary_remote_addr zone=perserver:10m;
server {
listen 80;
server_name localhost;
location / {
# 只能限制2个请求进入服务器
limit_conn perserver 2;
proxy_pass http://HealthCode;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

2种方式的缺陷

  • 1.在使用服务端限流时,假设有10个客户端在访问,第一个客户端被人恶意访问,占用了全部的并发量,那其他正常的都无法访问,这肯定是不友好的。

  • 2.在使用客户端限流时,假设限制一个客户ip只能请求一次,但在某一时刻一共有百万个客户端请求并发,那服务同样也抵抗不住会宕机。

2.平滑限流

1.针对第一部分中服务端和客户端限流的策略产生的缺陷来说,我们可以选择平滑限流的策略,主要在配置文件中使用ngx_http_limit_req_module来完成,

他的实现原理基于令牌桶算法,也就是在处理请求时,会去查找是否存在对应的令牌,如果令牌没有了,那就会丢弃请求,例如设置速率是一秒钟1000个,那就是1毫秒生成 一个令牌,也就是说在1毫秒,只能拿到一个令牌,如果一毫秒内请求100个,但是只拿到一个令牌,那就会丢弃其他99个请求。

#zone=addr:10m 将请求数缓冲
limit_req_zone $binary_remote_addr zone=one:10m rate=1000r/s;
server {
listen 80;
server_name localhost;
location / {
limit_req zone=one;
proxy_pass http://HealthCode;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

2.如果设置速率为10毫秒一个,也就是10毫秒生成一个Token,按照这种情况服务器10毫秒只能处理一个有效请求,其他的会丢弃,但是服务器实例的性能能在10毫秒内处理3个,那此时我们应该既要保证突发又要保证平滑,这时就需要添加一个新的配置burst设置突发请求,意思就是再10毫秒只能处理一个请求的基础上,再额外新增处理3个请求一秒钟一个,设置nodelay将不会获取token令牌,直接处理。

#zone=addr:10m 将请求数缓冲
limit_req_zone $binary_remote_addr zone=one:10m rate=1000r/s;
server {
listen 80;
server_name localhost;
location / {
#burst设置突发3 nodelay不延时
limit_req zone=one burst=3 nodelay;
proxy_pass http://HealthCode;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

3.由于nginx是全局限流,他会把所有的请求全部限流,有的时候我们只想针对某一个业务做到限流,例如我在查询健康码时需要限流,但是我在注册个人信息时,不需要限流我们就应该对location进行规则匹配了,例如我只想限制查询限流,就可以配置对应的接口限流

 #zone=addr:10m 将请求数缓冲
limit_req_zone $binary_remote_addr zone=one:10m rate=1000r/s;
server {
listen 80;
server_name localhost;
#所有
location / {
proxy_pass http://HealthCode;
}
#设置api/HealthCode 路由进行限流
location = /api/HealthCode {
limit_req zone=one burst=3 nodelay;
proxy_pass http://HealthCode;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

二、动静分离

主要在web项目中将动态资源和静态资源分开,如果网站并发量太大,动态资源把cpu、内存资源耗尽,导致静态资源无法访问,所以需要使用动静分离以提高网站可用性。

  • 静态资源:CSS js 图片 视频 文档等数据。
  • 动态资源:和数据库有交互的一些资源
1.同一虚拟主机动静分离

1.创建web网站,将静态资源拷贝到单独的文件夹中。

2.在nginx配置文件中单独添加一个虚拟主机节点8089,加入一个静态资源处理的location,和一个动态资源处理的location

3.将静态资源和动态资源location节点,分别指向,静态资源对应目录,动态组员对应启动端口和站点。

 server {
listen 8089;
server_name localhost;
#动态资源
location / {
proxy_pass http://localhost:5007;
} error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# ~代表优先匹配静态资源
location ~ \.(ico|js|css|png|jpg|mp4)$ {
root C:/wwwroot;
}
}
2.不同虚拟主机动静分离

1.创建web网站,将静态资源拷贝到单独的文件夹中。

2.在nginx配置文件中单独添加一个虚拟主机8089节点,加入一个location,专门用于处理动态资源。

server {
listen 8089;
server_name localhost;
location / {
proxy_pass http://localhost:5007;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

3.在nginx配置文件中单独添加一个虚拟主机8090节点,加入一个location,专门用于处理静态资源。

server {
listen 8090;
server_name localhost;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
} location ~ \.(ico|js|css|png|jpg|mp4)$ {
root C:/wwwroot;
}
}

4.创建虚拟主机节点8091,用于合并动态资源和静态资源节点

server {
listen 8091;
server_name localhost;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
} #映射动态资源虚拟主机
location / {
proxy_pass http://localhost:8089;
}
#映射静态资源虚拟主机
location ~ \.(ico|js|css|png|jpg|mp4)$ {
proxy_pass http://localhost:8090;
}
}

上面方法虽然虽然能实现动静分离,有3个虚拟主机,但是在某种意义上只是对这个概念的实现,并没有真正解决高并发场景下的问题,因为所有的处理依然还是在一台主机,共享内存、cpu,所以实际情况的最佳实践应该是有3台服务器用于放置不同的服务。

3.拆分配置文件

有时候我们项目大了,nginx配置文件的配置项和虚拟主机也多了,维护也不太容易,所以我们应该使用配置文件拆分,然后使用Include命令读取

1.新建一个拆分的conf命名 cache.conf;

server {
listen 8089;
server_name localhost;
}

2.在nginx主配置文件中使用Include命令合并配置

include cache.conf;

三、nginx 代理缓存

Nginx缓存主要是用于减轻后端服务器的负载,提高网站并发量,提升用户体验度。

Nginx对客户已经访问过的内容在Nginx服务器本地建立副本,这样在一段时间内再次访问该数据,就不需要通过Nginx服务器再次向后端服务器发出请求,所以能够减少Nginx服务器与后端服务器之间的网络流量,减轻网络阻塞,同时还能减小数据传输延迟,提高用户访问速度。

存储形式

Nginx缓存是键值存储,URL是键,文件路径是值。键值存储的速度就是加快在文件系统中查找的速度。所以,存储的key是哈希过的值。

使用代理缓存需要知道的几点:

  1. 缓存文件放哪儿 ?
  2. 如何指定哪些请求被缓存 ?
  3. 缓存的有效期是多久 ?
  4. 对于某些请求,是否可以不走缓存 ?
1.配置代理缓存

1.首先需要在nginx目录中创建一个存储缓存的目录/cache/nginx/,然后配置缓存存储路径和缓存占用空间大小

 proxy_cache_path ./cache/nginx/ levels=1:2 keys_zone=mycache:64m;

2.虚拟主机配置

location / {
proxy_cache mycache;
proxy_pass http://localhost:5007;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache_methods GET HEAD;
proxy_cache_revalidate on;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_valid any 1m;
proxy_cache_min_uses 1;
proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504; }
  • proxy_cache mycache; #引用mycache缓存空间;
  • proxy_set_header Host $host;#用于后端的real server区分不同的虚拟主机;
  • proxy_set_header X-Real-IP $remote_addr; #记录客户端真实ip地址,而不是代理服务器地址,需要后端web服务器开启日志相应功能接收;
  • proxy_cache_methods GET HEAD;#表示对客户端请求的GET 和 HEAD方法进行缓存;
  • proxy_cache_revalidate on;#本地缓存过期会检查后端服务器该缓存是否存在,避免后端重传占据带宽;
  • proxy_cache_valid 200 302 10m;

    proxy_cache_valid 404 1m;

    proxy_cache_valid any 1m;

    #针对于不同的响应码进行缓存不同的时间设定;
  • proxy_cache_min_uses 30;#某一个请求被响应30次才会被缓存,默认是1,可以将该值设置为大一些;
  • proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504;

    #指明哪种场景可以使用过期缓存,提升用户体验;
  • proxy_hide_header;#隐藏由proxy响应客户端时指定的首部;
  • proxy_buffer 4|8k #为了响应客户端更快,服务器端响应客户端可能分成多个ip报文响应,也可以整合在一起再一次响应;

存在的缺陷

此类代理缓存,例如数据库更新可能会存在一段时间的数据不同步,所以最好的方法就是使用redis或者ssdb存储nginx的缓存,使用数据异构工具将数据同步,然后nginx读取数据库中的缓存

网关中间件-Nginx(二)的更多相关文章

  1. 网关中间件-Nginx(一)

    一.Nginx介绍 1.nginx是一个高性能HTTP服务器,反向代理服务器,邮件代理服务器,TCP/UDP反向代理服务器. 2.nginx处理请求是异步非阻塞的,在高并发下nginx 能保持低资源低 ...

  2. 微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍

    微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍 一.为什么会有 API Gateway 网关 随着微服务架构的流行,很多公司把原有的单 ...

  3. nginx(二)----ubuntu14.04下启动或重启和关闭nginx

    /** * lihaibo * 文章内容都是根据自己工作情况实践得出. *如有错误,请指正 *转载请注明出处 */ 一.启动 /usr/local/nginx/sbin/nginx或者cd /usr/ ...

  4. Spring Cloud Zuul与网关中间件

    Spring Cloud Zuul与网关中间件_网易订阅 http://dy.163.com/v2/article/detail/DC7L8UV10511HSJK.html

  5. 【虚拟机-网关】如何在使用应用程序网关和 Nginx 的环境下实现强制 HTTPS 跳转

    背景介绍 大家在使用 Nginx 部署网站时,实现 HTTP 到 HTTPS 的强制跳转是非常容易的事情,一般可以使用rewrite 命令或者使用返回自定义 301 页面的方法对 HTTP 请求进行 ...

  6. MySQL-ProxySQL中间件(二)| Admin Schemas介绍

    目录     MySQL-ProxySQL中间件(一)| ProxySQL基本概念: https://www.cnblogs.com/SQLServer2012/p/10972593.html     ...

  7. 开源纯C#工控网关+组态软件(二)工控网关的实现

    一.   工控网关是什么 网关是物联网和工控系统的核心组件.网关起的是承上启下的作用.上即上位机,电脑/触屏监控系统.MES这些:下即下位机,包括PLC.传感器.嵌入式芯片等. 不同厂家的下位机,往往 ...

  8. 《nginx 二》深入理解nginx的各项配置

    Nginx应用场景 1.http服务器.Nginx是一个http服务可以独立提供http服务.可以做网页静态服务器. 2.虚拟主机.可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟机. 3. ...

  9. Spring Cloud 网关服务 zuul 二

    有一点上篇文章忘了 讲述,nacos的加载优先级别最高.服务启动优先拉去配置信息.所以上一篇服务搭建我没有讲述在nacos 中心创建的配置文件 可以看到服务端口和注册中心都在配置文件中配置化 属性信息 ...

随机推荐

  1. Spark算子 - reduce

    释义 reduce将partition内所有记录最终计算成1个记录,结果类型与reduce 时数据类型一致 方法签名如下: def reduce(f: (T, T) => T): T = wit ...

  2. fiddler模拟2

    在解决日常的支持需求中,经常会遇到一些用户反馈一些无法简单复现的bug,有很大一部分的bug是由于用户自身的网络环境波动,或者是本身网络环境就较为恶劣,而服务在面对这种恶劣的网络环境的健壮性不够,导致 ...

  3. 虫师Selenium2+Python_2、测试环境搭建

    windows环境配置: 步骤: 安装python 官网下载http://www.seleniumhq.org/ https://www.python.org/downloads/windows/ 3 ...

  4. 使用代码绑定 DataGridView 控件用于程序界面显示表格

    需求 软件界面需要使用表格,对数据进行显示.交互,这是一个非常通用的需求. 实现方法 DataGridView介绍 参考 https://docs.microsoft.com/en-us/dotnet ...

  5. 01 MySQL数据库安装(Windows+Mac)

    目录 MySQL数据库安装 Windows 1.主要版本简介 2.软件下载 3.文件目录简介 4.使用 4.1配置环境变量 4.2登录 制作MySQL服务端开机自启动 运行MySQL 4.3 密码修改 ...

  6. CentOS 7.6 部署 GlusterFS 分布式存储系统

    文章目录 GlusterFS简介 环境介绍 开始GlusterFS部署 配置hosts解析 配置GlusterFS 创建文件系统 安装GlusterFS 启动GlusterFS 将节点加入到主机池 创 ...

  7. .NET core实现一个简易的事件协调器(saga)

    在领域驱动设计中,由于领域边界的存在,以往的分层设计中业务会按照其固有的领域知识被切分到不同的限界中,并且引入了领域事件这一概念来降低单个业务的复杂度,通过非耦合的事件驱动来完成复杂的业务.但是事件驱 ...

  8. IDEA中快速排除maven中的依赖

    选中该模块 点击show dependenties 切换试图 选中要排除的依赖,右击 选择Execlude,然后选择需要在哪个模块添加排除依赖 完成

  9. [LeetCode]1528. 重新排列字符串

    给你一个字符串 s 和一个 长度相同 的整数数组 indices . 请你重新排列字符串 s ,其中第 i 个字符需要移动到 indices[i] 指示的位置. 返回重新排列后的字符串. 示例 1: ...

  10. IDEA配置scala

    IDEA中配置scala 准备:先下好IDEA和scala安装包,配置好jdk环境 scala不想去官网下载的可以直接去百度网盘下载 链接: 链接:https://pan.baidu.com/s/17 ...