Code前端首页关于Code前端联系我们

面试官经常会问一些关于Nginx的问题:如何实现高并发?

terry 2年前 (2023-09-28) 阅读数 61 #未命名
面试官常问Nginx的几个问题:如何实现高并发?

1.Nginx是什么?

Nginx 是一个高性能的 HTTP 和反向代理服务器以及 IMAP/POP3/SMTP 服务器

Nginx 是一个轻量级的 Web 服务器/反向代理服务器和电子邮件(IMAP/POP3) 代理服务器是目前最常用的 Web 服务器服务器或代理服务器,如淘宝、新浪、网易、迅雷等。

2。为什么使用 Nginx?

优点:

  • 多平台,配置简单
  • 高并发连接数的非阻塞连接:可处理20000-30000个并发连接,官方监控可支持50000个并发连接Lx1只开内存L 150M内存,成本低:开源
  • 内置健康检查功能:如果服务器宕机,会进行健康检查,然后不会向宕机的服务器发送请求。重新向其他节点提交请求。
  • 节省带宽:支持GZIP压缩,可以添加本地浏览器缓存
  • 稳定性高:失败概率很小
  • master/worker结构:主进程生成一个或多个worker进程
  • 接收用户请求是异步的:浏览器向nginx服务器发送请求,nginx服务器首先接受所有用户请求,然后一次性发送到后端Web服务器,这大大减轻了Web服务器在接收请求时的压力
  • web服务器返回数据同时发送到浏览器客户端
  • 网络依赖性比较低,只要ping通就可以均衡负载
  • 可以有多个nginx服务器
  • 事件驱动:通信机制采用epoll模型

3。为什么Nginx性能这么高?

利用其事件处理机制: 异步非阻塞事件处理机制:利用epoll模型,为排队、排队

4提供了解决方案。 Nginx如何实现高并发

启动nginx服务然后输入#ps -ef|grep nginx,你会发现Nginx有一个主进程和几个工作进程。这些工作流程都是一样的,都是由master分支的。在主机上,首先创建一个需要监听的socket(listenfd),然后拆分多个worker进程。当用户登录到 nginx 时,每个工作线程的listenfd 都变得可读,并且这些工作线程会得到一个叫做accept_mutex 的东西。 Accept_mutex 是互斥的。如果一名工人得到了它,其他工人就会辞职。捕获此accept_mutex的工作人员将开始“读取请求 - 解析请求 - 处理请求”。当数据完全返回给客户端后(电脑屏幕上显示出目标网页),事件就彻底结束了。

nginx通过这种方式让核心worker注册用户请求,同时也采用“异步非阻塞”的方式实现高并发。

5。为什么不使用多线程呢?

因为线程和上下文切换消耗大量资源,线程占用大量内存,上下文切换占用大量CPU。为了避免这个缺点,使用了epoll

6模型。 Nginx 如何处理请求?

首先nginx启动时会解析配置文件得到需要监控的端口和IP地址,然后在nginx master进程中

首先初始化监控socket(创建socket,设置addreuse等options,绑定指定IP地址端口,然后监听)

然后fork(现有进程可以调用fork函数创建新进程,fork创建的新进程称为子进程),多个子进程会出来

然后子进程就会竞争接受新的连接。此时,客户端就可以向nginx发起连接了。当客户端与nginx进行三向握手,并与nginx建立连接时

,此时某个线程成功accept,获取到已建立连接的socket,然后在nginx中创建连接封装,即: ngx_connection_t结构体

接下来设置读事件处理函数和写入并添加读写事件与客户端交换数据。最后nginx或者客户端会主动关闭连接。此时连接结束

7。正向代理

服务器位于客户端和原始服务器(origining server)之间,为了从原始服务器获取内容而建立连接,客户端向代理发送请求并指定目的地(origining server)

然后代理将请求转发给原服务器,并将获取到的内容返回给客户端。正向代理只能由客户端使用

正向代理可以用一句话来概括:代理就是客户端

8。反向代理

反向代理方法(Reverse Proxy)是指利用代理服务器接收连接互联网的请求,然后将请求发送到内部网络中的服务器

并返回得到的结果从服务器到客户端请求连接到互联网。这时,代理服务器就起到了与外界相反的作用。代理服务器

反向代理的总结就一句话:代理充当服务器

9的代理。动态资源和静态资源的分离

动态资源和静态资源的分离使得动态网站中的动态网页能够基于一定的规则来区分恒定资源和频繁变化的资源。划分好动态和静态资源

后,我们可以根据静态资源的特性来缓存它们。这就是处理静态网页的基本思想

动态资源和静态资源分离简单概括就是:动态文件和静态文件分离

10。为什么我们需要分离动态和静态资源?

在我们的软件开发中,有些请求需要后台处理(例如:.jsp、.do等),有些请求则不需要后台处理(例如:css、html、jpg、js等文件)

这些不需要后台处理的文件称为静态文件,否​​则称为动态文件。因此,我们的后台处理会忽略静态文件。有人会说我忽略后台静态文件就完了

当然可以,但是后台请求数当然会增加。当我们对资源响应速度有要求时,就应该采用这种动静分离策略来解决问题

动静分离将网站的静态资源(HTML、JavaScript、CSS、img等文件)与后台应用分开部署,提高用户访问静态代码的速度,减少对后台应用的访问

这里我们把静态资源放在nginx中,动态资源转发到Tomcat服务器

11。负载均衡

负载均衡是代理服务器 将接收到的请求均匀分配到各个服务器

负载均衡主要解决网络拥塞问题,提高服务器响应速度,就近提供服务,以达到更好的访问质量,减少大并发对后台服务器造成压力。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门