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 这个指令:
这里就大概三类:
就是地址加端口,这个是因为可能有很多网卡
第二种是 只监听端口,那么是全部的端口。
第三种就是本机处理的了,怎么说呢,是这样的,比如一个服务想某个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 匹配顺序:
- 精确匹配
-
-
在前的泛域名
-
-
在后的泛域名
- 按文件中的顺序匹配正则表达域名
- default server 第一个或者listen 指定的default。
结
下面介绍nginx的请求11个阶段。
- Nginx(语法):09---HTTP模块之(URI请求与重定向:location模块)
- Nginx源码分析 - HTTP模块篇 - ngx_http_wait_request_handler函数和HTTP Request解析过程
- nginx源码分析(2)——http模块的初始化过程
- nginx js/css合并请求(nginx-http-concat-master)模块
- Nginx 模块之 ngx_http_limit_req_module 请求处理模块用法
- nginx请求频率限制模块ngx_http_limit_req_module
- HTTP扫盲及nginx基础性模块常用指令整理
- nginx源码分析(2)——http模块的初始化过程
- Nginx模块 ngx_http_limit_req_module 限制请求速率
- nginx 投入生产之中,突然想重新编译 http_stub_status_module 模块
- Nginx源码分析 - HTTP模块篇 - ngx_http_optimize_servers函数和TCP连接建立过程
- HTTP错误404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求
- nginx 开发一个简单的 HTTP 模块
- HTTP 错误 404.8 - Not Found,请求筛选模块被配置为拒绝包含 hiddenSegment 节的 URL 中的路径
- Nginx模块 ngx_http_limit_conn_module 限制连接数
- Nginx重新编译添加模块
- nginx学习(五) http模块
- nginx重新编译添加ssl模块
- Nginx(语法):07---HTTP模块之(http模块概述、http模块核心指令)
- Network 【HTTP通信过程/请求】