Nginx详细介绍(并从技术层面深度剖析)

news2024/11/27 16:35:14

nginx介绍

  • 1.nginx 介绍
  • 2.nginx的优势
  • 3.Nginx VS Apache
    • 3.1.内核、语言、诞生时间比较
    • 3.2.功能比较
    • 3.3Nginx 相对 apache 的优点
  • 4.Nginx为什么有这么多的优势?
    • 4.1.IO多路复用(I/O multiplexing【多并发】)
    • 4.2.nginx的驱动模型介绍
    • 4.3.nginx的异步非阻塞模式
    • 4.4.理解同步、异步、阻塞、非阻塞

1.nginx 介绍

Nginx (engine x) 是一个轻量级,高性能的 HTTP 和 反向代理 服务,也是一个IMAP/POP3/SMTP服务。因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。

2.nginx的优势

  • Nginx 是一个高性能的 Web 和反向代理服务器,它具有有很多非常优越的特性
  • 作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应。
  • 作为负载均衡服务器:可以进行自定义配置,支持虚拟主机,支持URL重定向,支持网络监控,支持流媒体传输等。Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器对外进行服务。Nginx 用 C 编写,不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
  • 作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器)。
  • Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器
  • Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。nginx还能够在不间断服务的情况下进行软件版本的升级。

nginx的优点:
1、高并发,高性能(单机环境下参考服务器配置,并发连接数在7000+到8000左右。集群模式20000+)
2、高可靠。可以7*24小时不间断运行
3、可扩展性强。模块化设计,使得添加模块非常的平稳。
4、支持热部署。可以在不停止服务器的情况下升级nginx
5、BSD许可证。nginx不止开源免费的,我们还可以更具实际需求进行定制修改源代码

3.Nginx VS Apache

3.1.内核、语言、诞生时间比较

最大的区别:事件驱动模型不一样,nginx使用的是异步非阻塞模式,apache使用的同步阻塞模式。

特性NginxApache
请求管理事件驱动模型,使用异步套接字处理,占用较少的内存和CPU开销同步套接字、进程和线程每个请求都要使用一个单独的进程或线程,使用同步套接字
设计语言CC、C++
可移植性多平台多平台
诞生时间20021994

3.2.功能比较

功能NginxApache
HTTPS支持作为模块支持作为模块支持
虚拟主机原生支持原生支持
CGI支持仅支持FastCGI支持CGI和FastCGI
系统模块静态模块系统动态模块系统

FastCGI的介绍
快速通用网关接口(Fast Common Gateway Interface/FastCGI)是通用网关接口(CGI)的改进,描述了客户端和服务器程序之间传输数据的一种标准。
FastCGI致力于减少Web服务器与CGI程序之间互动的开销,从而使服务器可以同时处理更多的Web请求。
与为每个请求创建一个新的进程不同,FastCGI使用持续的进程来处理一连串的请求。这些进程由FastCGI进程管理器管理,而不是web服务器。
从以上功能上的对比,我们很难发现哪些功能Apache无法实现。

3.3Nginx 相对 apache 的优点

  • 轻量级,同样是web服务器比Apache 占用更少的内存及资源
  • apache采用的就是进程和线程模式工作,来一个请求就开启一个进程或者线程,大大的占用系统的资源
  • 开源免费(费用)
  • 静态处理性能强:Nginx 静态处理性能比 Apache 高 3倍以上(性能)
  • 抗高并发:Nginx是采用异步非阻塞来处理请求的,而Apache则是阻塞型的。在高并发下Nginx 能保持低资源低消耗高性能。
  • 在Apache+PHP(prefork)模式下,如果PHP处理慢或者前端压力很大的情况下,很容易出Apache进程数飙升,从而出现拒绝服务的现象。
  • 高度模块化的设计:编写模块相对简单(功能多);
  • 解决了强耦合的问题,让代码依赖性变低变弱,甚至是互不干扰的工作,让我们定制软件提供了很大的便利,就是可以自定义安装模快;如果只使用3个模快,你给我装20个模快,那就浪费了我系统的资源。
  • 社区活跃:各种高性能模块出品迅速(可维护性成本低)

4.Nginx为什么有这么多的优势?

从技术层面深度剖析nginx程序的设计思想

4.1.IO多路复用(I/O multiplexing【多并发】)

多并发在生活中的案例:超市收银口的收银员,将每个收银口看成一个处理请求的线程,当人数不多的时候,开一个收银口一个收银员就能应付,但是当人数多起来了,一个收银口应付不来那么多人了(对应的是海量的请求),这时就需要开启多个收银口来应对大量的顾客,而顾客则可以根据收银员的忙碌程度进程自由选择的排队

  • 第一种方法就是最传统的多进程并发模型 (每进来一个新的I/O流会分配一个新的线程管理。)
    1
  • 第二种方法就是I/O多路复用 (单个线程,通过记录跟踪每个I/O流(sock)的状态,来同时管理多个I/O流 );发明它的原因,是尽量多的提高服务器的吞吐能力。在同一个线程里面, 通过拨开关的方式,来同时传输多个I/O流
    2

4.2.nginx的驱动模型介绍

一个请求到来了,nginx使用epoll接收请求的过程是怎样的?

  • select,poll,epoll 都是I/O多路复用的具体的实现,其实是他们出现是有先后顺序的。
  • I/O多路复用这个概念被提出来以后, 相继出现了多个方案,但是都需要linux内核支持
  • select是第一个实现 (1983 左右实现的)。 select 被实现以后,很快就暴露出了很多问题。
    • select 任何一个sock(I/O stream)出现了数据,select 仅仅会返回,但是并不会告诉你是那个sock上有数据,于是你只能自己一个一个的找,10几个sock可能还好,要是几万的#sock每次都找一遍就跟快递员送快递一样,每次快递到了都得你自己去快递箱里面找,可想而知多麻烦
    • select 只能监视1024个链接。
    • select 线程不是安全的。
  • 于是14年以后(1997年)一帮人又实现了poll, poll 修复了select的很多问题,比如
    • poll 去掉了1024个链接的限制,于是可以有多个连接进来。​但是poll仍然线程不是安全的,这就意味着,不管服务器有多强悍,也只能在一个线程里面处理一组I/O流。
  • epoll:可以说是I/O 多路复用最新的一个实现,epoll 修复了poll 和select绝大部分问题,比如
    • epoll 现在是线程安全的。
    • epoll 现在不仅告诉你sock组里面数据,还会告诉你具体哪个sock有数据,你不用自己去找了。

ngnix会有很多连接进来, 默认采用epoll会把他们都监视起来,然后像拨开关一样,谁有数据就拨向谁,然后调用相应的代码处理。

4.3.nginx的异步非阻塞模式

//查看服务器中nginx的worker进程
# yum -y install  psmisc
# pstree |grep nginx
 |-+= 81666 root nginx: master process nginx
 | |--- 82500 nobody nginx: worker process
 | \--- 82501 nobody nginx: worker process
//1个master进程和n个work进程

每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到什么程度呢?
处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。
那么,这个处理的worker不会这么一直等着,他会在发送完请求后,注册一个事件:“如果upstream返回了,告诉我一声,我再接着干”。于是他就休息去了。这就是【异步】。
此时,如果再有request 进来,他就可以很快再按这种方式处理。这就是非阻塞和IO多路复用。而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。这就是【异步回调】。

4.4.理解同步、异步、阻塞、非阻塞

当我们使用一个简单的读取文件的操作来举例说明:

  1. 同步阻塞(Synchronous Blocking):
    在同步阻塞模式下,程序发起读取文件的请求后,会一直等待文件读取完成,期间无法进行其他操作。只有当文件读取完成后,程序才能继续执行后续操作。
  2. 异步阻塞(Asynchronous Blocking):
    在异步阻塞模式下,程序发起读取文件的请求后,会立即返回并继续执行其他操作。但是程序会周期性地查询文件是否已经读取完成,如果未完成,则会一直等待,直到文件读取完成后再继续执行后续操作。
  3. 同步非阻塞(Synchronous Non-blocking):
    在同步非阻塞模式下,程序发起读取文件的请求后,会立即返回并继续执行其他操作。程序会不断地轮询文件是否已经读取完成,如果未完成,则会立即返回并继续轮询,直到文件读取完成后再继续执行后续操作。
  4. 异步非阻塞(Asynchronous Non-blocking):
    在异步非阻塞模式下,程序发起读取文件的请求后,会立即返回并继续执行其他操作。当文件读取完成后,系统会通过回调函数或者事件通知的方式来通知程序文件已经读取完成,程序再进行后续处理。

同步和异步是针对程序等待操作完成的方式,阻塞和非阻塞是针对程序等待I/O操作完成的方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1392978.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大屏数据可视化的设计流程及原则

随着数字经济的快速发展和信息化在各行业各领域的深入推进,可视化大屏在各行各业得到越来越广泛的应用。可视化大屏不再只是电影里奇幻的画面,而是被实实在在地应用在政府、商业、金融、制造、交通、城市等各个行业的业务场景中,切切实实地实…

Net Core Ocelot+Consul实现网关、服务注册、服务发现

什么是Ocelot? Ocelot是一个开源的ASP.NET Core微服务网关,它提供了API网关所需的所有功能,如路由、认证、限流、监控等。 Ocelot是一个简单、灵活且功能强大的API网关,它可以与现有的服务集成,并帮助您保护、监控和扩展您的微…

人工智能 AI 如何让我们的生活更加便利

每个人都可以从新技术中获益,一想到工作或生活更为便利、简捷且拥有更多空余时间,谁会不为之高兴呢?借助人工智能,每天能够多一些空余时间,或丰富自己的业余生活,为培养日常兴趣爱好增添一点便利。从电子阅…

小程序 常用组件

文章目录 常见组件viewtextimageswipernavigatorrich-textnodes属性 buttoniconfromradiocheckbox 常见组件 重点讲解⼩程序中常⽤的布局组件 view,text,rich–text,button,image,navigator,icon,swiper,radio,checkbox。 等 view 代替 原来的 div 标签 <view hover-clas…

【C语言基础考研向】05 scanf读取标准输入超详解

文章目录 一.scanf函数的原理 样例问题原因解决方法 二.多种数据类型混合输入 错误样例正确样例 一.scanf函数的原理 C语言未提供输入/输出关键字&#xff0c;其输入和输出是通过标准函数库来实现的。C语言通过scanf函数读取键盘输入&#xff0c;键盘输入又被称为标准输入。…

Qt绘画的使用

1. 绘图 绘图组件&#xff1a; 1、绘画对象 2、绘画位置 3、绘画工具 4、绘画时机 绘画时机&#xff1a; 当整个窗口或窗口的一部分需要重新绘制时&#xff0c;会调用绘制事件处理函数 void QWidget::paintEvent(QPaintEvent *event) 绘画对象&#xff1a; QPainter类&#xff…

java基础:求数组的最值

方法一&#xff1a;顺序查找 先假设数组第一个元素为最值&#xff0c;然后和数组里的数按顺序进行比较得出最值&#xff0c;所以叫顺序查找。 代码如下 package idea;public class arr_int {public static void main(String[] args) { // 初始化一个数组int[] arr {12…

【MYSQL】事务隔离级别

脏读、幻读、不可重复读 脏读 一个事务正在对一条记录做修改&#xff0c;在这个事务完成并提交前&#xff0c;另一个事务也来读取同一条记录&#xff0c;读取了这些未提交的“脏”数据&#xff0c;并据此做进一步的处理&#xff0c;就会产生未提交的数据依赖关系。这种现象被形…

渗透测试之Mimikatz2.2 如何抓取Win11登录明文密码

环境: 1.攻击者IP:192.168.1.35 系统: KALI2022(vmware 16.0) 2.靶机IP:192.168.1.16 系统: Windows11 3.USB无线网卡 4.Mimikatz 2.2 (win版) 问题描述: Mimikatz2.2 如何抓取Win11登录明文密码 解决方案: Wdigest WDigest协议是在WindowsXP中被引入的,旨在与H…

Kafka 消息不能正常消费问题排查

订单宽表数据不同步 事情的起因是专员在 ze app 上查不到订单了&#xff0c;而订单数据是从 mysql 的 order_search_info 查询的&#xff0c;order_search_info 表的数据是从 oracel 的 BZ_ORDER_INFO 表同步过来的&#xff0c;查不到说明同步有问题 首先重启&#xff0c;同步…

如何快速打造属于自己的接口自动化测试框架

1 接口测试 接口测试是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及相互逻辑依赖关系。 接口自动化相对于UI自动化来说&#xff0c;属于更底层的测试&#xff0c;这样带来的好处就是测试收益更大&#xff…

系统配置dns主从服务器

一、准备两台主机&#xff0c;区分主从 二、完全区域传送 1、主DNS服务器配置 #安装相关的包 [rootoula1 ~]# yum install bind -y#关闭防火墙 [rootoula1 ~]# systemctl stop firewalld [rootoula1 ~]# setenforce 0#修改配置主文件 [rootoula1 ~]# vim /etc/named.conf opt…

oop面向对象编程python

1.定义一个圆类&#xff08;Circle&#xff09;,求圆的面积和周长 import mathclass Circle():def __init__(self, R ,name):self.radius Rself.name namedef girth(self):return 2 * self.radius * math.pidef area(self):return self.radius ** 2 * math.pic1 Circle(10,&q…

全球移动通信市场,正在经历哪些新变化?

2023年已经结束了。回顾这一年的全球移动通信市场&#xff0c;如果让我用一个词来总结&#xff0c;那就是——“厚积薄发”。 从表面上来看&#xff0c;似乎并没有什么大事情发生。但实际上&#xff0c;平静的湖面之下&#xff0c;却是一片波涛汹涌、风云激荡。 无论是消费互联…

springcloud Eureka服务注册与发现

文章目录 代码地址Eureka基础知识什么是服务治理什么是服务注册与发现 单机版eurekaServerIDEA生成eurekaServer端服务注册中心类似物业公司EurekaClient端cloud-provider-payment8001修改EurekaClient端cloud-consumer-order80 集群Eureka构建步骤新建cloud-eureka-server7002…

Android平台Unity下如何通过WebCamTexture采集摄像头数据并推送至RTMP服务器或轻量级RTSP服务

技术背景 我们在对接Unity下推送模块的时候&#xff0c;遇到这样的技术诉求&#xff0c;开发者希望在Android的Unity场景下&#xff0c;获取到前后摄像头的数据&#xff0c;并投递到RTMP服务器&#xff0c;实现低延迟的数据采集处理。 在此之前&#xff0c;我们已经有了非常成…

Jxls 实现动态导出功能

目录 引言前端页面后端代码excel模板导出效果 引言 在实际做项目的过程中&#xff0c;导出报表时需要根据每个人所关注的点不一样&#xff0c;所需导出的字段也不一样&#xff0c;这时后端就需要根据每个所选的字段去相应的报表&#xff0c;这就是本文要讲的动态导出报表。 前端…

线程的使用

线程的创建方式 1、实现Runnable Runnable规定的方法是run()&#xff0c;无返回值&#xff0c;无法抛出异常 实现Callable 2、Callable规定的方法是call()&#xff0c;任务执行后有返回值&#xff0c;可以抛出异常 3、继承Thread类创建多线程 继承java.lang.Thread类&#xff0…

Docker registry镜像仓库,私有仓库及harbor管理详解

目录 registry镜像仓库概述 Docker 镜像仓库&#xff08;Docker Registry&#xff09;&#xff1a; registry 容器&#xff1a; 私有仓库概述 搭建本地私有仓库示例 Harbor概述 harbor架构 详解构成 Harbor由容器构成 Harbor部署示例 环境准备 部署Docker-Compose服…

uniapp中uview组件库的NoticeBar 滚动通知 使用方法

目录 #平台差异说明 #基本使用 #配置主题 #配置图标 #配置滚动速度 #控制滚动的开始和暂停 #事件回调 #API #Props #Events 该组件用于滚动通告场景&#xff0c;有多种模式可供选择 #平台差异说明 AppH5微信小程序支付宝小程序百度小程序头条小程序QQ小程序√√√√…