web服务的核心协议是应用层的http或https协议
Nginx:
engine X=Nginx
http协议:web服务器(类似httpd)、http reverse proxy(类似于httpd)、imap/pop3 reverse proxy---更多的是应用在reverse proxy
NGINX is a free,open-source,high-performance HTTP server and reverse proxy,as well as an IMAP/POP3 proxy server.
C10K(10K Connections)一万个并发请求br/>Tengine,OpenResty
http协议:URL(统一资源定位符)
URL:shceme://username:password@host:port/path;params?query#frag
定义本地路径映射
shceme:协议http(80)、https(443)、ftp
username:password:获取资源有可能需要认证
host:port:主机地址及进程,端口是用来标识进程的
path:资源路径,通常与文件系统加以映射
DocumentRoot:通常把url叫做location,完成映射以后,url的起始根是你自己定义的本地路径(/path/to/somedir---这是你自己定义的documentroot)---对用户进行限制访问可以基于url来定义(也就是location),也可以基于文件系统路径来定义
Alias:别名,也能来定义路径映射
params:有些路径是动态的,需要添加一些参数(比如附加自己的用户名)
格式:key=value&key=value多个可以用&连接起来
query:传递的查询条件,如果需要从数据库中获取某些数据,需要用到查询条件
格式:filed=value
#frag:定义网页的位置
http事务:
request:
<method><URL><VERSION>---请求方法(get、post),请求资源的url,协议的版本
HEADERS---name:value格式
<body>---请求报文的主体部分,根据方法不同内容会有所变化
response:
<VERSION><STATUS><REASON-PHRASE>---版本、状态码、原因短语
HEADERS---name:value格式
<body>
Method:GET/HEAD(请求资源只希望获得首部)/POST(提交表单),PUT(上传文件)/DELETE(删除文件),TRACE(追踪代理服务器)/OPTIONS(获取一个资源支持的请求方法列表)
Status Code:
1xx:基本响应码,没有太大意义
2xx:成功类响应码,200
3xx:重定向类的响应码,301,302,304(内容未修改)
4xx:客户端错误,403,404(未找到)
5xx:服务器端错误,502
认证:---http协议也支持认证
基于IP认证:哪个ip能不能访问,有两种一种是协议自带一种是iptables
基于用户认证:basic/digest---说的是认证信息在网上传输的格式和认证过程当中,可以简单理解为basic是明文的digest做了校验码认证(有些浏览器支持不完整)
还有一种表单认证:跟协议没有关系,而是服务器端的应用程序认证
httpd MPM:---并发响应模型,这三种并非是全部
prefork:进程模型,两级结构,主进程master负责预先生成子进程(空闲进程),每个子进程负责响应一个请求;一个请求用一个进程来响应---用的就是select()模型
worker:线程模型,三级结构,主进程master负责生成work子进程,每个子进程负责生成线程,每个线程响应一个请求;对于linux而言,进程线程都是轻量级的。
event:线程模型,但是没有线程实体,二级结构,主进程master负责生成子进程,每个子进程响应多个请求;
IO模型:
阻塞型、非阻塞型、复用型、(前边3个都是同步的)信号驱动型、异步(这两个是异步的)
同步/异步:
关注消息通知机制;
消息通知:
同步:等待对方返回消息,才能往后走
异步:被调用者通过状态、通知或回调机制通知调用者被调用者的运行状态;不用等待了,继续处理别的事情
阻塞/非阻塞
关注调用者在等待结果返回之前所处的状态;
阻塞:blocking,调用结果返回之前,调用者被挂起---不可中断的睡眠
非阻塞:nonblocking,调用结果返回之前,调用者不会被挂起,会不定时询问
调用有哪些?
程序自己的函数调用,系统调用,用户调用,远程调用(跨主机),同步调用
用户空间调用内核空间的函数(内核级的代码上有很多函数被写成代码库了)被称作系统调用,例如:网络报文发送、硬盘读写
一次系统IO请求(以磁盘为例),都会由两阶段组成:
第一步:等待数据,即数据从磁盘到内核内存---最消耗时间
第二步:复制数据,即数据从内核内存到进程内存
阻塞型io:两个步骤都阻塞
非阻塞型io:第一步非阻塞,第二步阻塞
复用型io调用:---复用型io:依然是阻塞的,没有阻塞在单路io上,而是阻塞在一个io复用器(内核级,帮助监控IO响应)上,意思是进程打算调用两路IO,自己不直接调用磁盘,两路都完成才叫醒进程,两个步骤都阻塞
select():1024帮助监控1024路io,也就是并发数,超过1024没有意义,性能没有变化,由BSD研发
poll():没有个数的限制,由unix研发,跟select差不多
信号驱动型io:第一步非阻塞,第二步阻塞,第一步给对方留一个回掉接口,然后该干嘛干嘛,等信号来了再处理,再阻塞
event-driven:
epoll(linux):libevent包
Kqueue(BSD)
/dev/poll(Solaris)
异步:两个步骤都不参与,都不阻塞,直接从内核拿数据使用
阻塞、非阻塞,举个例子:去面馆吃面要不要自己端,视频中还举了律师帮你打离婚官司
主程序调用函数会引入一个新的上下文结构,新的上下文跟原先的主程序没有关系,但是要返回一些执行结果。一般不返回结果是没有办法继续往下运行的。
nginx相当于dnat,但是dnat工作在四层,nginx工作在七层,修改源报文,隐藏后端服务器
原文:https://blog.51cto.com/13852573/2364133