0
点赞
收藏
分享

微信扫一扫

1、Nginx的http协议

HTTP协议

http协议指令

与MySQL相比较
get相当于select
post相当于insert
put相当于update
delect相当于delect

https

https=http+tls   就是把http协议封装在tls(lls)协议里面         
tls也可以用来加密别的协议,如ftps、mysqls

http请求访问的完整过程(打开网站链接发生什么)

一:域名解析  
先查本地hosts文件,如果解析不了,查本地DNS,没有,就进行DNS递归查询
二:解析出来IP之后,通过三次握手确认连接。
三:发送http请求到达服务器,服务器响应报文返回html页面,有七个过程
1、建立连接
2、发送请求
3、服务器收到请求,处理请求
4、访问资源
5、构建响应报文
6、发送响应报文
7、记录事务处理过程
四:浏览器进行渲染、合成、绘制
五:http协议是一个短连接的应用层协议,过一会就断开了,然后就是四次挥手

HTTP相关技术

WEB前端开发语言

html :超文本标记语言,编程语言,主要负责实现页面的结构

css :定义了如何显示(装扮) HTML 元素,样式通常保存在外部的 .css 文件中,用于存放一些HTML文件的公共属性,从而通过仅编辑一个简单 的 CSS 文档,可以同时改变站点中所有页面的布局和外观.

javascript :实现网页的动画效果,但实属于静态资源

MIME:多用途互联网邮件扩展 让html资源可以支持除了以上三种,还可以支持图片、视频、音频等
格式由:type/subtype txt html jpg bmp  大类型/小类型  后跟子类型  文件是:/etc/mime.types

url:www.baidu.com/  /后面的是url

网站访问量统计的重要指标

IP(独立IP):即Internet Protocol,指独立IP数.一天内来自相同客户机IP 地址只计算一次,记录远程客户机IP地址的计算机访问网站的次数,是衡量网站流量的重要指标 

PV(访问量): 即Page View, 页面浏览量或点击量,用户每次刷新即被计算一次,PV反映的是浏览某网站的页面数,PV与来访者的数量成正比,PV并不是页面的来访者数量,而是网站被访问的页面数量 

UV(独立访客):即Unique Visitor,访问网站的一台电脑为一个访客.一天内相同的客户端只被计算一次.可以理解成访问某网站的电脑的数量.网站判断来访电脑的身份是通过cookies实现的.如果更换了IP后但不清除cookies,再访问相同网站,该网站的统计中UV数是不变的

网站访问量 PV,IP,UV统计方法

使用文本工具, 比如awk提取IP,sort排序,uniq统计去重后统计IP数
第三方统计工具进行pv统计,比如: 百度统计,腾讯分析,piwik,alexa.cn开发自研统计平台.

HTTP工作机制

一次http事务包括:
http请求:http request
http响应:http response

Web资源:web resource, 一个网页由多个资源(文件)构成,打开一个页面,通常会有多个资源展 示出来,但是每个资源都要单独请求.因此,一个"Web 页面”通常并不是单个资源,而是一组资源的集合

资源类型:服务端和用户浏览器端拿到的文件内容是否一致,相同为静态,不同为动态
静态文件:无需服务端做出额外处理,服务器端和客户端的文件内容相同 
常见文件后缀:.html, .txt, .jpg, .js, .css, .mp3, .avi 
动态文件:服务端执行程序,返回执行的结果,服务器端和客户端的文件内容不相同 
常见文件后缀:.php, .jsp ,.asp

资源如何从互联网上进行下载

早期是串行连接:一个一个下,假如有一百个文件,首先建立三次握手,下载好第一个文件后,四次挥手,再此建立三次握手,下载第二个文件,然后四次挥手。一百个文件需要建立100次握手和挥手,而且还得排队,第一个文件下载不了,剩下的文件全在堵着,效率很低。

后来是并行连接:假如一百个文件,建立三次握手,客户端发请求访问首页,发现里面包含100个资源,同时建立100次三次握手,同时下载,在做100次四次挥手。但是效率也不高

持久连接:建立三次连接,一个连接里面传输100个资源,再四次挥手,只需要一次握手和挥手,但也存在排队问题。如果一个文件下载慢,后面的都会被堵住。

管道化持久连接:建立好连接之后,在一个连接里面把100个资源同时下载,不排队。

提高HTTP连接性能

并行连接:通过多条TCP连接发起并发的HTTP请求 
持久连接:keep-alive,重用TCP连接,以消除连接和关闭的时延,以事务个数和时间来决定是否关闭连接 
管道化连接:通过共享TCP连接,发起并发的HTTP请求 
复用的连接:交替传送请求和响应报文(实验阶段)

http是短连接,下载好资源后,一会就断,因为http要接受大量客户的连接,所以不能让用户一直占着资源,但是http服务如何会话保持?

HTTP协议报文头部结构
http请求报文

开始行(请求行):方法 URL 版本 回车换行  (get方法没有数据)
首部行:首部字段名 值 回车换行(有多行)
实体主体:数据

http响应报文

开始行(状态行):版本 状态码 短语 回车换行  (短语是对状态码的解释)
首部行:首部字段名 值 回车换行(有多行)
实体主体:数据


http协议的状态码分类

1xx:100-101 信息提示 
2xx:200-206 成功 
3xx:300-307 重定向 
4xx:400-415 错误类信息,客户端错误 
5xx:500-505 错误类信息,服务器端错误

http协议常用的状态码

304: 客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端; Not Modified 307: 浏览器内部重定向 
401: 需要输入账号和密码认证方能访问资源;Unauthorized 
403: 请求被禁止;Forbidden,一般是因为权限错误或主页文件不存在 
404: 服务器无法找到客户端请求的资源;Not Found 
413: 上传的资源超过了最大限制值 
499: 客户端主动断开连接.然而在实际业务开发中,当出现 HTTP 499 状态码时,大部分都是由于服务端 请求时间过长,导致客户端等的“不耐烦”了,因此断开了连接.比如:慢SQL问题,499是客户端读超时关闭 连接造成的,推荐从超时时间或者优化响应速度入手,web服务器发现客户端主动关闭连接后,记录到access 日志中的.可能是客户端接收响应超时了,可以先在客户端统计下是不是这个原因,再调查为什么会导致超时 
500: 服务器内部错误;Internal Server Error,比如:cgi程序没有执行权限,或连接数据库失 败,rewrite死循环 502: Bad Gateway,代理服务器从后端服务器收到了一条错误响应,如无法连接到网关;Bad Gateway, 比如:后端服务端口没有打开,或后端服务不可用,iptable -j REJECT 
503: 服务不可用,临时服务器维护或过载,服务器无法处理请求,比如:超过连接数和连接频率 
504: Gateway Timeout,网关超时,或者后端服务器无回应报文,比如:服务端口虽然打开,但服务返回结果 时间过长,iptable -j DROP

Cookie

http协议是无状态的,每次发起请求,服务器端无法判断这次请求和上次请求的关联关系。Cookie基于http协议,是服务器发送到用户浏览器并保存再客户端本地的一小块数据,它会在浏览器下一次向同一服务器再发起请求时被携带并发送到服务器上,用于保持用户的信息。

Cookie存放于浏览器内存空间,或者写入磁盘中,每个浏览器都有各自的Cookie,静态页面没有Cookie,虽然浏览器可禁用Cookie,但是不要禁用。

压力测试工具

httpd的压力测试工具:ab 模拟客户端向网站发起连接,看访问速度。

ab -c10 -n 100 http://www.wangxiaochun.com/
Requests per second:    3.66 [#/sec] (mean)   每秒钟3个

-n:总请求数 -c:模拟的并发数 -k:以持久连接模式测试

Apache三种工作模型

Apache prefork模型:主进程生成多个子进程,每个子进程对应一个线程来处理客户的请求,占用内存,并发性差,但比较稳定,适合访问量不大的场景

Apache worker模型:主进程控制启动多个子进程,子进程里面包含固定的线程,当线程不够用时在启动新的子进程,子进程再启动线程处理请求。可以承受更高的并发,但即使没有数据传输,线程也会被占用着,直到超时才会释放。会导致高并发场景下无线程可用。

Apache event模型:和worker线程比较像,但它多了一个监听线程,解决了线程被长期占用导致资源浪费的问题。但apache存在c10k问题,并发连接数极限为1万。

Nginx-高性能的 Web 服务端

功能:做web网站和反向代理

服务端i/o流程

I/O在计算机中指的是磁盘的输入输出(读写)功能,是衡量磁盘性能的主要指标之一。
IOPS指的是单位时间内系统能处理的I/O请求数量,一般以秒为单位。
I/O就是把数据从内核空间中的内存数据复制到用户空间中进程的内存当中.

Linux的I/O

磁盘I/O:是进程向内核发起系统调用,请求磁盘上的某个资源比如是html 文件或者图片,然后内核通过 相应的驱动程序将目标文件加载到内核的内存空间,加载完成之后把数据从内核内存再复制给进程内存,如果是比较大的数据也需要等待时间

网络I/O:一切皆文件,本质为对socket文件的读写
1、网络请求:用户发送请求到达网卡
2、copy:网卡收到后,copy到内核缓冲区,此步为硬件来完成(DMA,直接内存访问,不消耗CPU)
3、copy:cpu把内核空间的数据copy到用户空间的应用程序内存
4、用户空间处理请求,构建响应报文
5、copy:把响应报文从应用程序内存copy到内核空间
6、copy:内核空间再把响应报文copy到网卡
7、由网卡把数据发往用户。
内核空间与用户空间的来回切换是CPU来完成的。

网络I/O模型分为五种模型:阻塞型,非阻塞型,多路复用型,信号驱动型,异步

阻碍型:整个I/O请求的过程中,用户线程是被阻塞的,这导致用户在发起IO请求时,不能做任何事情,一直等
非阻塞型:用户线程发起IO请求时立即返回.但并未读取到任何数据,用户线程需要不断地发起IO请求,直到数据到达后,才真正读取到数据,继续执行。一次次的轮询,比较消耗CPU
信号驱动型:就是进程现在不用傻等着,也不用去轮询.而是让内核在数据就绪时,发送信号通知进程.
多路复用型:指一个线程可以同时监控和处理多个文件描述符对应各自的IO,即复用同一个线程。一个线程之所以能实现同时处理多个IO,是因为这个线程调用了内核中的SELECT,POLL或EPOLL等系统调 用,从而实现多路复用IO
异步I/O与信号驱动I/O最大区别在于,信号驱动是内核通知用户进程何时开始一个I/O操作,而异步I/O 是由内核通知用户进程I/O操作何时完成,

I/O模型:同步和异步 阻塞和非阻塞

同步和异步:关注的是消息通信机制,即调用者在等待一件事情的处理结果时,被调用者是否提供完成状态的通知.

同步:synchronous,被调用者并不提供事件的处理结果相关的通知消息,需要调用者主动询问事情是否处理完成 
异步:asynchronous,被调用者通过状态,通知或回调机制主动通知调用者被调用者的运行状态

阻塞和非阻塞:关注调用者在等待结果返回之前所处的状态

阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起,干不了别的事情. 
非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,而无需等到IO操作彻底完 成,在最终的调用结果返回之前,调用者不会被挂起,可以去做别的事情.

五种IO对比

这五种 I/O 模型中,越往后,阻塞越少,理论上效率也是最优前四种属于同步 I/O,因为其中真正的 I/O 操作(recvfrom)将阻塞进程/线程,只有异步 I/O 模型才与 POSIX 定义的异步 I/O 相匹配

I/O 的具体实现方式

Nginx支持在多种不同的操作系统实现不同的事件驱动模型,但是其在不同的操作系统甚至是不同的系 统版本上面的实现方式不尽相同,主要有以下实现方式:

select:select库是在linux和windows平台都基本支持的,最大并发限制1024
poll:在Linux 的基本驱动模型,windows不支持此驱动模型,是select的升级版,取消了最大的并发限制
epoll:epoll是库是Nginx服务器支持的最高性能的事件驱动库之一,是公认的非常优秀的事件驱动模型,它和 select和poll有很大的区别,epoll是poll的升级版

为什么Nginx为Apache性能要好

Nginx支持epoll、io多路复用、支持MMAP还有sendfile

零拷贝

传统 Linux中 I/O 的问题
内核空间与用户空间的来回切换是CPU来完成的,来回切换会消耗大量的CPU资源,严重影响数据传输的性能

零拷贝就是上述问题的一个解决方案,通过尽量避免拷贝操作来缓解CPU的压力.零拷贝并没有真正做到“0”拷贝,它更多是一种思想,很多的零拷贝技术都是基于这个思想去做的优化

零拷贝相关技术

MMAP(内存映射)
磁盘文件复制到内存空间,内核空间有了index文件,通过用户空间映射到内核空间,不再复制到用户空间,减少了复制,节省cpu

sendfile  
磁盘文件复制到内存空间,内核空间有了index文件,不在映射,也不再复制

DMA辅助的sendfile
磁盘文件复制到内存空间,内核空间有了index文件,直接发出去,需要借助硬件。

举报

相关推荐

0 条评论