nginx与http的前世今生详解

一 nginx与http结合

1. 请求行 (Request Line)

请求行是 HTTP 请求的第一行,它告诉 Nginx 客户端想要做什么、对哪个资源进行操作以及使用哪个版本的 HTTP 协议。

  • 方法 (Method):常见的有 GET(获取资源)、POST(发送数据)、PUT(更新资源)等。

  • 请求 URI (Request-URI) :标识要访问的资源,比如 /index.html/api/user

  • HTTP 版本 (HTTP Version) :通常是 HTTP/1.1HTTP/2

    GET /index.html HTTP/1.1

Nginx 处理

  • Nginx 会根据请求的方法和 URI 来决定如何处理这个请求。
  • 如果是 GET 请求,Nginx 可能会直接从文件系统中读取相应的文件并返回给客户端。
  • 如果是 POST 请求,Nginx 可能会将请求转发到后端的应用服务器,比如通过反向代理到一个 PHP 或者 Node.js 应用。

2. 请求头 (Request Headers)

请求头提供了关于请求的附加信息,如客户端类型、接受的内容类型等。这些信息帮助 Nginx 更好地理解客户端的需求,并做出适当的响应。

常见的请求头字段

  • Host: 指定请求的目标主机名和端口号,这对于虚拟主机配置非常重要。
  • User-Agent: 提供发起请求的应用程序的信息,比如浏览器类型和版本。
  • Accept: 告诉服务器客户端能够处理的内容类型。
  • Content-Type : 在 POST 请求中,指明发送的数据类型,如 application/x-www-form-urlencodedapplication/json
  • Content-Length: 指明请求体的长度(字节数),对于 POST 请求很重要。
  • Cookie: 携带之前服务器设置的 cookie 信息,用于会话管理和身份验证。
  • Authorization: 用于认证,例如 Basic 或 Bearer 认证。

示例

Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1

Nginx 处理

  • Nginx 可以根据 Host 头来路由请求到不同的虚拟主机。
  • User-AgentAccept 等头可以帮助 Nginx 决定返回哪种格式的内容。
  • Content-TypeContent-Length 对于处理 POST 请求中的数据至关重要。
  • CookieAuthorization 用于会话管理和用户认证。

3. 请求体 (Request Body)

请求体包含了实际的数据内容,这些数据通常在 POST 和 PUT 请求中发送。请求体可以包含表单数据、JSON 数据、文件上传等。

示例 (对于 POST 请求):

Content-Type: application/x-www-form-urlencoded

name=John&age=30

或者对于 JSON 数据:

Content-Type: application/json

{
    "name": "John",
    "age": 30
}

Nginx 处理

  • 对于静态文件请求(如 GET 请求),Nginx 直接读取文件并返回给客户端。
  • 对于动态内容请求(如 POST 请求),Nginx 通常会将请求体中的数据转发到后端应用服务器(如 PHP-FPM、Node.js 应用等)。
  • Nginx 可以配置为缓存某些请求的结果,减少后端服务器的压力。

结合 Nginx 的配置示例

假设你有一个简单的 Nginx 配置文件,如下:

server {
    listen 80;
    server_name example.com;

    location / {
        root /var/www/html;
        index index.html index.htm;
    }

    location /api/ {
        proxy_pass http://backend_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
  • 当客户端发送一个 GET 请求到 http://example.com/index.html 时,Nginx 会查找 /var/www/html/index.html 文件并返回给客户端。
  • 当客户端发送一个 POST 请求到 http://example.com/api/data 时,Nginx 会将请求转发到 http://backend_server/api/data,并将客户端的真实 IP 地址和其他必要的头信息传递给后端服务器。

二 nginx处理http请求的11个阶段详解

1. POST READ 阶段

  • 功能:在这个阶段,Nginx 已经读取了完整的客户端请求头,但还没有开始处理请求体。
  • 用途:可以用来进行一些预处理,例如检查请求是否合法、限制请求大小等。
  • 示例ngx_http_limit_req_module 模块用于限制请求速率。

2. SERVER REWRITE 阶段

  • 功能:在这个阶段,Nginx 可以修改请求 URI 和参数。
  • 用途:通常用于 URL 重写,将一个 URL 转换为另一个 URL。
  • 示例ngx_http_rewrite_module 模块用于 URL 重写。

3. LOCATION 阶段

  • 功能 :根据请求 URI 确定哪个 location 块应该处理这个请求。
  • 用途 :匹配 location 块,并确定后续处理流程。
  • 示例ngx_http_core_module 中的 location 指令。

4. LOCATION REWRITE 阶段

  • 功能 :与 SERVER REWRITE 类似,但作用于选定的 location 块。
  • 用途 :在特定 location 内部进行 URL 重写。
  • 示例ngx_http_rewrite_module 模块用于 location 内部的 URL 重写。

5. ACCESS 阶段

  • 功能:在这个阶段,Nginx 检查客户端是否有权限访问请求的资源。
  • 用途:进行访问控制,如 IP 白名单/黑名单、用户认证等。
  • 示例ngx_http_access_module 模块用于基于 IP 地址的访问控制。

6. POST ACCESS 阶段

  • 功能:在访问控制之后,但在内容生成之前执行。
  • 用途:可以用于日志记录或进一步的请求处理。
  • 示例ngx_http_realip_module 模块用于设置客户端的真实 IP 地址。

7. TRY FILES 阶段

  • 功能:尝试多个文件路径,找到第一个存在的文件并返回。
  • 用途:通常用于静态文件服务,确保文件存在。
  • 示例ngx_http_core_module 中的 try_files 指令。

8. CONTENT 阶段

  • 功能:生成响应内容。
  • 用途:处理实际的内容生成,如从文件系统读取文件、调用后端应用等。
  • 示例ngx_http_static_module 模块用于提供静态文件服务,ngx_http_proxy_module 模块用于反向代理。

9. LOG 阶段

  • 功能:记录日志信息。
  • 用途:记录请求和响应的相关信息,用于监控和调试。
  • 示例ngx_http_log_module 模块用于日志记录。

10. HEADER FILTER 阶段

  • 功能:修改响应头。
  • 用途:在响应头发送给客户端之前对其进行修改。
  • 示例ngx_http_headers_module 模块用于添加或删除响应头。

11. BODY FILTER 阶段

  • 功能:修改响应体。
  • 用途:在响应体发送给客户端之前对其进行修改,如压缩、加密等。
  • 示例ngx_http_gzip_module 模块用于响应体的 GZIP 压缩。

示例配置

假设你有一个简单的 Nginx 配置文件,如下所示:

server {
    listen 80;
    server_name example.com;

    # POST READ 阶段
    limit_req zone=one burst=5 nodelay;

    # SERVER REWRITE 阶段
    rewrite ^/oldpage /newpage permanent;

    location / {
        # LOCATION 阶段
        root /var/www/html;
        index index.html index.htm;

        # LOCATION REWRITE 阶段
        if ($request_uri ~* "^/oldpath") {
            rewrite ^/oldpath/(.*)$ /newpath/$1 break;
        }

        # ACCESS 阶段
        allow 192.168.1.0/24;
        deny all;

        # TRY FILES 阶段
        try_files $uri $uri/ =404;

        # CONTENT 阶段
        autoindex on;
    }

    # LOG 阶段
    access_log /var/log/nginx/access.log main;

    # HEADER FILTER 阶段
    add_header X-Frame-Options SAMEORIGIN;

    # BODY FILTER 阶段
    gzip on;
}

解释

  • POST READ 阶段 :使用 limit_req 模块限制请求速率。
  • SERVER REWRITE 阶段 :使用 rewrite 指令将 /oldpage 重定向到 /newpage
  • LOCATION 阶段 :定义了根目录 /var/www/html 并设置了默认索引文件。
  • LOCATION REWRITE 阶段 :如果请求 URI 匹配 /oldpath,则将其重写为 /newpath
  • ACCESS 阶段 :只允许来自 192.168.1.0/24 网络的请求。
  • TRY FILES 阶段:尝试查找请求的文件,如果不存在则返回 404 错误。
  • CONTENT 阶段:启用目录列表功能。
  • LOG 阶段:记录访问日志。
  • HEADER FILTER 阶段 :添加 X-Frame-Options 头以防止点击劫持。
  • BODY FILTER 阶段:启用 GZIP 压缩。

通过这些阶段,Nginx 可以高效地处理各种 HTTP 请求,并提供了灵活的配置选项来满足不同的需求。理解这些阶段有助于更好地配置 Nginx 以优化性能和安全性。

相关推荐
XuanRanDev19 分钟前
【每日一题】LeetCode - 三数之和
数据结构·算法·leetcode·1024程序员节
follycat2 小时前
[极客大挑战 2019]HTTP 1
网络·网络协议·http·网络安全
earthzhang20213 小时前
《深入浅出HTTPS》读书笔记(5):随机数
网络协议·http·https
xiaoxiongip6663 小时前
HTTP 和 HTTPS
网络·爬虫·网络协议·tcp/ip·http·https·ip
CXDNW3 小时前
【网络面试篇】HTTP(2)(笔记)——http、https、http1.1、http2.0
网络·笔记·http·面试·https·http2.0
ajsbxi3 小时前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
城南vision5 小时前
计算机网络——HTTP篇
网络协议·计算机网络·http
鹏大师运维6 小时前
【功能介绍】信创终端系统上各WPS版本的授权差异
linux·wps·授权·麒麟·国产操作系统·1024程序员节·统信uos
‍。。。6 小时前
使用Rust实现http/https正向代理
http·https·rust
亦枫Leonlew7 小时前
微积分复习笔记 Calculus Volume 1 - 4.7 Applied Optimization Problems
笔记·数学·微积分·1024程序员节