您的位置:首页 > 理论基础 > 计算机网络

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

2022-05-02 23:27 453 查看 https://www.cnblogs.com/aoximi

前言

简单介绍一下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个阶段。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: