
什么是nginx
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器
nginx 目前有那些功能
- 静态服务器
- 正向代理
- 反向代理
- 负载均衡
- 资源缓存
nginx的原理
基础知识 C/S模式
C-S 模式 Client-Server 模式 也叫 客户端-服务器模式
客户端和服务器之间约定好各种协议,客户端输入指令 服务器返回计算结果

基础知识 Http 协议
Http 协议头
Http_Head 以
\r\n换行浏览器将 协议头 发送至服务器
Request Method: GET
Accept: text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Cookie: BIDUPSID=6FDCB80C810B35D150145FAB9A30365B;
Host: www.baidu.com
Referer: https://www.baidu.com/
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36
X-Requested-With: XMLHttpRequest
Http 协议简单认知
HTTP是基于客户/服务器模式,且面向连接的。典型的HTTP事务处理有如下的过程
-
客户与服务器建立连接;
-
客户向服务器提出请求;
-
服务器接受请求,并根据请求返回相应的文件作为应答;
-
客户与服务器关闭连接。
基础知识 OS
Socket 的 文件描述符fd
socket中的fd:fild descriptor,就是一个套接字描述器。
在UNIX中的一切事物都是文件(everything in Unix is a file!) 我们用int在描述socket,实际上,所有的文件描述符都是int,用的是一个整数类型。 文件是应用程序与系统(包括特定硬件设备)之间的桥梁,而文件描述符就是应用程序使用这个“桥梁”的接口。在需要的时候,应用程序会向系统申请一个文件,然后将文件的描述符返回供程序使用。返回socket的文件通常被创建在/tmp或者/usr/tmp中。我们实际上不用关心这些文件,仅仅能够利用返回的socket描述符就可以了。
Unix/Linux 一切皆文件
一切对文件的操作 read write ... 都离不开文件描述符FD (Id)
FD 在OS的进程(Process)中通过转换 指向了文件所在的首地址,用来操作文件
静态资源服务器
静态资源服务器基本设计
静态资源服务器 遵守 HTTP 协议 一来一回的将用户所需要的信息返回到浏览器客户端
静态资源服务器 需要有容器的根路径
/用来请求资源时 通过跟路径查找静态资源服务器 需要根据用户求情资源的不用 以字节流或字符流的形式向外输出 如
图片和HTML静态资源服务器 需要支持高并发情况下的资源请求
静态资源服务器时序图
如何将基本知识点连接起来 构建成一个静态服务器

伪代码-思路
socket c_socket;
linsten(&c_socket)
while(1){
fd = accept(&c_socket)
recevice_data = analuse_head(fd)
write(fd,resource(recevice_data))
close(fd)
}
正向代理
正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
正向代理自己即是Brower的Server端 又是 Ori_Server的客户端
伪代码-思路
socket c_socket;
socket s_socket;
linsten(&c_socket)
while(1){
fd = accept(&c_socket)
recevice_data = analuse_head(fd)
ip,port = find_routing_table(recevice_data)
// 服务器作为客户端伪代码
s_fd = connect(s_socket)
send(s_fd,relace_data(recevice_data))
data_buf = read(s_fd)
//向客户端输出
write(fd,data_buf)
close(fd)
}
正向代理用例图

反向代理
反向代理是代理服务器的一种。服务器根据客户端的请求,从其关联的一组或多组后端服务器(如Web服务器)上获取资源,然后再将这些资源返回给客户端,客户端只会得知反向代理的IP地址,而不知道在代理服务器后面的服务器簇的存在
反向代理用例图

负载均衡
分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务
- 轮询
代理的多台服务器 将按照顺序 一个个的向源服务器发送请求
- 随机
代理的多台服务器 将随机的向源服务器发送请求
- Hash
代理的多台服务器 将根据消费者客户端的IP 算出Hash值 算出的Hash值和服务器地址取模运算 定位出要访问的服务器地址
- 最小连接次数
代理的多台服务器 记录下每个服务器目前为止的连接次数,下一个连接到来时 将优先使用目前连接次数最少的服务器
资源缓存
静态文件如CSS js Image 这些不变的文件,如果相同的请求地址过来后,静态资源服务器已经缓存 不必再去原始服务器中获取资源,直接将本地已经缓存的数据发送至客户端,如没有在进行二次请求
以上构成自己的 mini_nginx