小六聊聊-nginx的实现原理


什么是nginx

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器javascript

nginx 目前有那些功能

  1. 静态服务器
  2. 正向代理
  3. 反向代理
  4. 负载均衡
  5. 资源缓存

nginx的原理

基础知识 C/S模式

C-S 模式 Client-Server 模式 也叫 客户端-服务器模式 客户端和服务器之间约定好各类协议,客户端输入指令 服务器返回计算结果java

基础知识 Http 协议

Http 协议头

Http_Head 以 \r\n 换行nginx

浏览器将 协议头 发送至服务器git

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事务处理有以下的过程github

  1. 客户与服务器创建链接;web

  2. 客户向服务器提出请求;后端

  3. 服务器接受请求,并根据请求返回相应的文件做为应答;浏览器

  4. 客户与服务器关闭链接。缓存

基础知识 OS

Socket 的 文件描述符fdbash

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服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工做任务

  1. 轮询

    代理的多台服务器 将按照顺序 一个个的向源服务器发送请求

  2. 随机

    代理的多台服务器 将随机的向源服务器发送请求

  3. Hash

    代理的多台服务器 将根据消费者客户端的IP 算出Hash值 算出的Hash值和服务器地址取模运算 定位出要访问的服务器地址

  4. 最小链接次数

    代理的多台服务器 记录下每一个服务器目前为止的链接次数,下一个链接到来时 将优先使用目前链接次数最少的服务器

资源缓存

静态文件如CSS js Image 这些不变的文件,若是相同的请求地址过来后,静态资源服务器已经缓存 没必要再去原始服务器中获取资源,直接将本地已经缓存的数据发送至客户端,如没有在进行二次请求


以上构成本身的 mini_nginx


过往文章

  1. 小六聊聊-聊天工具的实现原理
  2. 小六聊聊-对战平台的实现原理
  3. 小六聊聊-nginx的实现原理

本身动手写聊天工具

mini_chat 代码地址

本身动手写Nginx

mini_nginx 代码地址

相关文章
相关标签/搜索