学习笔记,非纯原创
深入源码理解服务器端工作原理,请移步「Web Server 201 - 剖析 tiny-httpd」一文。
配合「Web Server 101: HTTP 报文解析」一文阅读更佳。
1. 什么是 Web 服务器
Web 服务器一般有两层意思[1]:
硬件:指一台存储了网络服务器软件以及网站文件(比如 HTML、图片、CSS 和 JavaScript)的计算机,可以有多个网站。
软件:控制用户从服务器硬件上获取文件的软件。当浏览器(客户端)连到服务器上并请求文件时,Web 服务器软件将处理该请求并将所请求的文件发回到该浏览器上。Web 服务器使用 HTTP(超文本传输协议)与客户机浏览器进行信息交流,故人们常把它们称为 HTTP 服务器。Web 服务器不仅能够存储信息,还能在用户通过Web浏览器提供的信息的基础上运行脚本和程序。 一些常见的 http 服务器有 Apache, IIS, NGINX,Node.js 等。
2. 工作原理
Web服务器的工作原理一般分成如下4个步骤:连接过程、请求过程、应答过程以及关闭连接。简而言之:当浏览器需要一个托管在网络服务器上的文件时,浏览器发送 HTTP request 索要这个文件。当这个请求到达正确的网络服务器(硬件),HTTP 服务器(软件)收到这个请求,找到这个被请求的文档(如果这个文档不存在,那么将返回一个 404 响应),并把这个文档通过 HTTP response 返回给浏览器。
2.1. 客户端发送请求
客户端(通过浏览器)和 Web 服务器建立 TCP 连接,连接建立后,向 Web 服务器发出访问请求(如 GET)。根据 HTTP 协议,该请求中包含了浏览器的类型、请求的 URL 等一系列信息。
如下示例中展示了客户端通过 GET
请求向服务器索要 /sample.html
文件中发送的 http request 部分内容。
更多关于 HTTP 报文格式的知识, 详见此文「Web Server 101: HTTP 报文解析」。
GET /sample.html HTTP/1.1
Host: localhost:4000
Connection: keep-alive
sec-ch-ua: "Google Chrome";v="87", " Not;A Brand";v="99", "Chromium";v="87"
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36
...
2.2. 服务器解析请求
Web 服务器对请求按照 HTTP 协议进行解析来确定进一步的动作,涉及的内容有:方法(GET)、URL(/sample.html)和浏览器使用的协议(HTTP/1.1)。完成解析后,Web 服务器根据需要去读取请求的其它部分。
2.3. 完成请求的动作
若无错误出现,Web 服务器将执行请求所要求的动作 —— 获取(GET)一个名为 sample.html 的文档。Web 服务器受限在其文档树中搜索请求的文件(/sample.html),这是由服务器机器上作为操作系统一部分的文件系统完成的。若文件能找到并可正常读取,则服务器将把它返回给客户。
2.3.1. 成功实例
假设文件已经找到,Web服务器发送一个状态码及一些描述信息:状态码 200
表示一切都OK,随后发出用户请求的文档。因为发送的信息是 HTML 文档,所以 Content-type
取值为 text/html
,文档长为 56768 个字节,所以 Content-type
取 56768 。服务器软件的标识及文件的时间属性信息也被包含在 http header 中。
HTTP/1.1 200 OK
X-Powered-By: Hexo
Content-Type: text/html
Date: Mon, 25 Jan 2021 01:41:29 GMT
Connection: keep-alive
Content-Length: 56768
2.3.2. 失败实例
如果请求的文件没有找到或找到但无法读取,则请求无法满足。这时将返回不同于 200
的状态码。最常见的问题是请求中的文件名拼写有误,所以服务器无法找到该文件。这种情况下,服务器将发送 404
状态码给客户。
更多关于 HTTP 状态码的知识,详见此文「Web Server 101: HTTP 报文解析」。
HTTP/1.1 404 Not Found
X-Powered-By: Hexo
Content-Security-Policy: default-src 'none'
X-Content-Type-Options: nosniff
Content-Type: text/html; charset=utf-8
Date: Mon, 25 Jan 2021 01:35:37 GMT
Connection: keep-alive
Content-Length: 356
...
2.4. 服务器结束会话
当文件或错误已发出后,Web 服务器会结束整个会话:关闭打开的的被请求文件,关闭网络端口来结束网络连接。
2.5. 客户端收到数据
客户端接收数据,并以用户可读的方式呈现出来。