百度百科:
常见的HTTP服务
Nginx应⽤用场景
Nginx特性、优点
IO多路复⽤(epoll)
拓展1:IO复用:
拓展2:IO多路复用:
select
epool模型
轻量量级
功能模块少
代码模块化:
CPU亲和(affinity)
sendfile
Nginx的架构
框架模型
两种进程
模块化设计
Nginx特点:
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网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
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多路复⽤的实现⽅式有
select
、poll
、epoll(Nginx使用的就是这个)
,select和epoll是Linux下常用的多路复用模型
select
最先出现,select会一直遍历应用的的所有需要IO操作的进程,线性遍历。
一直遍历应用,找返回的.
select缺点
- 能够监视⽂件描述符的数量存在最⼤限制(默认1014)
- 线性遍历扫描效率低下
epool模型
- 每当FD就绪,采⽤系统的回调函数之间将 fd放⼊ ,效率更⾼。
- 最⼤连接⽆限制
轻量量级
特点:
- 功能模块少
- 代码模块化
功能模块少
源代码只保留了跟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层的负载均衡
- 动静分离:
将静态的资源放到反向服务器,节省用户的访问时间.