当前位置: 首页 > article >正文

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.1 或 HTTP/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-urlencoded 或 application/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-Agent 和 Accept 等头可以帮助 Nginx 决定返回哪种格式的内容。
  • Content-Type 和 Content-Length 对于处理 POST 请求中的数据至关重要。
  • Cookie 和 Authorization 用于会话管理和用户认证。

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 以优化性能和安全性。

 


http://www.kler.cn/news/364249.html

相关文章:

  • traceroute或tracepath区别
  • 要做消息列表的颜色切换
  • 深入了解Vue Router:基本用法、重定向、动态路由与路由守卫的性能优化
  • C#的访问修饰符
  • 初识知识图谱
  • Leetcode 3325. Count Substrings With K-Frequency Characters I
  • 10. mapreduce实现wordcount
  • CSS实现旗帜效果
  • Ubuntu下Mysql修改默认存储路径
  • C语言题目练习5——有效的括号
  • 卫生巾干燥导渗技术的研究与应用(美国全意卫生巾提出研究并发布)
  • 从本地到云端:跨用户请求问题的完美解决方案
  • Brave编译指南2024 Android篇-更新与维护(八)
  • C#中几种多线程调用方式
  • 想进体制内?到底有哪些路可走?原来有这么多方法
  • 基于SSM健身国际俱乐部系统的设计
  • Ubuntu 通过Supervisor 或者 systemd 管理 .Net应用
  • package,json 文件中依赖包的说明
  • 鸿蒙OpenHarmony(API10,API12)多渠道打包
  • Spring Boot:植物健康监测的智能时代
  • 集合论(ZFC)之代数结构(Algebraic Structure)
  • 采样率从44100 Hz转化为采样率是 16000 Hz的音频的方法
  • 10.24Python_pandas_习题整合
  • 每天一道C语言精选编程题之求数字的每⼀位之和
  • XML HTTP Request
  • 面试题:描述在前端开发中,如何利用数据结构来优化页面渲染性能,并给出一个具体的示例。