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个阶段。