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 这个指令:

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

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

这里就大概三类:

  1. 就是地址加端口,这个是因为可能有很多网卡
  2. 第二种是 只监听端口,那么是全部的端口。
  3. 第三种就是本机处理的了,怎么说呢,是这样的,比如一个服务想某个sock中写,那么就可以直接监听这个sock的。

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

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

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

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

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

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

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

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

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

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

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

元字符:

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

重复:

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

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

server_name 指令

server_name 可以跟几种域名:

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

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

然后还有一个叫做server_name_in_redirect off;

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

如果是off的话:

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

如果是on的话:

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

这里就是区别了。

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

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

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

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

server 匹配顺序:

  1. 精确匹配
    2.

  2. 在前的泛域名
    3.

  3. 在后的泛域名

  4. 按文件中的顺序匹配正则表达域名
  5. default server 第一个或者listen 指定的default。

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

Original: https://www.cnblogs.com/aoximin/p/16217349.html
Author: 敖毛毛
Title: nginx重新整理——————http 模块中的请求过程[十一]

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/543793/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Spring Boot部署方法

    网上搜到的部署方法无非是打成jar包,然后shell执行nohup java调用jar命令,或者是打成war包然后部署到tomcat或者jetty容器上面。Spring Boot已…

    Java 2023年6月13日
    076
  • JSP九大内置对象详细介绍

    内置对象的特点: 1.由JSP规范提供,不用编写者实例化。 2.通过Web容器实现和管理 3.所有JSP页面均可使用 4.只有在脚本元素的表达式或代码段中才可使用( 九大内置对象:…

    Java 2023年5月29日
    068
  • 发送POST请求时发生 java-org.springframework.http.converter.HttpMessageNotReadableException

    本质上就是因为尝试用@RequestBody 接收一个变量,但是这样spring是不允许的,所以需要专门写一个类或者直接用实体类接收,这样就可以了. https://www.jb5…

    Java 2023年5月29日
    098
  • 常用开发工具的安装和使用

    常用开发工具的安装和使用 IntelliJ IDEA的安装和使用 安装教程 1.教育优惠 JetBrains开发的众多开发工具提供教育优惠,可以方便在校学生使用。通过学校提供的教育…

    Java 2023年6月8日
    086
  • markdown mermaid序列图

    序列图(时序图) 序列图是一种交互图,它显示了进程如何相互操作以及按什么顺序操作。 sequenceDiagram participant l as 大&am…

    Java 2023年6月5日
    068
  • 一文读懂SPI机制

    一文读懂SPI机制 1、问题 什么是SPI? 2、答案 要给出名词解释:SPI全称为:Service Provider Intreface,直驿为服务提供者接口,它是 JDK里面内…

    Java 2023年6月7日
    095
  • 31.使用计时器,分析服务端recv的性能

    服务端: 使用计时器,计时每秒钟调用了多少次recv,收到了多少数据包。recv每次接收1个字节。 客户端:使用计时器,计时每秒钟调用了多少次send函数。 调整客户端的线程数,客…

    Java 2023年5月30日
    067
  • 索引底层实现原理

    要了解数据库索引的底层原理,我们就得先了解一种叫树的数据结构,而树中很经典的一种数据结构就是二叉树!所以下面我们就从二叉树到平衡二叉树,再到B-树,最后到B+树来一步一步了解数据库…

    Java 2023年6月8日
    095
  • 20220812-Java内部类

    跟老韩学完了java面向对象的高级篇,老师提到了卖油翁和老黄牛的故事,在学习Java的路上,借以自勉,”我亦无他,唯手熟尔”,天道酬勤,长路漫漫,少年加油,…

    Java 2023年6月15日
    083
  • MySQL学习-idea连接数据库导入jar包

    导包先有包 !!!一定要下载和自己MySQL版本一样的jar包!!! !!!一定要下载和自己MySQL版本一样的jar包!!! !!!一定要下载和自己MySQL版本一样的jar包!…

    Java 2023年6月9日
    099
  • Linux 搭建Apollo

    简介 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用…

    Java 2023年6月5日
    090
  • Java学习-第一部分-第二阶段-第一节:面向对象编程(高级)

    面向对象编程(高级) 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 类变量和类方法(static) 类变量 类…

    Java 2023年6月16日
    075
  • Latex公式导出word,Latex转换MathML使用POI导出公式可编辑的Word文件

    背景 之前在 使用spire.doc导出支持编辑Latex公式的标准格式word 博客中写过,使用spire.doc来生成word,不得不说spire.doc的api操作起来还是比…

    Java 2023年6月7日
    0107
  • Elasticsearch7.X 安装(CentOS7)

    需要Java环境最低1.8起步 Elasticsearch时隔三年出来了8.0版本,最低需要JDK17 一、 获取Elasticsearch7.x安装包 获取链接 Elastics…

    Java 2023年6月15日
    0101
  • API ‘variant.getJavaCompiler()’ is obsolete and has been replaced with ‘variant.getJavaCompileProvider()’

    WARNING: API ‘variant.getJavaCompiler()’ is obsolete and has been replaced wit…

    Java 2023年5月29日
    071
  • 流式结构化数据计算语言的进化与新选择

    JAVA开发中经常会遇到不方便使用数据库,但又要进行结构化数据计算的场景。JAVA早期没有提供相关类库,即使排序、分组这种基本计算也要硬写代码,开发效率很低。后来JAVA8推出了S…

    Java 2023年6月15日
    078
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球