Nginx

Nginx的这些你了解么?

首先官方给出的解释是这样的
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了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的都知道,Nginx以高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名,我给大家讲解一下,nginx为什么这么快!
话不多说,先上图
Nginx 的进程模型
Nginx服务器,在正常运行过程中:
多进程:一个Master进程(主进程),多个Worker进程(工作进程)
Master进程:用来管理Worker进程。主要功能分为:
对外接口:接收外部操作(信号)
对内转发:根据外部的操作不同,通过信号管理Worker
监控:监控Worker的运行状态,如果Worker进程异常终止后,自动重启Worker进程。
Worker进程:所有worker进程都是平等的。
实际处理:网络请求,由Worker进程处理
Worker进程数量:在nginx.conf中配置,一般设置为核心数,可以充分利用cpu的资源,
同时避免进程数量过多,避免进程竞争cpu资源,增加上下文的损耗。
说了这么多关于Nginx的东西,那么问题来了。
1.请求是链接到Nginx,Master进程负责处理和转发?
2.如何选定哪个Worker进程处理请求?请求的处理结果,是否还要经过Master进程?
不多说,上图
HTTP连接建立和请求处理过程
http连接建立和请求处理过程如下:
1.Nginx启动时,Master进程,加载配置文件。
2.Master进程,初始化监听的Socket(注释:两个网络各自通信连接中的端点,用于完成两个应用程序之间的数据传输)。
3.Master进程,fork出多个Worket进程。
4.Worker进程,竞争新的链接,获胜方通过三次握手,建立Socket连接,并处理请求。
Nginx高性能,高并发
Nginx为什么具有高性能并且能够支撑高并发?
1.Nginx采用多线程+异步非阻塞方式(IO多路复用Epoll)
(注释:epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本)
2.请求的完整过程:建立链接–>读取请求–>解析请求–>处理请求–>响应请求
3.请求的完整过程对应到 底层 就是读写Socket事件。
Nginx的事件处理模型
Request:Nginx中HTTP请求
基本的HTTP Web Service 工作模式:
接受请求:逐行读取请求行和请求头,判断有没有请求体后读取请求体。
处理请求。
返回响应:根据处理结果,生成相应的HTTP请求(请求头,请求行,请求体)
其实Nginx的模式跟HTTP整体流程基本一致,不多说上图:
模块化体系结构
Nginx的模块根据其功能基本上可以分为以下几种类型
①event module:搭建了独立于操作系统的事件处理机制的框架,及提供了各具体事件的处理。包括 ngxeventsmodule,ngxeventcoremodule 和 ngxepoll_module 等。
Nginx 具体使用何种事件处理模块,这依赖于具体的操作系统和编译选项。
②phase handler:此类型的模块也被直接称为 handler 模块。主要负责处理客户端请求并产生待响应内容,比如 ngxhttpstatic_module 模块,负责客户端的静态页面请求处理并将对应的磁盘文件准备为响应内容输出。
③output filter:也称为 filter 模块,主要是负责对输出的内容进行处理,可以对输出进行修改。
例如,可以实现对输出的所有 html 页面增加预定义的 footbar 一类的工作,或者对输出的图片的 URL 进行替换之类的工作。
④upstream:upstream 模块实现反向代理的功能,将真正的请求转发到后端服务器上,并从后端服务器上读取响应,发回客户端。
upstream 模块是一种特殊的 handler,只不过响应内容不是真正由自己产生的,而是从后端服务器上读取的。
⑤load-balancer:负载均衡模块,实现特定的算法,在众多的后端服务器中,选择一个服务器出来作为某个请求的转发服务器。
Nginx vs Apache
Nginx:
1.IO多用复路,Epoll(freebsd上是kquese)
2.高性能
3.高并发
4.占用资源少
Apache:
1.阻塞+多进程/多线程
2.更稳定,bug少
3.模块更丰富
Nginx最大连接数
基础背景:
Nginx 是多进程模型,Worker进程用于处理请求
单个进程的连接数(文件描述符fd),有上限(nofile):ulimit-n.
Nginx上配置单个Worker进程的最大连接数:worker_connections上限为nofile
Nginx配置Worker进程的数量:worker_processes
因此,Nginx的最大连接数:
Nginx的最大连接数:Worker进程数量x耽搁Worker进程的最大连接数
上面是Nginx作为通用服务器时,最大的连接数量
Nginx作为反向代理服务器时,能够服务的最大连接数:(Worker进程数量×单个Worker进程的最大连接数)/2
Nginx反向代理时,会建立Client的链接和后端Web Service的链接,占用2个连接。
看了这么久想一下下面的问题:
1.每打开一个Socket占用一个fd?
2.为什么一个进程能够打开的fd数量有限制?
HTTP 请求和响应
HTTP 请求:
• 请求行:method、uri、http version
• 请求头
• 请求体
HTTP 响应:
• 响应行:http version、status code
• 响应头
• 响应体
IO 模型
处理多个请求时,可以采用:IO 多路复用或者阻塞 IO+多线程:
• IO 多路复用:一个线程,跟踪多个 Socket 状态,哪个就绪,就读写哪个。
• 阻塞 IO+多线程:每一个请求,新建一个服务线程。
IO 多路复用和多线程的适用场景?
• IO 多路复用:单个连接的请求处理速度没有优势。
• 大并发量:只使用一个线程,处理大量的并发请求,降低上下文环境切换损耗,也不需要考虑并发问题,相对可以处理更多的请求。
• 消耗更少的系统资源(不需要线程调度开销)。
• 适用于长连接的情况(多线程模式长连接容易造成线程过多,造成频繁调度)。
• 阻塞 IO +多线程:实现简单,可以不依赖系统调用。
• 每个线程,都需要时间和空间。
• 线程数量增长时,线程调度开销指数增长。
select:
• 查询 fd_set 中,是否有就绪的 fd,可以设定一个超时时间,当有 fd (File descripter) 就绪或超时返回。
• fd_set 是一个位集合,大小是在编译内核时的常量,默认大小为 1024。
• 特点:连接数限制,fdset 可表示的 fd 数量太小了;线性扫描:判断 fd 是否就绪,需要遍历一边 fdset;数据复制:用户空间和内核空间,复制连接就绪状态信息。
poll:
• 解决了连接数限制:poll 中将 select 中的 fd_set 替换成了一个 pollfd 数组,解决 fd 数量过小的问题。
• 数据复制:用户空间和内核空间,复制连接就绪状态信息。
epoll,event 事件驱动:
• 事件机制:避免线性扫描,为每个 fd,注册一个监听事件,fd 变更为就绪时,将 fd 添加到就绪链表。
• fd 数量:无限制(OS 级别的限制,单个进程能打开多少个 fd)。
select,poll,epoll:
• I/O 多路复用的机制。
• I/O 多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作;监视多个文件描述符。
• 但 select,poll,epoll 本质上都是同步 I/O:用户进程负责读写(从内核空间拷贝到用户空间),读写过程中,用户进程是阻塞的;异步 IO,无需用户进程负责读写,异步 IO,会负责从内核空间拷贝到用户空间。
Nginx 的并发处理能力
关于 Nginx 的并发处理能力:并发连接数,一般优化后,峰值能保持在 1~3w 左右。(内存和 CPU 核心数不同,会有进一步优化空间)
来源:ningg.top/nginx-series-principle
注:以上仅代表个人意见,如果大家发现问题欢迎指正,本人只是小白一名,跟大家一起进步。
–世间纷繁

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值