对于客户端浏览器发起 HTTP 请求想必你已经比较熟悉,那么请求到达服务器之后是怎么被处理的呢,服务器如果根据请求报文根据指定 URL 返回对应的资源呢,针对静态资源和动态资源又是如何区别处理的呢,服务器在应对大量涌入的请求为了提高性能又做了哪些事情来优化呢,接下来的 Web 服务器篇将就这些内容展开讨论。
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)、虚拟主机、访问控制、日志记录、配置、监控和高性能(能支持同时与多个客户端建立连接)等功能。
简单的 Web 服务器示例
要实现基本的 HTTP 协议特性相对简单,但要实现高性能、高并发支持并不容易,后续 Nginx 系列教程我们将深入探讨 Nginx 底层在这一块是如何做的,PHP 从 5.4 版本开始,就内置了一个基本的 Web 服务器,可以通过 php -S localhost:8000 命令启动,在 Laravel 项目中可以通过 php artisan serve 来启动它:
与常见 Web 服务器不同,PHP 内置服务器在 8000 端口监听 HTTP 请求,但这只是个最基本最简单的 Web 服务器,能处理基本的 HTTP 请求,并且一次只能处理一个连接,也不支持更高级的 Web 服务器功能,比如虚拟主机等,所以仅适用于本地测试。
此外,我们也可以基于 Swoole 来实现一个简单的 Web 服务器:
<?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 服务器的基本工作流程如下:
以上就是 Web 服务器的基本工作流程,下篇教程我们将以 Nginx + PHP 应用(Laravel项目)为例,详细介绍上述流程的实现细节。