1.1Nginx概述

TOC

Nginx概述

参考:

百度百科:

Nginx是俄罗斯人研发的,应对Rambler的网站,并且2004年发布的第一个版本。
Nginx (engine x) 是一个高性能的HTTP反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。

其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

来源: https://baike.baidu.com/item/nginx/3817705?fr=aladdin

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器(代理中间件),是一个开源且高性能、可靠的HTTP中间件、代理服务。

特点:开源,高性能,可靠的http中间件,代理服务,稳定性强,有丰富的配置实例,占用内存小


常见的HTTP服务

nginx是一个http服务,那么还有哪些常见的http服务呢?

  • HTTPD->Apache基金会(海量容易崩溃)
  • IIS->微软
  • GWS->Google(不对外开放)
  • openrestry(基于nginx+lua开发)->;
  • tengline->淘宝基于Nginx开发
  • lighttpd->;

Nginx应⽤用场景

  • 静态处理理
  • 反向代理理
  • 负载均衡
  • 资源缓存
  • 安全防护
  • 访问限制
  • 访问认证

Nginx特性、优点

  • IO多路复用(epoll)
  • 轻量级
  • CPU亲和(affinity)
  • sendfile

IO多路复⽤(epoll)

拓展1:IO复用:

在这里插入图片描述

并行处理整个IO请求,一个socket处理多个请求,上图使用的是多线程方式.

拓展2:IO多路复用:

多个描述符的I/O操作都能在一个线程内并发交替地顺序完成,这就叫I/O多路复用,这里的"复用"指的是复用同一个线程

比如老师给学生解答问题,

  • 普通的并行就是多个老师对应多个学生,看着学生,随时准备回答问题;浪费资源;
  • IO多路复用就是,学生有问题主动上报给老师,老师再去回答问题,省资源。
  • Nginx基于IO多路复⽤
  • IO复用(主动上报)解决的是并发性的问题, Socket作为复用;

    对于IO请求的时候,请求默认都是阻塞状态,当一个IO初始化、可用的时候,内核态会主动上报,唤醒对应的进程进行处理

  • IO多路复⽤的实现⽅式有selectpollepoll(Nginx使用的就是这个),select和epoll是Linux下常用的多路复用模型

在这里插入图片描述

select

最先出现,select会一直遍历应用的的所有需要IO操作的进程,线性遍历。

一直遍历应用,找返回的.

在这里插入图片描述

select缺点

  1. 能够监视⽂件描述符的数量存在最⼤限制(默认1014)
  2. 线性遍历扫描效率低下

epool模型
  1. 每当FD就绪,采⽤系统的回调函数之间将 fd放⼊ ,效率更⾼。
  2. 最⼤连接⽆限制

轻量量级

特点

  • 功能模块少
  • 代码模块化

功能模块少

源代码只保留了跟HTTP以及它相关核心功能的那一部分核心模块的代码;一些不够核心,或者是一些类似于可以作为插件式的来进行安装的,不会被集成在nginx的源代码里面.

  • 好处:性能高,
  • 缺点:不够全面,插件少;

代码模块化:

  • 易读
  • 容易进行二次改进,对开发人员友好

CPU亲和(affinity)

Nginx利用了CPU亲和提升并发处理能力和对CPU的工作实际效率,减少不必要的额外性能损耗.

Nginx有多个worker进程处理工作, 将CPU核⼼和Nginx⼯作进程worker绑定,把每个 worker进程固定在一个cpu上执行,减少切换 cpu的 性能损耗 ,获得更好的性能。

为了防止nginx使用的时候被影响,一般会采取这些操作

关闭iptables:
    iptables -L  #查看是否开启
    iptables -F #关闭
    iptables -t nat -L   #查看net中是否有规则
    iptables -t nat -F  #关闭nat规则
停用selinux:
    getenforce #查看是否关闭  disabled 代表关闭了
    setenforce 0 #关闭

sendfile

正常情况下,用户获取一个文件的时候,通过操作系统的内核空间和用户空间,到达socket,然后通过response给用户

在这里插入图片描述

但是实际上,静态文件是不需要通过用户空间的,因此这种方式浪费资源。

使用sendfile就不需要进入用户空间,提高效率

在这里插入图片描述

Nginx的架构

框架模型

在这里插入图片描述

  • Master 进程:监视工作进程的状态;当工作进程死掉后重启一个新的;处理信号和通知工作进程。
  • Worker 进程:处理客户端请求,从主进程处获得信号做相应的事情。
  • Cache Loader 进程:加载缓存索引文件信息,然后退出。
  • Cache Manager进程:管理磁盘的缓存大小,超过预定值大小后最少使用数据将被删除。

两种进程

Nginx有两种进程,一个master(主进程)进程,一种是worker(工作进程)((一个(windows版本的目前只有一个)或者多个))进程。

流程:

  • 主进程(Master)并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程非停升级

    或者说是:监视工作进程的状态;当工作进程死掉后重启一个新的;处理信号和通知工作进程。

    所以,nginx启动以后,查看操作系统的进程列表,我们就能看到至少有两个nginx进程。

  • 工作进程(worker):实际处理网络请求及响应的.

    在类unix系统上,nginx可以配置多个worker,而每个worker进程都可以同时处理数以千计的网络请求。

worker进程的数量当然也不是越多越好,实际调优的时候,一般要根据cpu 的数量而定。

为什么这几个worker进程却能支撑上万甚至上十万的并发呢?

原因是Nginx设计的时候是基于非阻塞式的方式,能做到非阻塞是因为它的线程模型是基于Linux里面的epoll/select模型,这个也类似于我们java中nio的多路复用选择器模型。事件驱动加上异步非阻塞的io模型,可以说是nginx得以获得高并发、高性能的关键因素。同时学过netty的同学会发现,底层是有很多相似之处的。

模块化设计

Nginx还有一个特点就是模块化设计。nginx的worker,包括核心和功能性模块;

  • 核心模块负责维持一个运行循环(run-loop),执行网络请求处理的不同阶段的模块功能,如网络读写、存储读写、内容传输、外出过滤,以及将请求发往上游服务器等。

其代码的模块化设计,也使得我们可以根据需要对功能模块进行适当的选择和修改,编译成具有特定功能的服务器。

Nginx的核心模块

在这里插入图片描述

Nginx特点:

正向代理,反向代理 负载均衡 动静分离...

  • 正向代理:需要我们用户,手动的设置代理服务器的ip和端口号
  • 反向代理:用来代理服务器的,用户不需要设置.
  • 负载均衡:
    原理就是数据流量分摊到多个服务器上执行,减轻每台服务器的压力,
    多台服务器共同完成工作任务,从而提高了数据的吞吐量

    nginx就是7层的负载均衡

  • 动静分离:
    静态的资源放到反向服务器,节省用户的访问时间.




原文地址:https://www.cnblogs.com/ziyue7575/p/8f2702bbbb532d72d9683cdbb9e365d9.html