极客专栏《Nginx核心知识100讲》73小节,笔记
注意:这个是看专栏视频,敲的哈。这个专栏让我收货蛮大的。
73 | HTTP框架提供的请求相关的变量
除了很多http模块会提供变量以外,nginx的http框架也会提供大量有用的变量。框架提供的变量。不需要我们编译引入新的http模块。而且框架提供了变量往往反应了用户发来的请求被nginx处理的每一个流程和很多细节。所以熟悉了解nginx框架提供的每一个变量的用法是非常有必要的。
与用户请求相关的变量
![](https://img.haomeiwen.com/i550939/6ca577630fcb4bd5.png)
演示配置文件中,故意加了两个server_name
,访问会用localhost,这里加了主域名(var.taohui.tech)。因为有一些变量的值在通过return来返回它的时候呢,这个值可能还没有发生变化,没有达到预期的效果。比如发送了多少字节。这个时候取不到完整的字节数。所以加了一个access_log(vartest.log),写到这个文件中。演示有些变量在不同的阶段中,比如return是在rewrite阶段,在这个阶段,这个变量的值为0,实际写入日志,也就是log阶段中值就发生变化了。
这里还有一些要给大家说的。比如把limit_rate 变量的值修改成10k。在演示显示这个值的时候就能看到它相应的变化。
通过return指令返回把相关的变量以一行的方式显示。
![](https://img.haomeiwen.com/i550939/8907abfb90985cc4.png)
server_name 返回的是 var.taohui.tech
body_bytes_sent、bytes_sent 为0,因为这个阶段中没有办法计算出变量实际的值。
![](https://img.haomeiwen.com/i550939/16a992691cb37c2f.png)
log阶段可以看到真正的值。
HTTP框架提供的变量
为了方便记忆分成了两类。
![](https://img.haomeiwen.com/i550939/cbd41342f874f23c.png)
01 用户发送来的请求相关的变量,这些变量取到的值都是与用户请求有关的。
02 TCP连接相关的。因为http是跑在TCP之上的。
03 比如request_filename
04 向用户发送http响应
05 系统变量不随请求发生变化
HTTP请求相关的变量
![](https://img.haomeiwen.com/i550939/dd64da096852a437.png)
![](https://img.haomeiwen.com/i550939/90f4fc0ba8f5dd5e.png)
![](https://img.haomeiwen.com/i550939/74dc6d13d39ec634.png)
request_body 取包体实际的值,很多时候取不到。什么时候能取到呢?使用反向代理,设定用内存暂存包体,然后从内存中取。
request 变量值,是用户的原始的url请求。可能在浏览器输入的不太相同。
![](https://img.haomeiwen.com/i550939/75cf5fc9cdee2c82.png)
![](https://img.haomeiwen.com/i550939/c4c6732106c9f0cb.png)
请求相关的另一个变量可以通过,http_
+头部名字,返回一个具体请求的头部值,图中有六类特殊的。nginx会做一些特定的处理,除此以外我们加入的http+头部名字的变量没有匹配上那六类,将原封不动的从用户请求的header取到,填到变量(http+头部名字)值当中。
留言问题
1.HTTP框架 内置变量很实用 之前又一次帮助数据组的同学获取埋点的log 就通过 $args 和 http_头部名字 获取到相应的数据 写入到log中
2.我有一个疑惑的地方,见您经常说http框架和http模块,这个http框架指的是什么,我看源码,是指的 http.c 这个程序吗?http模块我理解就是源码内 ngx_http_xxxx_module 这样的功能模块(根据自己实际情况来决定是否编译进来)。
您说的这个http框架具体指什么呢?是指的http的处理流程还是某个程序模块。
是不是nginx也有stream框架和mail框架。
作者回复
有个简单的办法:src/http目录下的文件都是框架,而src/http/modules/目录下的都是http模块。
3.nginx 502的异常情况 有哪些
作者回复
连接上游失败
网友评论