一、Nginx简介

Nginx是一个开源且高性能、可靠的HTTP中间件、代理服务.

开源:直接获取源代码

高性能:支持海量高并发

1、nginx应用场景:

静态处理   (对静态页面的处理,不管是httpd还是nginx默认只能处理静态页面)

反向代理   (不直接处理客户端请求,而是将请求转交给其它服务器)

负载均衡   (长跟反向代理相结合,负责将客户端的请求转交给其它压力较小的服务器)

资源缓存  (对客户端经常访问的数据进行缓存,从而加快客户端的访问速度)

安全防护  (nginx对自己本身有一定防护措施)

访问限制   (有点类似于apache的order  deny,allow)

访问认证   (对所访问网站,进行添加用户名和密码)

单apache:同时处理客户端的理想值是2w

单nginx: 同时处理客户端的理想值是5w

nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务.众所周知nginx相比于Apache有更高的并发,可以接收处理更多的访问请求,这得益于IO模型,下面为大家介绍IO模型

二、I/O模型介绍

每次I/O,都要经由两个阶段

第一步:将数据从磁盘文件先加载至内核空间(缓冲区),等待数据准备完成,时间较长

第二步:将数据从内核缓存区复制到用户空间的进程的内存中,时间较短

3、同步异步,阻塞和非阻塞

同步异步的区别:

    同步 : 被调用者不会返回任务的状态,需要调用者不停询问

    异步 : 被调用者会向调用者返回任务的状态,不需要调用者不停询问

 

IO多路复用(select,epoll),异步阻塞

用户进程找一个代理select,而不直接与内核打交道,系统调用交于select进行处理。

用户进程收到资源从磁盘写入内核缓冲区信息后,将内核缓冲区内容复制到用户空间。

select接待用户进程不是一对一的方式,而是一对多。用户进程依旧阻塞于select调用。这个有点像吃饭,客人和服务员之间的关系,>客人不会和后厨打交道,交由服务员完成。

IO多路复用只能成为异步阻塞模型,因阻塞在IO调用那里,但一个select可以检测多个IO模型,相比与同步阻塞只能检测一个提高了cpu的利用率。

信号驱动型     (异步半阻塞)Apache

即用户进程建立SIGIO的信号处理程序,复制数据从磁盘到内核空间,等处理完递交SIGIO告知用户进程,这个过程是不阻塞的状态。

用户进程从内核空间复制到用户应用空间,这个过程是阻塞的。

信号驱动并未完全解决问题,只是做到了一部分不阻塞,一部分阻塞。

异步IO模型 (异步非阻塞)   Nginx

用户进程不受阻塞,所有的请求,拿数据拷贝到应用空间都由内核完成,用户进程可以接收更多的用户请求.

三、高并发原理

nginx高并发使用的是epoll的方式,提供给用户访问,复制数据的一些操作交由内核完成.自身做的事情越少接待的用户请求就越多.

epoll在linux2.6中增加了内存拷贝mmap机制,加速与内核空间的消息传递,既内存映射.

内存映射机制:磁盘中有数据,数据有对应的inode号,在内存中映射一个相同的inode好,大小也相同,下次拿数据不需要遍历inode号,分析路径了,这样提高了效率.

select 缺点

1. 能够监视文件描述符的数量存在最大机制

2. 线程遍历扫描效率低下

epool 模型

1. 每当FD就绪,采用系统的回调函数直接将FD放入,效率更高

2. 最大连接无限制

CPU亲和(affinity)

将CPU核⼼和Nginx⼯作进程绑定⽅式,把每个worker进程固定在⼀个cpu上执⾏,减少切换cpu 的 cache miss ,获得更好的性能。

sendfile

传统⽂件传输, 在实现上其实是⽐较复杂的, 其具体流程细节如下:

1.调⽤read函数,⽂件数据被复制到内核缓冲

2.read函数返回,⽂件数据从内核缓冲区复制到⽤户缓冲区

3.write函数调⽤,将⽂件数据从⽤户缓冲区复制到内核与socket相关的缓冲区。

4.数据从socket缓冲区复制到相关协议引擎。

传统⽂件传输数据实际上是经过了四次复制操作:

硬盘—>内核buf—>⽤户buf—>socket缓冲区(内核)—>协议引擎

也就是说传统的⽂件传输需要经过多次上下⽂的切换才能完成拷贝或读取,

 

Nginx基本简述的更多相关文章

  1. Nginx 配置简述

    不论是本地开发,还是远程到 Server 开发,还是给提供 demo 给人看效果,我们时常需要对 Nginx 做配置,Nginx 的配置项相当多,如果考虑性能配置起来会比较麻烦.不过,我们往往只是需要 ...

  2. nginx介绍(二) 架构篇

    2. nginx架构总览 传统的基于进程或者基于线程的模型处理并发的方式都是为每个连接单独创建一个处理进程或线程,会在网络传输或者I/O操作上阻塞.而这对应用来说,在内存和 CPU的使用上效率都是非常 ...

  3. Nginx入门篇-基础知识与linux下安装操作

    我们要深刻理解学习NG的原理与安装方法,要切合实际结合业务需求,应用场景进行灵活使用. 一.Nginx知识简述Nginx是一个高性能的HTTP服务器和反向代理服务器,也是一个 IMAP/POP3/SM ...

  4. web前端知识总结

    前言: 一直想着整理一下关于前端的知识体系和资料,工作忙了些,挤挤总会有的,资料很多,就看你能不能耐下心坚持去学了,要多学多敲多想,祝你进步~ 学习之前首先要大概了解什么是HTML ,CSS , JS ...

  5. IT运维面试问题总结

    IT运维面试总结如下,后期更新于:https://www.yuque.com/docs/share/d3dd1e8e-6828-4da7-9e30-6a4f45c6fa8e. 欢迎基于学习.交流目的的 ...

  6. 简述nginx(1)

    Nginx能做什么 1.反向代理 2.负载均衡 3.HTTP服务器(包含动静分离) 4.正向代理 反向代理 反向代理应该是Nginx做的最多的一件事了,什么是反向代理呢,以下是百度百科的说法:反向代理 ...

  7. 简述systemd的新特性及unit常见类型分析、使用systemd管理编译安装的nginx

    1. systemd新特性 并行处理(同时启动)所有服务. 基于依赖关系定义的服务控制逻辑 系统状态快照 按需激活进程,只有第一次被访问时才会真正启动: 2. systemd的常见unit类型 Ser ...

  8. nginx 集群简述

    1.负载均衡介绍: 负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助.其工作模式为将外部发送来的请求均匀分配到对称结构中的 ...

  9. SSL交互简述及nginx双向认证配置

    一.证书生成. 1.SSL Server生成私钥/公钥对.server.key(加密)/server.pub(解密):2.server.pub生成请求文件server.csr,包含server的一些信 ...

随机推荐

  1. RHCSA 第六天

    一.  创建下列用户.组和组成员资格: 1.创建名为 sysmgrs 的组 2.创建用户 natasha 同时指定sysmgrs作为natasha的附加组 3.创建用户 harry 同时指定 sysm ...

  2. Android开发 定时任务清理数据

    原文地址:Android开发 定时任务清理数据 | Stars-One的杂货小窝 公司项目,需要整定时任务,对数据进行清理,需要在每天凌晨0:00进行数据的清理,使用了Alarm和广播的方式来实现 P ...

  3. 工作自动化,替代手工操作,使用python操作MFC、windows程序

    目录 背景--为什么要自动化操作? 方法--怎么实现自动化操作? 查找窗体 发送消息 获取文本 总结 背景--为什么要自动化操作? 工作中总是遇到反复重复性的工作?怎么用程序把它变成自动化操作?将程序 ...

  4. Photoshop如何快速扣取图标

    由于图标往往与背景色区别很大,因此首先使用魔棒工具快速选择出图标 有时候选择出来是图标,有时候是背景色 可以通过选择反向来调节(右键即可) ctrl + J 提取出选择的区域 这时进行等分裁剪即可 点 ...

  5. 解决mybatis拦截器无法注入spring bean的问题

    公司要整合rabbitmq与mybatis拦截器做一个数据同步功能. 整合过程中大部分环节都没什么问题,就是遇到了mybatis拦截器 @Intercepts(@Signature(type = Ex ...

  6. react 没有嵌套关系的组件通讯

    前提准备四个文件,两个子组件:List.List2和一个events.js文件以及一个App.js父组件; 在src目录下创建events.js,里面的内容如下: // events.js(以常用的发 ...

  7. Spring Security过滤器链体系

    以下摘自胖哥分享的 2022开工福利教程. 在学习Spring Security的时候你有没有下面这两个疑问: Spring Security的登录是怎么配置的? Spring Security的访问 ...

  8. 日期类 Date

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...

  9. jdk1.5新特性之-----自动装箱与自动拆箱

    import java.util.ArrayList; /* jdk1.5新特性之-----自动装箱与自动拆箱. java是面向对象 的语言,任何事物都可以使用类进行描述,sun就使用了 一些类描述j ...

  10. Python—字符串常用函数

    Python-字符串常用字符串 字符串是一种表示文本的数据类型,使用单引号和双引号及三引号表示 访问字符串中的值字符串的每个字符都对应一个下标,下标编号是从0开始 转义字符字符串的格式化输出切片常用函 ...