?个人主页:啊陈晓
?学习方向:java后端开发
?我的上一篇文章:【玩转Springcloud Alibaba系列】使用Nacos 实现服务注册与负载均衡
?如果我的文章对你有帮助,点赞、收藏、留言都是对我最大的动力
【注意】:
由于篇幅原因,博主将Nginx的教学分为概念篇和实战篇,大家可以根据需求进行不同的模块的学习,当然搭配在一起学习效果更佳喔~
【深入浅出Nginx系列】文章直通车~
【玩转Nginx系列】Nginx入门?看这一篇就够了(概念篇)
现在让我们正式开启进入今天的正文
文章目录
前言
博主最近在学习SpringCloud Alibaba相关的内容,在学习到Nacos集群的搭建和持久化时,发现整个集群架构需要搭建Niginx集群来实现整个集群的高可用性。而在此之前,博主也只是仅仅听闻过Nginx的一些信息,于是为了能够顺利搭建nacos集群,博主恶补了Nginx,并将所学的内容通过文章的形式分享给大家~
下图即Nacos集群架构图:
一、什么是Nginx
Nginx是一个由俄罗斯的程序设计师Igor Sysoev所开发的高性能的HTTP和反向代理服务器。有着占有内存少,并发能力强的特点,在高连接高并发的情况下,Nginx能成为Apache服务器不错的替代品。
二.为什么我们要学习Nginx?
刚刚我们说到,Nginx是一款并发能力强的代理服务器,也从一开始说到搭建Nacos需要搭建Nginx集群来保证整个集群架构的高可用性。那Nginx到底能够帮助我们做些什么呢?我们不妨来通过几张图片来了解一下
- 当我们刚刚开发完一个服务时,此时并发量不高,用户量小,在这时候,服务器能够轻松承受住负载压力,出色完成任务
- 随着我们项目的持续完善,并发量和用户量也随之增多,此时一个服务器已经完全不能满足不了用户的需求了,此时便需要通过增加服务器来分担原本一台服务器的负载。
- 而在多台服务器和多个客户端之间,就需要一个代理服务器来为我们实现负载均衡和转发请求等功能。
![]()
如果你觉得还是难以理解,那么我举一个小例子:
双十一那天,大家都在一个时间段内在淘宝进行消费,面对这么多的用户量,淘宝的后台有着成千上万台服务器去应对,那如何合理地将用户的请求分发到各个服务器保证服务的高可用性?代理服务器的任务,就是利用好各个服务器的资源,将用户量均衡到各个服务器,避免单台服务器的压力过大,从而保证下单、支付、查询等服务的正常运作。
而Nginx便是一种出色的完成高并发任务的代理服务器,被应用于一下这些场景:
- 正向代理
- 反向代理
- 负载均衡
- 动静分离
而上述场景,我将一一为你介绍
三、正向代理与反向代理
1.什么是正向代理?
我们拿微服务中生产者和消费者的理论进行回答:
如上图所示,我们使用Edge浏览器去访问大名鼎鼎的Github,此时Github作为外网,访问的时候需要翻墙,而这便会导致资源加载的特别慢。此时我们便可以通过配置一个访问速度较快的代理服务器去帮我们完成这一次任务,在本次过程中:
- 我们消费者
- 我们是被代理者
而这种代理方式,便称为正向代理。
2.什么是反向代理?
还是熟悉的结构图,还是使用我们拿微服务中生产者和消费者的理论进行回答:
如上图所示,假如你所在的公司研发了一套Web服务并搭建在不同的服务器上,此时,Web服务的每一台服务器是没有办法直接接收到用户的请求的。此时,你便可以通过反向代理服务器去接收来自互联网的请求并通过负载均衡将请求合理的分配到各个服务器中。在本次过程中:
- 我们是生产者(服务提供者)
而这种方式,我们称之为反向代理
四、负载均衡
如果你有了解过微服务相关的知识,想必你对”负载均衡“这个词一定不会陌生。而我们在上文中介绍Nginx的时候,其实已经介绍到了负载均衡。看完了上文,让我们再来看看负载均衡的概念:
什么是负载均衡?
负载均衡(Load Balance,简称 LB)是高并发、高可用系统必不可少的关键组件,目标是 尽力将网络流量平均分发到多个服务器上,以提高系统整体的响应速度和可用性
还是很熟悉的分布式架构,如图所示
将原先请求集中到单个 服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,就是我们所说的负载均衡。拿负载均衡中最常见的轮询举一个小例子:图中共3台服务器,此时来了7个请求,在没有设置权重的情况下对请求进行分配:第一个请求----------第一个服务器第二个请求----------第二个服务器第三个请求----------第三个服务器第四个请求----------第一个服务器第五个请求----------第二个服务器第六个请求----------第三个服务器第七个请求----------第七个服务器通过轮询的方式使每一台服务器都尽可能被分发到相同数量的请求
设置权重的轮询方式
除了默认的轮询方式外,我们还可以为各个服务器设置权重 ,为性能较强的服务器分配较高的权重,可以使相对更多的请求分配到这台服务器上 ,从而达成对资源的合理利用。
五、动静分离
什么是动静分离?
动静分离是指为了加快网站的解析速度,可以把 动态页面 和 静态页面 由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。
先来看看什么是静态请求和动态请求:
静态请求:客户端访问服务器的静态网页, 不涉及任何数据的处理动态页面:客户端会将数据提交给服务器如下图所示:Nginx在静态服务器和动态服务器中针对动态请求和静态请求做了不同的处理
这样能够使:
- 前后端开发并行,彼此互不干扰
- 减轻后端服务器压力,提高静态资源访问速度
- api接口服务化,即后端只需要通过提供api接口即可
六、Nginx的工作原理
上图即是Nginx的底层架构,现在我们把流程缕一遍:
master进程: 读取并验证配置信息(nginx.conf)、监控每个worker进程工作状态
worker进程:处理连接和请求
假设当前有3个请求:
在第一个请求进来后,worker通过争抢最终由worker1获得了请求的处理权并被master监控。
此时第二个请求进来,由于worker还在处理上一个请求,于是由剩余的worker进行争抢并最终由worker2获得请求。
最后第三个请求进来,此时worker1已经处理完上一个请求,又重新加入到争抢请求的worker队伍中........
这样设置的好处是什么?
对于每个 worker 进程来说,独立的进程,不需要加锁,所以节省掉了锁带来的开销- 采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程会监控到并很快启动新的 worker 进程
能避免因一台worker的宕机导致的所有请求的失败
总的来说,nginx采用了模块化、事件驱动、异步、单线程及非阻塞的架构和多路复用及事件通知机制,将连接请求由为数不多的只有一个线程的进程worker以高效的回环(run-loop)机制进行处理,使每个worker可以并行处理数千个的并发连接及请求。这便造就了nginx强大的高并发处理能力。
总结
相信看到这里的你,一定对Nginx有了新的认识,但是光是了解概念是远远不够的。在下期内容中,博主将针对反向代理、负载均衡、动静处理、及nginx集群搭建等经典场景进行实战,通过代码的形式使大家能够更深层次的了解Nginx的强大之处,真正带你从浅入深的学好Nginx的内容!!