###Web 服务器概述 简单来说,Web 服务器就是可以接收 HTTP 请求,然后将响应返回给客户端的软件或设备。Web 服务器实现了 HTTP 协议、管理着 Web 资源,并负责提供 Web 服务器的管理功能(配置、控制、扩展等),由于 Web 服务器主要与 HTTP 通信打交道,所以有时候我们也将其称作 HTTP 服务器,对应的,客户端浏览器可以称作 HTTP 客户端。 Web 服务器与操作系统共同管理 TCP 连接(HTTP 通信基于 TCP 连接),再往下,底层操作系统负责管理计算机网络的硬件设备(比如网卡),以便提供 TCP/IP 网络支持,此外,操作系统还维护着装载 Web 资源的文件系统以及控制计算机活动的进程管理功能。 Web 服务器通常以软件形式呈现(也有集成 Web 服务器软件的硬件设备),当下比较常见的 Web 服务器有 Apache、IIS、Tomcat、Nginx、Lighttpd 等,一个功能完备的 Web 服务器至少需要支持 HTTP/1.1 的各种特性,还要支持丰富的资源类型(MIME)、虚拟主机、访问控制、日志记录、配置、监控和高性能(能支持同时与多个客户端建立连接)等功能。 用Swoole 来实现一个简单的 Web 服务器: ```php <?php // 表明服务器启动后监听本地 9051 端口 $server = new swoole_http_server('127.0.0.1', 9501); // 服务器启动时返回响应 $server->on("start", function ($server) { echo "Swoole http server is started at http://127.0.0.1:9501\n"; }); // 向服务器发送请求时返回响应 // 可以获取请求参数,也可以设置响应头和响应内容 $server->on("request", function ($request, $response) { $response->header("Content-Type", "text/plain"); $response->end("Hello World\n"); }); // 启动 HTTP 服务器 $server->start(); ``` 这段代码表示在服务器启动后将在本地的 9501 端口监听 HTTP 请求,我们可以在客户端与服务器建立连接后发起请求时返回对应的响应报文,响应报文需要遵循 HTTP 协议进行设置,这里返回的报文主体是一个字符串 Hello World,对应的资源类型是 text/plain。 ###Web 服务器基本工作流程 通过上面这个简单的示例,我们可以看到 Web 服务器的基本工作流程如下: - 建立连接:由于 HTTP 通信是基于 TCP 协议的,所以需要先建立连接才能开始通信,这也是为什么我们在实现 Web 服务器的时候要指定 IP 和端口的原因,客户端可以根据这个 IP 地址和端口号与服务器建立连接(TCP 的三次握手); - 接收请求:一旦服务器与客户端建立连接后,服务器就可以接收从客户端发过来的请求报文,第一次请求时先建立连接,对于 HTTP/1.1 来说,默认支持持续连接,所以后续请求都可以在这个连接上进行,不需要额外建立连接; - 处理请求:服务器收到请求报文并解析完成后(主要是请求首部),会对请求进行处理,比如 POST 请求需要包含请求实体,判断是否有访问权限,指定路径是否存在,返回缓存还是原始资源,如果是静态资源的话(比如 HTML、图片、CSS 文件等)直接从文件系统获取并返回即可,如果是动态资源的话,还需要通过 CGI 网关请求后端应用程序接口(PHP、Java、Python 等编写的应用程序),如果配置了负载均衡,还要将请求进行转发; - 访问资源:服务器根据请求处理结果去指定位置获取资源,如果资源存储在缓存中从缓存获取,存储在文件系统中从文件系统获取,存储在 CDN 中从 CDN 处获取,存储在数据库中则从数据库获取等; - 构建响应:请求处理完成并获取到对应的资源后,服务器开始构建响应报文,响应首部和响应实体的设置需要遵循 HTTP 协议规范; - 返回响应:响应报文构建完成后,会沿着请求来路将其返回给客户端,如果当前 HTTP 连接是持久连接的话,需要保持连接打开状态,否则会关闭连接,此时,需要注意的是对持久连接而言,响应头中必须包含 Content-Length 首部字段,否则客户端不知道什么时候响应实体结束; - 记录日志:当一个 HTTP 事务(请求响应)结束后,Web 服务器通常会在日志中记录该事务。 以上就是 Web 服务器的基本工作流程