问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

HoRain云--Nginx处理一HTTP请求的全过程演示

创作时间:
作者:
@小白创作中心

HoRain云--Nginx处理一HTTP请求的全过程演示

引用
CSDN
1.
https://m.blog.csdn.net/sinat_57153473/article/details/145722131

Nginx架构概览

  • Master进程:读取配置、绑定端口、管理Worker进程。
  • Worker进程:实际处理请求(每个Worker独立处理连接,采用非阻塞事件驱动模型)。

请求处理全流程

步骤 1:接收TCP连接

  • 客户端发起HTTP请求,Nginx Worker进程通过listen指令监听的端口(如80)接收连接。
  • 若启用keepalive,连接会复用以减少握手开销。

步骤 2:解析HTTP请求头

  • 解析请求行(如GET /index.html HTTP/1.1)。
  • 解析Headers(如HostUser-AgentCookie)。

步骤 3:匹配Server块

  • 根据Host头匹配server块。若未匹配,使用默认的server(第一个或标记default_server)。

步骤 4:匹配Location块

  • URI与location规则匹配(优先级:精确匹配=> 前缀匹配^~> 正则~> 普通前缀)。

步骤 5:执行Rewrite重写

  • 若配置了rewrite规则,URI会被修改(如伪静态化),可能触发重新匹配location

步骤 6:访问控制

  • 执行allow/denyauth_basic认证、limit_conn限速等模块的检查。

步骤 7:生成响应内容

  • 静态文件:直接读取文件(如rootalias指定路径)。
  • 反向代理:通过proxy_pass转发请求到后端服务器(如Tomcat、Node.js)。
  • 动态处理:通过FastCGI(如PHP-FPM)处理。

步骤 8:发送响应

  • 将HTTP响应头与Body发送给客户端。
  • 若启用gzip,会压缩响应内容。

步骤 9:记录日志

  • 写入access_log(请求日志)和error_log(错误日志)。

配置示例与流程注释

# 全局配置
user  nginx;
worker_processes  auto;
error_log  /var/log/nginx/error.log warn;
events {
    worker_connections  1024;
}
http {
    # 默认文件类型与日志格式
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    access_log  /var/log/nginx/access.log combined;
    # 定义上游服务器(负载均衡)
    upstream backend {
        server 10.0.0.1:8080;
        server 10.0.0.2:8080;
    }
    # 虚拟主机配置
    server {
        listen 80 default_server;
        server_name example.com;
        # 静态文件服务
        location /static/ {
            alias /data/static/;
            expires 7d;  # 缓存控制
        }
        # 反向代理到后端应用
        location /api/ {
            proxy_pass http://backend;
            proxy_set_header Host $host;
        }
        # 重写规则示例
        location /blog {
            rewrite ^/blog/(.*) /posts/$1 permanent;
        }
        # 403禁止访问
        location /admin {
            deny all;
            return 403;
        }
    }
}

关键流程详解

  1. 连接建立
  • 客户端访问http://example.com/static/image.jpg,Worker进程通过listen 80接收连接。
  1. Host匹配
  • Host: example.com匹配到对应的server块。
  1. Location匹配
  • URI/static/image.jpg匹配location /static/,使用alias映射到文件路径/data/static/image.jpg
  1. 访问静态文件
  • Nginx读取文件并设置Cache-Control头部(expires 7d)。
  1. 返回响应
  • 发送HTTP 200响应,内容类型由mime.types决定(如image/jpeg)。

反向代理示例流程

  1. 请求到达
  • 客户端访问http://example.com/api/user
  1. Location匹配
  • URI匹配location /api/,触发proxy_passupstream backend
  1. 负载均衡
  • 请求被转发到10.0.0.1:808010.0.0.2:8080(轮询策略)。
  1. 后端处理
  • 应用服务器返回JSON数据,Nginx将其返回客户端。

流程图解

客户端请求
  │
  ▼
Nginx Worker接收连接
  │
  ▼
解析HTTP头 → 匹配Server块 → 匹配Location块
  │                                  │
  ▼                                  ▼
静态文件读取 或 反向代理转发 → 生成响应 → 记录日志

高级特性

  • SSL/TLS:通过listen 443 ssl启用HTTPS。
  • 缓存proxy_cache缓存后端响应。
  • 限流limit_req限制请求速率。
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号