Nginx 处理一个 HTTP 请求的过程可以分为几个主要步骤:接受请求、解析请求、处理请求、生成响应、发送响应。这些步骤通过不同的模块协作来完成。以下是一个典型的 HTTP 请求处理流程:
1. 接受请求
Nginx 在配置文件中定义的端口上监听传入的 HTTP 请求。当客户端(如浏览器)发送一个请求时,Nginx 接收该请求。
2. 解析请求
Nginx 解析 HTTP 请求的头部信息,包括请求方法(GET、POST 等)、请求 URI、HTTP 版本、头字段等。这个过程是通过 Nginx 核心模块进行的。
3. 处理请求
根据配置文件中的指令,Nginx 将请求分配给不同的处理模块。以下是一些关键的处理步骤:
匹配 Server 块
Nginx 首先根据请求的 Host 头字段和端口号,匹配对应的 server 块。配置文件中的每个 server 块都定义了一组处理特定主机名或 IP 地址的指令。
假设您在浏览器中访问 http://www.example.com:8080/path,那么生成的 HTTP 请求头部分会包含:
GET /path HTTP/1.1
Host: www.example.com:8080
匹配 Location 块
在匹配到 server 块后,Nginx 会进一步根据请求的 URI 匹配合适的 location 块。location 块定义了如何处理特定路径的请求。
location / { … } 定义了请求路径的处理规则。Nginx 处理 HTTP 请求时,首先根据 Host 头字段和端口号匹配配置文件中的 server 块,然后在匹配到的 server 块中根据请求的 URI 匹配最合适的 location 块。匹配到的 location 块中的指令决定了如何处理该请求。
http {
server {
listen 80;
server_name www.example.com;
location / {
root /var/www/example;
index index.html;
}
}
server {
listen 80;
server_name www.another.com;
location / {
root /var/www/another;
index index.html;
}
}
}
执行指令
在匹配到合适的 location 块后,Nginx 按顺序执行该块中的指令。这些指令可以包括:
- 静态文件服务:读取并返回文件系统中的文件。
- 反向代理:将请求转发到后端服务器。
- 访问控制:基于 IP 地址或认证信息控制访问。
- 重写规则:修改请求 URI 并重新处理。
- 缓存控制:检查缓存中是否有响应,如果有则直接返回缓存内容。
4. 生成响应
根据处理请求的结果,Nginx 生成一个 HTTP 响应。这包括设置响应状态码、响应头部信息和响应体内容。
5. 发送响应
Nginx 将生成的响应发送回客户端。此过程包括:
- 发送响应状态行(如 HTTP/1.1 200 OK)。
- 发送响应头部(如 Content-Type、Content-Length 等)。
- 发送响应体(如 HTML 文件内容)。