网关中间件-Nginx(一)
一、Nginx介绍
1.nginx是一个高性能HTTP服务器,反向代理服务器,邮件代理服务器,TCP/UDP反向代理服务器.
2.nginx处理请求是异步非阻塞的,在高并发下nginx 能保持低资源低消耗高性能,主要用在集群系统中用于支持负载均衡.
3.nginx对静态文件的处理速度也相当快,也可以用于前端站点的服务器.
二、为什么要使用Nginx?
单个系统主要用于处理客户端请求,一个系统处理客户端的请求量是有限的,当客户端的并发量超过了系统的处理能力的时候,就会导致服务器性能降低,速度变慢,直接影响用户体验,所以为了提升性能,我们会创建多个服务实例,形成集群系统
用于保证高可用
那么什么样的系统业务适合使用集群系统呢?我觉得主要从2个方面来看,第一请求人数多,导致次数多,第二请求量密集,例如我们近两年常用的防疫健康码
查询,我们排除与其他的业务系统接入的因素,可以说他的99%针对用户的业务其实就是查询,而且并发量和请求数也是非常庞大的,所以就很适合使用集群系统。
三、查询分流Nginx原理
1.模块化设计
高度模块化的设计是 Nginx的架构基础。在Nginx中,除了少量的核心代码,其他一切皆为模块,所有模块间是分层次、分类别的,Nginx 官方共有五大类型的模块:核心模块
、配置模块
、事件模块
、HTTP模块
、mail模块
,5种模块中,配置模块
和核心模块
是与 Nginx 框架密切相关的。而事件模块则是 HTTP 模块和 mail 模块的基础。HTTP 模块
和 mail 模块
的“地位”类似,它们都是更关注于应用层面
并且引用基础核心模块。
2.多进程模型
与Memcached的经典多线程模型相比,Nginx是经典的多进程模型,Nginx启动后在后台运行,后台进程包含一个master进程和多个worker进程,可以在配置中设置工作进程数,一般根据服务器的Cpu核心数,来决定工作进程数是多少,例如我的电脑核心数是12,那可以在配置文件中设置worker_processes为12,那么在进程中可以看到 一个13个nginx运行实例。
3.事件驱动架构
处理请求事件时,Nginx 的事件消费者只是被事件分发者进程短期调用而已,这种设计使得网络性能、用户感知的请求时延都得到了提升,每个用户的请求所产生的事件会及时响应,整个服务器的网络吞吐量都会由于事件的及时响应而增大。当然,这也带来一定的要求,即每个事件消费者都不能有阻塞行为,否则将会由于长时间占用事件分发者进程而导致其他事件得不到及时响应,Nginx 的非阻塞特性就是由于它的模块都是满足这个要求,其实Nginx最佳的部署应该在linux ,linux的io及事件驱动优于windows,我们可以通过配置文件中设置events的数量表示当前的nginx能处理多少个请求,这个没有一个绝对的标准,可以基于服务的性能和本身业务需求而定。
4.虚拟主机、反向代理、负载均衡
1.虚拟主机就是为了对所有应用系统进行反向代理。
2.反向代理是指代理后端服务器,正向代理代表代理客户端。
3.负载均衡将流量均分到指定后端实例。
四、落地Nginx
我们首先结合实际业务场景分析,然后对不同的业务用例进行落地实践的方案选择。
1.负载均衡业务实践
1.首先我们应该准备一个业务系统,在这就用上面说的“健康码查询”业务,模拟一个查询的服务,注意在这仅仅只是引用场景示例,不代表健康码真实场景如此, 因为我没有参与真正的防疫健康码的开发和设计,也不了解它业务和技术架构上真正的复杂度,单纯只是由此引入业务场景而已,如果您在阅读时觉得这样不合适,您可以把他当做你想当做的任何系统,或者忘记这件事,都是可以的
接下来我们应该下载Nginx作为我们的服务器,在这里我使用的是在Windows环境下的演示,其实不管在Linux或者Docker中部署都可以,但是开发在windows,所以基于Windows比较方便。
- 1.创建健康码服务
- 2.下载nginx
2.我们应该创建服务集群,在这为了演示创建2个服务实例,然后使用nginx来进行负载均衡查询分流
1.命令行启动2个服务实例模拟集群,分别绑定端口8081和8082,其实真实环境不会只有2个实例或者在同一台服务器上部署。
2.配置nginx的反向代理和负载均衡
worker_processes 1;
error_log logs/error.log info;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
#虚拟主机
server{
listen 8080;
server_name localhost;
#配置反向代理
location / {
proxy_pass http://HealthCode;
}
error_page 500 502 503 504 /50x.html;
}
}
#负载均衡配置
upstream HealthCode{
server localhost:8081;
server localhost:8082;
}
- 3.启动nginx,并访问虚拟服务器
2.负载均衡业务场景分析
针对上面的业务,我们使用到nginx实现负载均衡,那对于我们来说,应该知道Nginx虚拟主机,是如何将我们的请求转发到各个不同的服务实例的,下面结合业务用例来介绍Nginx中的各种负载均衡算法
,并设置对应的配置文件节点。
1.轮训算法
根据字面理解就是轮训处理 1 2 3 4 周而复始,适合服务器处理能力相同的实例,也可以加入权重,指定轮询几率,weight和访问比率成正比,用于服务器性能不均的情况下,权重越高,在被访问的概率越大,如下面分别是20%,80%。
#负载均衡配置
upstream HealthCode{
server localhost:8081;
server localhost:8082;
#server localhost:8081 weight=2;
#server localhost:8082 weight=8;
}
2.最小连接数算法 least_conn
当客户端给Nginx发送查询健康码的请求时,Nginx把请求转发给8081和8082 ,如果8082 处理请求比较慢,会导致请求堆积在8082,那我们就需要解决请求堆积的问题,在这种场景下,我们可以把请求转发给连接数较少的服务器处理,能够达到更好的负载均衡效果,使用least_conn算法,在nginx配置文件中,负载均衡节点加入配置least_conn
#负载均衡配置
upstream HealthCode{
#配置最小连接数算法
least_conn;
server localhost:8081;
server localhost:8082;
}
3. hash一致性算法 ip_hash
由于查询压力过大,为了提升可用性,我们在服务端加入缓存,例如3分钟之内请求,就直接将缓存的信息丢出去,客户端给Nginx发送查询健康码的请求时,Nginx把请求转发给8081和8082,甚至更多实例,使用轮训或者最小连接数时,会导致在缓存的情况下命中率下降,基于这种缓存状态丢失
的情况,请求依然会给到没有缓存的服务实例,并去数据库中去查询数据,导致性能下降。
(当第一次请求发送到8081去查询了数据库,但是在8082 或者其他的节点没有缓存,如果使用轮训算法及其他算法,会导致下次请求时,并不会访问缓存,所以叫缓存命中率下降
)
在这种场景下我们应该使用Hash一致性算法
,将某一个请求客户端的ip地址与nginx的负载均衡中的某一个实例绑定。
#负载均衡配置
upstream HealthCode{
#配置iphash算法
ip_hash;
server localhost:8081;
server localhost:8082;
}
4.容灾策略
重试机制
1.当客户端给Nginx发送查询请求时,Nginx把请求转发给8081和8082 ,如果转发到8081的时候,8081服务器被人拉闸,临时宕机了,会导致请求失败。如何保证请求成功?
在这种场景下我们应该使用nginx的失败重试
机制,将某一个请求客户端的ip地址与nginx的负载均衡中的某一个实例绑定。
#动态负载均衡配置
upstream HealthCode{
ip_hash;
#设置最大失败次数2次,超时时间10s钟
server localhost:8081 max_fails=2 fail_timeout=10s;
server localhost:8082 max_fails=2 fail_timeout=10s;
}
主机备份 backup
1.查询时请求转发给8081和8082 ,假设此时两个实例同时宕机了,会导致系统不可用,在这种异常业务情况下,我们可以使用主机备份
来解决,注意在正常节点在运行时 ,备份节点是不工作的,如果使用ip_hash
将不会生效,因为ip和主机已经绑定。
#动态负载均衡配置
upstream HealthCode{
ip_hash;
server localhost:8081 max_fails=2 fail_timeout=10s;
server localhost:8082 max_fails=2 fail_timeout=10s;
#主机备份
server localhost:8083 backup;
}
网关中间件-Nginx(一)的更多相关文章
- 网关中间件-Nginx(二)
网关中间件-Nginx(一) 第一部分我们主要介绍如下几点: 1.nginx的基本概念 2.nginx结合业务场景实现负载均衡 3.常见问题的举例 这一部分主要介绍Nginx中限流,缓存,动静分离,以 ...
- Spring Cloud Zuul与网关中间件
Spring Cloud Zuul与网关中间件_网易订阅 http://dy.163.com/v2/article/detail/DC7L8UV10511HSJK.html
- 【虚拟机-网关】如何在使用应用程序网关和 Nginx 的环境下实现强制 HTTPS 跳转
背景介绍 大家在使用 Nginx 部署网站时,实现 HTTP 到 HTTPS 的强制跳转是非常容易的事情,一般可以使用rewrite 命令或者使用返回自定义 301 页面的方法对 HTTP 请求进行 ...
- 微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍
微服务架构学习与思考(10):微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍 一.为什么会有 API Gateway 网关 随着微服务架构的流行,很多公司把原有的单 ...
- 中间件 | Nginx实现动静分离
Nginx动静分离基本概述 动静分离,通过中间件将动静分离和静态请求进行分离: 通过中间件将动态请求和静态请求分离,可以建上不必要的请求消耗,同事能减少请求的延时. 通过中间件将动态请求和静态请求分离 ...
- Keepalived+Nginx解决方案实现高可用的API网关(nginx)
一. 采用Keepalived+Nginx解决方案实现高可用的API网关. 2.1 Nginx概述 nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP ...
- 云原生之旅 - 8)云原生时代的网关 Ingress Nginx
前言 当我们在Kubernetes部署的服务需要暴露给外部用户使用时,有三种选择:LoadBalancer,NodePort, Ingress. LoadBalancer类型得结合各个Cloud Pr ...
- 基于Netty自研网关中间件
微服务网关解决方案调研和使用总结 专题 - 沧海一滴 - 博客园 https://www.cnblogs.com/softidea/p/7261095.html 宜人贷蜂巢API网关技术解密之Nett ...
- 你真的了解负载均衡中间件nginx吗?
前言 nginx可所谓是如今最好用的软件级别的负载均衡了.通过nginx的高性能,并发能力强,占用内存下的特点,可以搭建高性能的代理服务.同时nginx还能作为web服务器,反向代理,动静分离服务器. ...
随机推荐
- MySQL高级(进阶)SQL语句
MySQL高级(进阶)SQL语句 目录 MySQL高级(进阶)SQL语句 一.实例准备--制表 1. 表1(商店区域表) 2. 表2(商店销售表) 3. 表3(城市表) 4. 表4(total_sal ...
- 第10讲:Flink Side OutPut 分流
Flink系列文章 第01讲:Flink 的应用场景和架构模型 第02讲:Flink 入门程序 WordCount 和 SQL 实现 第03讲:Flink 的编程模型与其他框架比较 第04讲:Flin ...
- 「 题解 」P2487 [SDOI2011]拦截导弹
简单题意 给定 \(n\) 个数对 \((h_i, v_i)\). 求: 最长不上升子序列的长度. 对于每个 \(i\),分别求出包含数对 \((h_i, v_i)\) 的最长上升子序列的个数和最长不 ...
- 详解 Apache SkyWalking OAP 的分布式计算
SkyWalking的OAP(Observability Analysis Platform,观测分析平台)是一个用于链路数据的分布式计算系统. 因为它巧妙的设计,使得在链路数据计算和聚合过程中,不需 ...
- 如何对Spring MVC中的Controller进行单元测试
对Controller进行单元测试是Spring框架原生就支持的能力,它可以模拟HTTP客户端发起对服务地址的请求,可以不用借助于诸如Postman这样的外部工具就能完成对接口的测试. 具体来讲,是由 ...
- 01 MySQL数据库安装(Windows+Mac)
目录 MySQL数据库安装 Windows 1.主要版本简介 2.软件下载 3.文件目录简介 4.使用 4.1配置环境变量 4.2登录 制作MySQL服务端开机自启动 运行MySQL 4.3 密码修改 ...
- 通过修改注册表将右alt键映射为application键
通过修改注册表将右alt键映射为application键的方法有许多键盘没有APPLICATION(上下文菜单)键,本文将教您如何把右ALT键映射为apps键.1.映射请将以下注册表信息用记事本保存为 ...
- zabbix-agentd;客户端开启多个端口。
学习标杆:https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/8/html/configuring_basic ...
- SSM整合时页面出现$ is not defined
$ is not defined ,有以下几种可能: 1.没有导入jQuery的jar包 2.jQuery的jar包放进了WEB-INF里,jQuery的jar包最好放在WebContent下,跟WE ...
- NSSCTF-gift_pwn
最近才开始接触"pwn"这个东西,这是近两天做的一个题目,然后就想着记一下. 好的,步入正题, 直接nc连接返回空白,然后直接退出,用kali的checksec工具或者是die检测 ...