一、Nginx介绍

1.nginx是一个高性能HTTP服务器,反向代理服务器,邮件代理服务器,TCP/UDP反向代理服务器.

2.nginx处理请求是异步非阻塞的,在高并发下nginx 能保持低资源低消耗高性能,主要用在集群系统中用于支持负载均衡.

3.nginx对静态文件的处理速度也相当快,也可以用于前端站点的服务器.

相关视频讲解:

C++后台开发架构师学习视频

网站被攻击了,Nginx是不是该背这个锅?

网络穿透,NAT,打洞,了解p2p的秘密

二、为什么要使用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.我们应该创建服务集群,在这为了演示创建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 周而复始,它是upstream模块默认的负载均衡默认策略,适合服务器处理能力相同的实例,在轮询中,如果某个服务实例宕机了,会自动剔除该服务器。,也可以加入权重,指定轮询几率,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;
}

五、配置HTTPS

我们要保证我们的请求的安全,所以需要使用Https通信,同样需要对我们的虚拟主机设置https,设置https的前提需要证书,一个是秘钥(server-key.pem),一个是证书(server-cert.pem)。

1.基本设置

1.下载openSSL,然后使用openSSL工具生成,教程连接 2.找到证书生成路径 3.然后在nginx配置文件添加对应的虚拟主机节点,然后配置Https

# https 虚拟主机server {listen       4435 ssl;server_name  localhost;ssl_certificate      D:/cert/server-cert.pem;ssl_certificate_key  D:/cert/server-key.pem;ssl_session_cache    shared:SSL:1m;ssl_session_timeout  5m;#    ssl_ciphers  HIGH:!aNULL:!MD5;#    ssl_prefer_server_ciphers  on;location / {proxy_pass  http://HealthCode;}}

2.http转https

系统当中总是有很多默认的Http请求,我们需要使用nginx的ngx_http_rewrite_module模块来将http请求转换成https

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;#默认重定向到httpsif($scheme = http){return 301 https://$host:4435$request_url}#配置反向代理location / {proxy_pass  http://HealthCode;}error_page   500 502 503 504  /50x.html;}}
#负载均衡配置
upstream HealthCode{server localhost:8081;server localhost:8082;}

想学习C++工程化、高性能及分布式、深入浅出。性能调优、TCP,协程,Nginx源码分析Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,Linux内核,P2P,K8S,Docker,TCP/IP,协程,DPDK学习资料视频获取点击:C++架构师学习资料

C++后台开发视频链接:C/C++Linux服务器开发高级架构师/Linux后台架构师​

一文读懂网关中间件-Nginx相关推荐

  1. 即时通讯新手入门:一文读懂什么是Nginx?它能否实现IM的负载均衡?

    本文引用了"蔷薇Nina"的"Nginx 相关介绍(Nginx是什么?能干嘛?)"一文部分内容,感谢作者的无私分享. 1.引言 Nginx(及其衍生产品)是目前 ...

  2. 从根上理解高性能、高并发(七):深入操作系统,一文读懂进程、线程、协程

    本文引用了"一文读懂什么是进程.线程.协程"一文的主要内容,感谢原作者的无私分享. 1.系列文章引言 1.1 文章目的 作为即时通讯技术的开发者来说,高性能.高并发相关的技术概念早 ...

  3. 腾讯资深架构师干货总结:一文读懂大型分布式系统设计的方方面面

    1.引言 我们常常会听说,某个互联网应用的服务器端系统多么牛逼,比如QQ.微信.淘宝.那么,一个大型互联网应用的服务器端系统,到底牛逼在什么地方?为什么海量的用户访问,会让一个服务器端系统变得更复杂? ...

  4. 一文读懂阿里云网络 2020 云栖大会新品发布

    凌云时刻 · 极鲜速递 导读:阿里云网络新品来袭! 来源 | 洛神云网络技术 前言 企业上云,网络先行.在 2020 云栖大会上,阿里云基础产品事业部网络产品团队负责人祝顺民宣布了云网络一系列新品发布 ...

  5. 一文读懂HTTP Caching

    一个典型的HTTP应用拓扑如下 user-agent - forward proxy - proxy server n - reverse proxy - origin server user-age ...

  6. 网络编程懒人入门(十一):一文读懂什么是IPv6

    本文同时发布于"即时通讯技术圈"公众号,链接是:https://mp.weixin.qq.com/s/cS5xB2DrjF52rmz6EGVJ6A. 本文参考了公众号鲜枣课堂的&q ...

  7. 一文读懂“数据分发服务DDS”(Data Distribution Service,RTPS,OMG)

    一文读懂"数据分发服务DDS"(Data Distribution Service,RTPS,OMG) https://blog.csdn.net/DDS_CSIT/article ...

  8. 从实验室走向大众,一文读懂Nanopore测序技术的发展及应用

    关键词/Nanopore测序技术    文/基因慧 随着基因测序技术不断突破,二代测序的发展也将基因检测成本大幅降低.理想的测序方法,是对原始DNA模板进行直接.准确的测序,消除PCR扩增带来的偏差, ...

  9. 一文读懂Faster RCNN

    来源:信息网络工程研究中心本文约7500字,建议阅读10+分钟 本文从四个切入点为你介绍Faster R-CNN网络. 经过R-CNN和Fast RCNN的积淀,Ross B. Girshick在20 ...

最新文章

  1. request.form()和request()和request.data的区别
  2. 【Linux】用户组、用户操作
  3. html表格里的超链接点不了,Excel如何添加和取消超链接 Excel超链接打不开是怎么回事...
  4. 计算机辅助设计b实验目的,上海电力学院电路计算机辅助设计1--含有受控源电路辅助分析...
  5. 爪哇国新游记之二十八----从url指定的地址下载文件到本地
  6. FFMPEG针对视频操作的基本命令
  7. 解决phpcms模版设置中不能显示栏目首页模板,栏目列表页模板,内容页模板等下拉菜单选项的问题!...
  8. 再学 GDI+[77]: 区域(6) - GetRegionScans - 获取区域中的所有矩形
  9. 如何让Div层悬浮在Flash Object对象之上(转载)
  10. html3d电子相册,3d电子相册制作软件哪个好, 自带翻页电子相册模板,电子相册生成flash等多种格式...
  11. 高德 各省市区县poi及区划名称 代码/高德历史poi
  12. 文件生成Md5值方法
  13. c语言alt 小键盘,ALT+小键盘输入《泡MM好招》
  14. h3c交换机重启_终于解决H3C交换机reset saved-configuration后不能启动的问题
  15. 日语 假名对应的汉字来源
  16. 第三届计算机网络安全与软件工程国际学术会议(CNSSE 2023)
  17. Webfrom --中国直辖市三区联动
  18. 游戏开发新手入门之Windows编程
  19. 电子元件-压敏电阻与气体放电管
  20. 【SNA】社会网络分析三 图论与图学习

热门文章

  1. 【庖丁解牛】执行yum提示错误:rpmdb: BDB0113 Thread/process 424227/139826856310848 failed
  2. Elasticsearch:如何对 PDF 文件进行搜索
  3. Udacity机器学习入门 Stroop(斯特鲁普)测试心理学项目 P1
  4. 出国(东南亚)工作的华为数通工程师机会,欢迎投递简历
  5. 详解Linux系统的开机、重启和用户登录注销
  6. Spark开发环境搭建(提供实验平台)
  7. Proteus:单片机用按键控制LED的亮灭
  8. 计算机虚拟建造创新实践英语,英语作业创新设计实践
  9. 用51单片机c语言实现电磁炉功能,基于单片机电磁炉控制系统设计..doc
  10. mysql 错误 ERROR 2006 (HY000)