web服务的事务过程:客户端通过user agent(浏览器)发起请求,服务端响应(httpd、apache)

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)一万个并发请求 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工作在七层,修改源报文,隐藏后端服务器