网关中间件-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. 利用Monkey进行APP测试

    APP测试策略 功能测试 安装.卸载测试 升级测试(跨版本) 数据丢失 版本兼容 业务逻辑测试 UI测试 异常测试 适配测试 软件 兼容性测试 硬件 性能测试 效率测试 启动时间 响应时间 页面流畅度 ...

  2. Java 位运算总结

    一.Java中支持的位运算 位与(&):二元运算符,两个为1时结果为1,否则为0 位或(|):二元运算符,两个其中有一个为1时结果就为1,否则为0 位异或(^):二元运算符,两个数同时为1或0 ...

  3. JAVA 1.对象和封装

    1. 2. 3.Java类里面属性可以付初使值 4.属性的名字一小写开头 5 6.构造方法 1.语法:       7.staitc的应用  1.statia可以用来修饰:方法,属性,代码块 , st ...

  4. HTML表格总结

    知识小记: 表格的主要目的:用于HTML展示数据,不适用于布局. 表格由行的单元格组成,没有列,常识上的"列"的个数取决于行中单元格的个数. 表格本来就很丑,颜色线条美化交给css ...

  5. harbor服务器脚本

    项目实战,160服务器上安装harbor.mysql等 检查端口 check.sh #!/bin/bash echo -e "\033[31;1;4;5m check mysql... \0 ...

  6. Java中的Unsafe在安全领域的一些应用总结和复现

    目录 0 前言 1 基本使用 1.1 内存级别修改值 1.2 创建对象 1.3 创建VM Anonymous Class 2 利用姿势 2.1 修改值以关闭RASP等防御措施 2.2 创建Native ...

  7. 做PPT必备的大数据分析网站,好看又免费的报表工具

    小明以前是学技术,跳槽来到一家大公司,在这个公司里会经常开会,比如有月度报告.季度报告以及年度报告,在开会前小明了解到同事们都会制作精美的PPT来汇报工作计划和目标,看到同事们精美的PPT里各种好看的 ...

  8. 报表工具Smartbi有什么过人之处?为什么这两年备受推崇?

    Smartbi报表工具是思迈特软件公司的产品之一,完成从"类Excel"到"真Excel"的跨越,是企业级报表的最佳解决方案,主要有以下特点: 完全基于Exce ...

  9. python的字符串切片技术

    听说过python的字符串切片技术吗?是不是听着超高级的?实际上,也不用想得太难,python的字符串切片技术就是将字符串的某些字符提取出来而已~ 字符串切片 字符串是一种序列类型,可以按序号访问其中 ...

  10. 如何将csf ip 端口映射

    csf基于iptables的,不支持SNAT外,其他映射是支持的.最新版不知道,有没有解决这个问题.配置文件/etc/csf.allow 1,DNAT 用法: IPx|*|IPy|*|tcp/udp ...