nginx的介绍

Nginx
一:Web服务基础介绍:
正常情况下的单次web服务访问流程:

1.1:互联网发展历程回顾:
1993年3月2日,中国科学院高能物理研究所租用AT&T公司的国际卫星信道建立的接入美国SLAC国家实验室的64K
专线正式开通,成为我国连入Internet的第一根专线。
1995年马云开始创业并推出了一个web网站<<中国黄页>>,1999年创建阿里巴巴 www.alibabagroup.com, 2003
年5月10日创立淘宝网,2004年12月,马云创立第三方网上支付平台支付宝(蚂蚁金服旗下,共有蚂蚁金服支付
宝、余额宝、招财宝、蚂蚁聚宝、网商银行、蚂蚁花呗、芝麻信用等子业务板块。),2009年开始举办双十一购
物狂欢节,以下是历年交易成交额:
2009年双十一:5000万元;
2010年双十一:9.36亿元;
2011年双十一:33.6亿元;
2012年双十一:191亿元;
2013年双十一:350亿元;
2014年双十一:571亿元;
2015年双十一:912.17亿元;
2016年双十一:1207亿元元;
2017年双十一:1682.69亿元;
2018年双十一:2135亿元;
2012年1月11日淘宝商城正式更名为“天猫”。 2014年9月19日里巴巴集团于纽约证券交易所正式挂牌上市。 2018
年福布斯统计马云财富346亿美元。
1.2:web服务介绍:
Netcraft公司于1994年底在英国成立,多年来一直致力于互联网市场以及在线安全方面的咨询服务,其中在国际上
最具影响力的当属其针对网站服务器,域名解析/主机提供商,以及SSL市场所做的客观严谨的分析研究。
https://news.netcraft.com/

1.2.1:Apace-早期的web服务端:
Apache起初由美国的伊利诺伊大学香槟分校的国家超级计算机应用中心开发,目前经历了两大版本分别是1.X和
2.X,其可以通过编译安装实现特定的功能,目前支持三种不同的MPM(multi-processing module,多进程处理模
块,官方网站:http://www.apache.org。
1.2.1.1:Apache prefork模型:
预派生模式,有一个主控制进程,然后生成多个子进程,使用select模型,最大并发1024,每个子进程有一个独立
的线程响应用户请求,相对比较占用内存,但是比较稳定,可以设置最大和最小进程数,是最古老的一种模式,也
是最稳定的模式,适用于访问量不是很大的场景。 优点:稳定 缺点:大量用户访问慢,占用资源,1024个进程不
适用于高并发场景

1.2.1.2:Apache woker模型:
一种多进程和多线程混合的模型,有一个控制进程,启动多个子进程,每个子进程里面包含固定的线程,使用线程
程来处理请求,当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,由于其使
用了线程处理请求,因此可以承受更高的并发。 优点:相比prefork 占用的内存较少,可以同时处理更多的请求 缺
点:使用keepalive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释
放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。(该问题在prefork模式下,同
样会发生)

Apache中最新的模式,2012年发布的apache 2.4.X系列正式支持event 模型,属于事件驱动模型(epoll),每个进
程响应多个请求,在现在版本里的已经是稳定可用的模式。它和worker模式很像,最大的区别在于,它解决了
keepalive场景下,长期被占用的线程的资源浪费问题(某些线程因为被keepalive,空挂在哪里等待,中间几乎没
有请求过来,甚至等到超时)。event MPM中,会有一个专门的线程来管理这些keepalive类型的线程,当有真实
请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能
力。 优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keep-alive类
型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放 缺点:没有线程安全控


1.2.2:Nginx-高性能的web服务端:
Nginx是由1994年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯rambler.ru公司开发的,开发工作最早从
2002年开始,第一次公开发布时间是2004年10月4日,版本号是0.1.0,官网地址 www.nginx.org
Nginx历经十几年的迭代更新(https://nginx.org/en/CHANGES), 目前功能已经非常完善且运行稳定,另外
Nginx的版本分为开发版、稳定版和过期版,Nginx以功能丰富著称,它即可以作为http服务器,也可以作为反向
代理服务器或者邮件服务器,能够快速的响应静态网页的请求,支持FastCGI/SSL/Virtual Host/URL
Rwrite/Gzip/HTTP Basic Auth/http或者TCP的负载均衡(1.9版本以上且开启stream模块)等功能,并且支持第三方
的功能扩展。
为什么使用Nginx: 天猫 淘宝 小米 163 京东新浪等一线互联网公司都在用Nginx或者进行二次开发
基于Nginx的访问流程如下:

1.2.3:用户访问体验统计:
互联网存在用户速度体验的1-3-10原则,即1秒最优,1-3秒较优,3~10秒比较慢,10秒以上用户无法接受。用户
放弃一个产品的代价很低,只是换一个URL而已。
全球最大搜索引擎 Google:慢500ms = 20% 将放弃访问。 全球最大的电商零售网站 亚马逊:慢100ms = 1% 将
放弃交易
1.2.4:性能影响:
http://baijiahao.baidu.com/s?id=1643187950686234006&wfr=spider&for=pc #用户体验的重要性
http://www.sohu.com/a/218426004_573333

1.2.4:性能影响:
http://baijiahao.baidu.com/s?id=1643187950686234006&wfr=spider&for=pc #用户体验的重要性
http://www.sohu.com/a/218426004_573333有很多研究都表明,性能对用户的行为有很大的影响: 79%的用户表示不太可能再次打开一个缓慢的网站 47%的
用户期望网页能在2秒钟以内加载 40%的用户表示如果加载时间超过三秒钟,就会放弃这个网站 页面加载时间延迟
一秒可能导致转换损失7%,页面浏览量减少11% 8秒定律:用户访问一个网站时,如果等待网页打开的时间超过8
秒,会有超过30%的用户放弃等待
1.2.4.1:影响用户体验的几个因素:
据说马云在刚开始创业在给客户演示时,打开一个网站花了两个多小时。
https://www.shuimiao.net/NjHaO/
1.2.4.2:应用程序工作模式:
客户端硬件配置
客户端网络速率
客户端与服务端距离
服务端网络速率
服务端硬件配置
服务端架构设计
服务端应用程序工作模式
服务端并发数量
服务端响应文件大小及数量
服务端I/O压力
httpd MPM(Multi-Processing Module,多进程处理模块)模式:
prefork:进程模型,两级结构,主进程master负责生成子进程,每个子进程负责响应一个请求
worker:线程模型,三级结构,主进程master负责生成子进程,每个子进程负责生成多个线程,每个线程响应一个请

event:线程模型,三级结构,主进程master负责生成子进程,每个子进程生成多个线程,每个线程响应一个请求,但
是增加了一个监听线程,用于解决在设置了keep-alived场景下线程的空等待问题。
Nginx(Master+Worker)模式:
主进程
工作进程 #直接处理客户的请求
#Centos 7.x目前默认为prefork模式,ubuntu 18.04已经使用event模式
Apache线程验证方式:
[[email protected] ~]# httpd -V #Centos系统
AH00558: httpd: Could not reliably determine the server’s fully qualified domain name,
using localhost.localdomain. Set the ‘ServerName’ directive globally to suppress this
message
Server version: Apache/2.4.6 (CentOS)
Server built: Aug 8 2019 11:41:18
Server’s Module Magic Number: 20120211:24
Server loaded: APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture: 64-bit
Server MPM: prefork #MPM模式为prefork
threaded: no

ps -ef | grep httpd1.2.4.3:服务端I/O:

I/O在计算机中指Input/Output, IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数),是衡量磁盘
性能的主要指标之一。IOPS是指的是在单位时间内系统能处理的I/O请求数量,一般以每秒处理的I/O请求数量为单
位,I/O请求通常为读或写数据操作请求。
root 2757 1 0 04:03 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 2758 2757 0 04:03 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 2759 2757 0 04:03 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 2760 2757 0 04:03 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 2761 2757 0 04:03 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 2762 2757 0 04:03 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
root 2786 2369 0 04:13 pts/0 00:00:00 grep –color=auto httpd

cat /proc/2760/status

Name: httpd
State: S (sleeping)

Threads: 1

#Ubuntu 18.04.3系统:
[email protected]:~# apachectl -V
Server version: Apache/2.4.29 (Ubuntu)
Server built: 2019-09-16T12:58:48
Server’s Module Magic Number: 20120211:68
Server loaded: APR 1.6.3, APR-UTIL 1.6.1
Compiled using: APR 1.6.3, APR-UTIL 1.6.1
Architecture: 64-bit
Server MPM: event #MPM模式为event
threaded: yes (fixed thread count)
forked: yes (variable process count)

ps -ef | grep apache2

root 918 1 0 20:08 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 919 918 0 20:08 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 920 918 0 20:08 ? 00:00:00 /usr/sbin/apache2 -k start
root 1202 1172 0 20:12 pts/0 00:00:00 grep –color=auto apache2

cat /proc/919/status

Name: apache2
Umask: 0022
State: S (sleeping)

Threads: 27

机械磁盘的寻道时间、旋转延迟和数据传输时间:
寻道时间:是指磁头移动到正确的磁道上所花费的时间,寻道时间越短则I/O处理就越快,目前磁盘的寻道时间一般在
3-15毫秒左右。一

旋转延迟:是指将磁盘片旋转到数据所在的扇区到磁头下面所花费的时间,旋转延迟取决于磁盘的转速,通常使用磁盘
旋转一周所需要时间的1/2之一表示,比如7200转的磁盘平均训传延迟大约为601000/7200/2=4.17毫秒,公式的
意思为 (每分钟60秒
1000毫秒每秒/7200转每分钟/2),如果是15000转的则为601000/15000/2=2毫秒。
数据传输时间:指的是读取到数据后传输数据的时间,主要取决于传输速率,这个值等于数据大小除以传输速率,目前
的磁盘接口每秒的传输速度可以达到600MB,因此可以忽略不计。
常见的机械磁盘平均寻道时间值:
7200转/分的磁盘平均物理寻道时间:9毫秒
10000转/分的磁盘平均物理寻道时间:6毫秒
15000转/分的磁盘平均物理寻道时间:4毫秒
常见磁盘的平均延迟时间:
7200转的机械盘平均延迟:60
1000/7200/2 = 4.17ms
10000转的机械盘平均延迟:601000/10000/2 = 3ms
15000转的机械盘平均延迟:60
1000/15000/2 = 2ms
每秒最大IOPS的计算方法:
7200转的磁盘IOPS计算方式:1000毫秒/(9毫秒的寻道时间+4.17毫秒的平均旋转延迟时间)=1000/13.13=75.9
IOPS
10000转的磁盘的IOPS计算方式:1000毫秒/(6毫秒的寻道时间+3毫秒的平均旋转延迟时间)=1000/9=111 IOPS
15000转的磁盘的IOPS计算方式:15000毫秒/(4毫秒的寻道时间+2毫秒的平均旋转延迟时间)=1000/6=166.6
一次完整的I/O是用户空间的进程数据与内核空间的内核数据的报文的完整交换过程,但是由于内核空间与用户空
间是严格隔离的,所以其数据交换过程中不能由用户空间的进程直接调用内核空间的内存数据,而是需要经历一次
从内核空间中的内存数据copy到用户空间的进程内存当中,所以简单说一次I/O就是把数据从内核空间中的内存数
据复制到用户空间中进程的内存当中的整个过程。
而网络通信就是从网络协议栈到用户空间进程的IO,也就是网络IO

磁盘I/O是进程向内核发起系统调用,请求磁盘上的某个资源比如是文件或者是图片,然后内核通过相应的驱动程
序将目标图片加载到内核的内存空间,加载完成之后把数据从内核内存再复制给进程内存,如果是比较大的数据也
需要等待时间。
1.3:系统I/O模型:
1.3.1:同步/异步:
关注的是事件处理的消息通信机制,即在等待一件事情的处理结果时,被调用者是否提供完成通知。 同步:
synchronous,调用者等待被调用者返回消息后才能继续执行,如果被调用者不提供消息返回则为同步,同步需要
调用者主动询问事情是否处理完成。 异步:asynchronous,被调用者通过状态、通知或回调机制主动通知调用
者,即异步会主动返回被调用者的状态给调用者。
1.3.2:阻塞/非阻塞:
关注调用者在等待结果返回之前所处的状态
1.3.3:系统IO模型组合:
每次IO,都要经由两个阶段:
第一步:将数据从磁盘文件先加载至内核内存空间(缓冲区),此步骤需要等待数据准备完成,时间较长
第二步:将数据从内核缓冲区复制到用户空间的进程的内存中,时间较短
同步:进程发出请求调用后,内核不提供通知机制,即文件IO处理完成后不通知进程,需要进程自己去问内核是否处理
完成。
异步:进程发出请求调用后,内核会在调用处理完成后返回调用结果给进程,Nginx是异步的。

1.3.2:阻塞/非阻塞:
关注调用者在等待结果返回之前所处的状态
1.3.3:系统IO模型组合:
每次IO,都要经由两个阶段:
第一步:将数据从磁盘文件先加载至内核内存空间(缓冲区),此步骤需要等待数据准备完成,时间较长
第二步:将数据从内核缓冲区复制到用户空间的进程的内存中,时间较短
同步:进程发出请求调用后,内核不提供通知机制,即文件IO处理完成后不通知进程,需要进程自己去问内核是否处理
完成。
异步:进程发出请求调用后,内核会在调用处理完成后返回调用结果给进程,Nginx是异步的。
阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起,干不了别的事
情。
非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成,最终的调用结果
返回之前,调用者不会被挂起,可以去做别的事情
以我去吃饭为例:我点了10个包子
同步与异步:
我点包子之后厨师是否告诉我:
同步:厨师做好包子后会放到指定位置,但是做好包子之前需要自己一次次去看包子做好没有,厨师不会在包子做
好之后通知我。
异步:厨师做好包子后告诉我包子做好放哪了。
阻塞与非阻塞::
我点包子后的状态:
阻塞:在厨师做包子期间一直在包子盘子前面等着,不能干别的事情。
非阻塞:点完包子就可以去干别的事情,比如去逛逛街或者买买买。
IO模型组合:
同步阻塞:我点完包子后不能去做别的事情,而且不知道包子有没有做好,需要自己一直等着并一次次的问厨师做好
没有。
同步非阻塞:点完包子后可以去做别的事情,但是不能长时间做别的事情,因为我还是不知道包子有没有做好,也要
自己一直等着并一次次的问厨师做好没有,只能抽空做点别的。
异步阻塞:我点完包子后不能去走做别的事情,但是厨师在做好包子后会告诉我,也就是我不用再一次次为厨师包子
有没有做好了。
异步非阻塞:我点完包子后可以做别的事情,而且可以一直在做别的去事情,因为厨师在做好包子后会告诉我。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注