• nginx重新整理——————http 模块中的请求过程[十一]


    前言

    简单介绍一下http的一些指令。

    正文

    一般http的嵌套规则是这样的:

    http{
      upstream{}
      split_clients {}
      map{}
      gep{}
      server{
        if(){}
        localtion{
            limit_except{....}
        }
        location{
          location{
          }
        }
      }
      server{}
    }
    

    那么指令的合并规则就是: 子配置不存在时候,直接使用父配置块。子配置存在时,直接覆盖父配置块。

    但是有一个大前提,这个前提是:

    值指令:存储配置项的值可以合并,比如root、access_log、gzip。

    动作类指令:指定行为,不可以合并,例如: rewrite、proxy_pass 因为他们的生效阶段, server_rewrite、rewrite、content 阶段。

    指令的生效范围块也不一样,这个需要看文档,比如log_format 在 http 块中生效,access_log 可以在http、server、location、 if in location、limit_expcet 中生效。

    那么我们来看下listen 这个指令:

    这里就大概三类:

    1. 就是地址加端口,这个是因为可能有很多网卡

    2. 第二种是 只监听端口,那么是全部的端口。

    3. 第三种就是本机处理的了,怎么说呢,是这样的,比如一个服务想某个sock中写,那么就可以直接监听这个sock的。

    前面提及过nginx 并非只为http服务的,核心是事件模块,而http 是其中依赖事件模块的。

    这里说一下启动过程,操作系统内核经过三次握手后,通过accept 分配了连接内存池拿到了句柄,然后这个http模块的ngx_http_init_connection 就会收到这个socket,通过监听的方式。

    然后http 设置一个client_header_timeout,表示一个接受头部的时间为60s,如果60秒还没接受完头部那么就是超时的。

    当收到数据的时候,先分配1k内存(client_header_buffer_size)。这里说1k,但是如果header 超过了1k,怎么办呢? 看下完整的流程。

    是这样的。 收到数据的时候肯定要分配1k用户接收头部。 然后还要有这个有一个request_pool_size 这个要4k,这4k就是存解析出来的东西。

    然后如果我们前面分配接收header 为1k,那么如果uri太大了,不止1k,那么怎么办呢? 这个也是就得扩容了,比如说变成8k,然后8k不够就变成16,最多是32k。 也就是说我们的header 最大为32k。

    然后如果uri 接收完了,那么就标志uri。然后继续解析header,如果不够还是按照前面的扩容,当header 接收完毕的时候,那么就标识header,然后移除前面设置的超时定时器。

    后面就开始了11阶段的http 请求。

    先介绍一下nginx的正则表达式:

    元字符:

    重复:

    server_name 指令

    server_name 可以跟几种域名:

    server_name www.axm.com
    server_name *.axm.com
    server_name ~^www\d+.axm..com$

    分别是具体的域名,泛域名,正则表达(前面要加~)

    然后还有一个叫做server_name_in_redirect off;

    如果是off的话:

    如果是on的话:

    这里就是区别了。

    正则表达式中创建变量用():

    server{
    server_name ~^(www.)?(.+)$;
    location / {root /sites/$2}
    }

    或者:
    server{
    server_name ~^(www.)?(?.+)$;
    location / {root /sites/$domain}
    }

    两种都行,可以去看下我的正则表达系列,里面挺多用法的。

    server 匹配顺序:

    1. 精确匹配
      • 在前的泛域名
      • 在后的泛域名
    2. 按文件中的顺序匹配正则表达域名
    3. default server 第一个或者listen 指定的default。

    下面介绍nginx的请求11个阶段。

  • 相关阅读:
    【转】HBase中的时间维度
    【转】HBase基本原理
    【转】BloomFilter——大规模数据处理利器
    【转】HBase客户端API:管理特性
    es6 模本字符串拼接方法 ``
    Electron桌面应用打包流程
    vue-electron脚手架安装及说明 打包基于Vue的 桌面应用程序
    safari打开的页面数字识别变为蓝色
    使用jquery中$.each()方法来循环一个数据列表
    jquery实现点击控制div的显示和隐藏
  • 原文地址:https://www.cnblogs.com/aoximin/p/16217349.html
Copyright © 2020-2023  润新知