以前说了不少关于 Nginx 模块的内容,还有一部分很是重要的内容,那就是 Nginx 的变量。变量在 Nginx 中能够说无处不在,认识了解这些变量的做用和原理一样是必要的,下面几乎囊括了关于 Nginx 的全部变量,单独看起来可能比较枯燥,放心,后面依然有实战内容。nginx
围绕 Nginx 中的变量模块能够分为两类,一类是提供变量的模块,另一类是使用变量的模块。git
也就是在 Nginx 启动时,已经定义了变量,而只有当真正处理请求的时候,才会根据 nginx.conf 解析出来的变量使用方式调用 Preconfiguration 中定义的方法来实际获取值。github
这也是变量的两个特性:服务器
除了 Nginx 的模块以外,Nginx 框架也包含许多的变量,这些变量不须要经过编译模块来引入,并且,Nginx 框架所提供的变量每每反映了处理请求的细节,所以,了解 Nginx 框架所提供的变量是十分有必要的。cookie
先来看一下关于 HTTP 请求的相关变量。框架
arg_参数名:URL 中某个具体参数的值curl
query_string:与 args 变量彻底相同tcp
args:所有 URL 参数学习
is_args:若是请求 URL 中有参数则返回 ?,不然返回空url
content_length:HTTP 请求中标识包体长度的 Content-Length 头部的值。若是请求中没有携带这个参数,那么就取不到对应的值。
content_type:标识请求包体类型的 Content-Type 头部的值。一样须要用户请求中携带对应的参数。
uri:请求的 URI(不一样于 URL,不包括 ? 后的参数)
document_uri:与 uri 彻底相同。因为历史缘由而存在的。
request_uri:请求的 URL(包括 URI 以及完整的参数)
scheme:协议名,例如 HTTP 或者 HTTPS
request_method:请求方法,例如 GET 或者 POST
request_length:全部请求内容的大小,包括请求行、头部、包体等
remote_user:由 HTTP Basic Authentication 协议传入的用户名
request_body_file:不少时候会将用户请求的包体存放到文件中,这个变量就是临时存放请求包体的文件
request_body:请求中的包体,这个变量当且仅当使用反向代理,且设定用内存暂存包体时才有效
request:原始的 URL 请求,含有方法与协议版本,例如 GET /?a=1&b=22 HTTP/1.1
host
http_头部名字:返回一个具体请求头部的值
特殊变量,这些变量会作一些处理。
通用变量,除了以上的变量,均可以取到对应的值。
下面是关于 TCP 链接的变量。
Nginx 处理 HTTP 请求的过程当中也会产生不少变量。
body_bytes_sent:响应中 body 包体的长度
bytes_sent:所有 http 响应的长度
status:http 响应中的返回码
sent_trailer_名字:把响应结尾内容里的值返回
sent_http_头部名字:响应中某个具体头部的值
特殊处理,下面这些变量须要通过特殊处理:
通用:除了上面这些头部,其余的头部都是通用型的,也就是能够直接拿来用。
配置文件:
log_format vartest '$remote_addr - $remote_user [$time_local] "$request" '
'$status bytes_sent=$bytes_sent body_bytes_sent=$body_bytes_sent "$http_referer" '
'"$http_user_agent" "$sent_http_abc"';
server {
server_name var.ziyang.com localhost;
#error_log logs/myerror.log debug;
access_log logs/vartest.log vartest;
listen 9090;
location / {
set $limit_rate 10k;
# return 200; tcpinfo: $tcpinfo_rtt,$tcpinfo_rttvar, $tcpinfo_snd_cwnd, $tcpinfo_rcv_space
return 200 '
arg_a: $arg_a,arg_b: $arg_b,args: $args
connection: $connection,connection_requests: $connection_requests
cookie_a: $cookie_a
uri: $uri,document_uri: $document_uri, request_uri: $request_uri
request: $request
request_id: $request_id
server: $server_addr,$server_name,$server_port,$server_protocol
host: $host,server_name: $server_name,http_host: $http_host
limit_rate: $limit_rate
hostname: $hostname
content_length: $content_length
status: $status
body_bytes_sent: $body_bytes_sent,bytes_sent: $bytes_sent
time: $request_time,$msec,$time_iso8601,$time_local
';
}
}复制代码
从上面这个配置文件中,咱们能够看出来,返回的响应里面包含了一系列的变量,实际验证一下:
➜ test_nginx curl -H 'Content-Length: 0' -H 'Cookie: a=c1' 'localhost:9090?a=1&b=22'
arg_a: 1,arg_b: 22,args: a=1&b=22
connection: 2,connection_requests: 1
cookie_a: c1
uri: /,document_uri: /, request_uri: /?a=1&b=22
request: GET /?a=1&b=22 HTTP/1.1
request_id: 5d40b1ff29d2b87d5db5c4f95ebf5e4d
server: 127.0.0.1,var.ziyang.com,9090,HTTP/1.1
host: localhost,server_name: var.ziyang.com,http_host: localhost:9090
limit_rate: 10240
hostname: yuanzizhen.local
content_length: 0
status: 200
body_bytes_sent: 0,bytes_sent: 0
time: 0.000,1590842354.866,2020-05-30T20:39:14+08:00,30/May/2020:20:39:14 +0800复制代码
你们能够对比一下响应和配置文件中的值是否是一一对应的,更加深入的理解一下变量的含义。
好了,这一节我们学习了。关于 Nginx 的变量就讲完了,下一节讲一下实际应用变量的两个模块,你们会有更深入的理解。
本文首发于个人我的博客:iziyang.github.io,全部配置文件我已经放在了 Nginx 配置文件,你们能够自取。