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

相关推荐
llm大模型算法工程师weng2 小时前
负载均衡做什么?nginx是什么
运维·开发语言·nginx·负载均衡
fTiN CAPA3 小时前
服务器无故nginx异常关闭之kauditd0 kswapd0挖矿病毒 CPU占用200% 内存耗尽
运维·服务器·nginx
lKWO OMET5 小时前
查看 nginx 是否已经启动
运维·数据库·nginx
SilentSamsara7 小时前
TLS/HTTPS 实战:证书链、握手与生产配置
网络·数据库·网络协议·http·https
ywlovecjy7 小时前
【Nginx 】Nginx 部署前端 vue 项目
前端·vue.js·nginx
hutengyi9 小时前
四、nginx的优化和location匹配规则
运维·nginx
eEKI DAND9 小时前
一个比 Nginx 还简单的 Web 服务器
服务器·前端·nginx
学代码的真由酱18 小时前
HTTPS
网络协议·http·https
W.A委员会21 小时前
常见网络攻击
网络·http·网络安全
Watermelo6171 天前
理解 JavaScript 中的“ / ”:路径、资源与目录、nginx配置、请求、转义的那些事
前端·javascript·vue.js·chrome·nginx·正则表达式·seo