当前位置: 首页 > news >正文

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

nginx介绍

  • 1.nginx 介绍
  • 2.nginx的优势
  • 3.Nginx VS Apache
    • 3.1.内核、语言、诞生时间比较
    • 3.2.功能比较
    • 3.3.Nginx 相对 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.3.Nginx 相对 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操作完成的方式。

相关文章:

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

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

单元测试基本概念

单元测试一般是开发来做的,但是因为业务需要也曾涉及过单元测试。目前就单元测试的基础概念做下总结。 一、 单元测试定义: 单元测试是软件开发中的一种测试方法,用于验证程序中的最小可测单元——即代码中的单个函数、方法或模块。单元测试…...

ECTouch 电商微信小程序 SQL注入漏洞复现(CVE-2023-39560)

0x01 产品简介 ECTouch是一款开源的电商系统,为中小企业提供最佳的新零售解决方案 0x02 漏洞概述 ECTouch 电商系统 /ectouch-main/include/apps/default/helpers/insert.php 文件中第285行的 insert_bought_notes 函数中,传入的 $arr[id] 参数未进行验证和过滤,导致未经…...

MCM备赛笔记——熵权法

Key Concept 熵权法是一种基于信息熵概念的权重确定方法,用于多指标决策分析中。信息熵是度量信息量的不确定性或混乱程度的指标,在熵权法中,它用来反映某个指标在评价过程中的分散程度,进而确定该指标的权重。指标的分散程度越高…...

vscode设置terminal的最大行数

今天跑代码出现一个问题,就是整个程序跑完,整个程序的输出信息过多,最开始输出的信息已经被vscode的缓存冲掉了,只能看到最后的一部分,具体的原因是vscode的terminal默认只能保存1000行的信息,所以如果想保…...

kafka hang 问题记录

参考文档 https://cloud.tencent.com/developer/article/1821477 9092端口 端口9092通常与Apache Kafka关联。 Kafka是一个开源的分布式事件流平台,用于构建实时的数据管道和流应用。 它能够处理任意大小的数据,以容错的方式处理数据流。 在默认配置…...

Jmeter-BeanShell脚本中for循环里面使用random随机数函数,每次生成的都一样

预想的是每次循环生成的随机数不一样,但实际使用Random函数生成的是重复的。 以下是部分原代码: List updateList new ArrayList(); for(Object o: fieldList){Map map new HashMap();map.put("id", o.get("id"));map.put("…...

高级编程。JavaScript中有哪些类型转换机制?

一、概述 前面我们讲到,JS中有六种简单数据类型:undefined、null、boolean、string、number、symbol,以及引用类型:object 但是我们在声明的时候只有一种数据类型,只有到运行期间才会确定当前类型 let x y ? 1 : …...

Linux系统下常用软件安装汇总,包括mysql,java,git,redis等

01.环境搭建 1.安装列表 MySQL 5.7.11 Java 1.8 Apache Maven 3.6 tomcat8.5 git Redis Nginx python docker 2.安装mysql 1.拷贝mysql安装文件到Linux的某个目录下 2.解压Linux安装包:tar -xvzf mysql-5.7.32-linux-glibc2.12-x86_64.tar.gz 3.进入解压后…...

【Linux】——期末复习题(一)

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…...

【论文阅读】Speech Driven Video Editing via an Audio-Conditioned Diffusion Model

DiffusionVideoEditing:基于音频条件扩散模型的语音驱动视频编辑 code:GitHub - DanBigioi/DiffusionVideoEditing: Official project repo for paper "Speech Driven Video Editing via an Audio-Conditioned Diffusion Model" paper&#…...

【华为 ICT HCIA eNSP 习题汇总】——题目集4

1、(多选)网络中出现故障后,管理员通过排查发现某台路由器的配置被修改了,那么管理员应该采取哪些措施来避免这种状况再次发生? A、管理员应该通过配置 ACL 来扩展只有管理员能够登录设备 B、管理员应该在路由的管理端…...

hadoop-common: CMake failed with error code 1

问题 在编译hadoop源码时遇到如下错误 hadoop-common: CMake failed with error code 1 看了这个错误表示一脸懵逼 排查 在mvn 的命令中增加 -X 和 -e mvn clean package -e -X -Pdist,native -DskipTests -Dmaven.javadoc.skip -Dopenssl.prefix/usr/local/bin/openssl 在…...

【面试】-科大讯飞日常实习面试

科大讯飞日常实习面试 提问的问题 面试30min,基本就是介绍项目以及提问java八股文,没有算法题 java保证线程安全的方法 需要根据具体场景选择合适的方法来保证线程安全。java中的异步请求如何实现你的SpringBoot项目怎么匹配在线人数请说出spring springMVC springboot之间的…...

MySQL 数据加密

MySQL 数据加密主要用于保护存储在数据库中的敏感信息,如用户密码、个人身份信息等。MySQL 提供了多种数据加密方法,主要包括: 对称加密: AES_ENCRYPT() 和 AES_DECRYPT() 函数:MySQL 支持使用高级加密标准&#xff08…...

风丘科技为您提供完整的ADAS测试方案

一 方案概述 随着5G通讯与互联网的快速发展,智能汽车和ADAS辅助系统的研究与发展在世界范围内也在如火如荼地进行。风丘科技紧跟时代脚步,经多年积累沉淀,携手整车厂与高校共同研发打造出了一套完整且适用于国内ADAS测试的系统方案。 | ADAS…...

深入理解Rust基本类型

文章目录 一、概述二、数值类型2.1、整数类型2.2、浮点类型2.3、数字运算2.4、位运算2.5、序列(Range)2.6、有理数和复数 三、字符、布尔、单元类型3.1、字符类型3.2、布尔类型(bool)3.3、单元类型 团队博客: 汽车电子社区 一、概…...

cloudflare加速方法

一、使用Cloudflare优速域名或IP,实现国内访问加速 二、使用境外CN2、GIA等直连联网的VPS:如华纳云、彩红云等(未测试) 三、页面托管方案: 四、cloudflare合作伙伴计划:自定义cdn节点、dnspod提供的dns解析…...

密码学学习笔记(二十四):TCP/IP协议栈

TCP/IP协议栈的基础结构包括应用层、传输层、网络层、数据链路层和物理层。 应用层 应用层位于TCP/IP协议栈的最顶层,是用户与网络通信的接口。这一层包括了各种高级应用协议,如HTTP(用于网页浏览)、FTP(用于文件传输…...

软件测试阶段简介_单元测试、集成测试、配置项测试、系统测试

文章目录 前言一、软件测试“V”模型二、单元测试三、集成测试四、配置项测试五、系统测试总结 前言 一般来说,按照软件的研制阶段划分,软件测试可分为单元测试、集成测试、配置项测试、系统测试等。本文将对上述各测试阶段进行逐一介绍。 一、软件测试…...

AcWing 1204.错误票据(读取未知个数数据的新方法)

[题目概述] 某涉密单位下发了某种票据,并要在年终全部收回。每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。 因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另…...

项目上线存在的缓存问题以及存在的debugger和console.log等问题

下载uglifyjs-webpack-plugin插件 在vue.config文件中进行配置 publicPath: process.env.NODE_ENV production ? ./ : /,outputDir: n-sim-ipc-manage-build,productionSourceMap: false,configureWebpack: config > {//打包文件增加hashconfig.output.filename js/[nam…...

均线和布林线这样的关系,WeTrade众汇实例这样使用

在后台经常有交易者咨询:“我可以用加权平均线或指数代替移动平均线吗?”理论上,任何平均值都适合绘制BB。在回答这个问题之前,为了稳妥起见,WeTrade众汇通过对各种均线对比分析,却得出这样结论:经典均线是构建参考点最简单、最准…...

C++中的区块链与加密货币开发

区块链和加密货币是当前科技领域中备受关注的热门话题。C作为一种高效的编程语言,被广泛应用于区块链和加密货币的开发。在本篇文章中,我将介绍C在区块链和加密货币开发中的重要性以及其应用方面。 区块链开发框架:C提供了多种区块链开发框架…...

【云略】2023年新茶饮行业社媒营销洞察报告

(因篇幅有限,推文仅展示部分内容) 2023新茶饮行业卷的比往年更厉害。 在整体市场环境快速增长的情况下,新茶饮品牌纷纷开始拼产品、抢联名、赶上市,搞下沉,整个行业进入到一个新的博弈阶段。 2023年蜜雪冰城…...

19. C++ static关键字

1. static关键字 不考虑类的情况 隐藏-所有不加static的全局变量和函数具有全局可见性,可以在其他文件中使用,加了之后只能在该文件所在的编译模块中使用,即内部连接默认初始化为0,包括未初始化的全局静态变量与局部静态变量&am…...

thinkphp6 模糊查找json下的字段值

写法: where(json的字段->json下的字段) sql生成json_extract(json的字段,$.json下的字段1.json下的字段2) 可以加上like where(‘‘json的字段->json下的字段, ‘like’, ‘%’. keyword .’%’) sql生成json_extract(json的字段,$.js…...

链表存数相加算法(leetcode第2题)

题目描述: 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这…...

旅游项目day07

目的地攻略展示 根据目的地和主题查询攻略 攻略条件查询 攻略排行分析 推荐排行榜:点赞数收藏数 取前十名 热门排行榜:评论数浏览数 取前十名 浏览数跟评论数差距过大,可设置不同权重,例如:将浏览数权重设置为0.3…...

java黑马学习笔记

数组 变量存在栈中&#xff0c;变量值存放在堆中。 数组反转 public class test{public static void main(String[] args){//目标&#xff1a;完成数组反转int[] arr {10,20,30,40,50};for (int i 0,j arr.length - 1;i < j;i,j--){int tep arr[j]; //后一个值赋给临时…...