Nginx 详解HTTP模块

Nginx 详解HTTP模块

  • 指令的合并
    • 值指令:存储配置项的值
    • 动作类指令:指令行为
    • 存储值的指令继承规则:向上覆盖
    • HTTP模块合并配置的实现
  • Listen指令
  • 处理HTTP请求头部的流程
    • 接收请求事件模块
    • 接收请求HTTP模块
  • 正则表达式
  • 如何拿到真实的用户IP地址?
  • 拿到真实用户IP后如何使用?

指令的合并

指令在多个块同时存在时可以合并,但不是所有的指令都可以合并。

值指令:存储配置项的值

  • 可以合并
  • 示例
    • root
    • access_log
    • gzip

动作类指令:指令行为

  • 不可以合并
  • 示例
    • rewrite
    • proxy_pass
  • 生效阶段
    • server_rewrite 阶段
    • rewrite 阶段
    • content 阶段

存储值的指令继承规则:向上覆盖

  • 子配置不存在时,直接使用父配置块
  • 子配置存在时,直接覆盖父配置块

HTTP模块合并配置的实现

  • 指令在哪个块下生效?
  • 指令允许出现在哪些块下?
  • 在server块内生效,从http向server合并指令:
  • 配置缓存在内存

Listen指令

示例:
listen unix:/var/run/nginx.sock;
listen 127.0.0.1:8000;
listen 127.0.0.1;
listen 8000;
listen *:8000;
listen localhost:8000 bind;
listen [::]:8000 ipv6only=on;
listen [::1];

处理HTTP请求头部的流程

接收请求事件模块

  • 操作系统内核
  • 事件模块
  • HTTP模块

接收请求HTTP模块

  • 接收URI
    • 分配请求内存池 request_pool_size:4k
    • 状态机解析请求行
    • 分配大内存 large_client_header_buffers:4 8k
    • 状态机解析请求行
    • 标识URI
  • 接收header
    • 状态机解析header
    • 分配大内存 large_client_header_buffers:4 8k
    • 标识header
    • 移除超时定时器 client_header_timeout: 60s
    • 开始11个阶段的http请求处理

正则表达式

  • 元字符
代码 说明
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
  • 重复
代码 说明
* 重复零次或更多次
+ 重复一次或更多次
重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

如何拿到真实的用户IP地址?

  • TCP连接四元组(src ip ,src port,dst ip ,dst port)
  • HTTP头部X-Forwarded-For用于传递IP
  • HTTP头部X-Real-IP用于传递用户IP
  • 网络中存在许多反向代理

拿到真实用户IP后如何使用?

  • 基于变量来使用
  • 如binary_remote_addr remote_addr这样的变量,其值就为真实的IP!这样做连接限制(limit_conn模块)才有意义。

你可能感兴趣的:(Nginx)