变量
Nginx 变量前言
在 Nginx 中,变量是用来存储和传递数据的容器。可以将它们看作是一些可变的值,可以在 Nginx 配置中使用,以便在运行时生成不同的内容或进行特定的操作,例如:作为功能判断或日志等场景
Nginx 变量可以分为两类:内置变量和自定义变量。
Nginx 内置变量
-
Nginx 内置变量是由 Nginx 提供的一组预定义变量;
-
通过内置变量可以获取到众多的与客户端访问相关的值,可以在配置文件中直接使用。
-
参考文档:https://nginx.org/en/docs/varindex.html
-
常用的内置变量包括:
$remote_addr
- 客户端 IP 地址,例如:
- 112.39.61.13
$server_addr
- 服务器的IP地址,注意:显示的是服务器网卡的真实IP 包括局域网IP,例如:
- 172.27.185.115
$server_name
- 当前请求的虚拟主机名,例如:
- xiangzheng.vip
$server_port
- 服务器的端口号,例如:
- 80
- 443
$upstream_response_time
- 后端应用服务器处理时间
$upstream_addr
- 后端服务器地址
$proxy_add_x_forwarded_for
- 此变量表示将客户端的IP追加请求报文中 X-Forwarded-For 首部字段,多个IP之间用逗号分隔,如果请求中没有 X-Forwarded-For,就使用 $remote_addr
- X-Forwarded-For头信息可以有多个,中间用逗号分隔,第一项为真实的客户端ip,剩下的就是曾经经过的代理或负载均衡的ip地址,经过几个就会出现几个。
$document_root
- 当前请求资源的系统根目录位置,例如:
- /data/web/pc/html
$document_uri
- 不包含参数的URI
- 假设访问的网站为 www.azheng.com/echo/index-1000002662.html?from=pc ,那么此变量的返回结果将是:
- /echo/index-1000002662.html
$uri
- 请求 URI,不包括主机名和参数部分。
$args
- RUL的参数,请求的参数部分。
- 假设访问的网站为 www.azheng.com/echo/index-1000002662.html?from=pc ,那么此变量的返回结果将是:
- from=pc
$request_uri
- 完整uri,相当于 $document_uri+$args
- 假设访问的网站为 www.azheng.com/echo/index-1000002662.html?from=pc ,那么此变量的返回结果将是:
- /echo/index-1000002662.html?from=pc
$scheme
- 请求的协议,例如:
- http、https、ftp 等
$host
- 请求行中的主机名,或“主机”请求头字段中的主机名,或与请求匹配的服务器名
- 假设访问的网站为 www.azheng.com/echo/index-1000002662.html?from=pc ,那么此变量的返回结果将是:
$request_filename
- 当前请求的文件路径,基于根或别名指令以及请求URI
- 假设访问的网站为 www.azheng.com/echo/index-1000002662.html?from=pc ,root中定义的路径为/data/web/pc/html,那么此变量的返回结果将是:
- /data/web/pc/html/echo/index-1000002662.html
$request_method
- 请求方法,例如:
- GET、POST、HEAD、DELETE 等
$server_protocol
- 客户端请求协议的版本,例如:
- HTTP/1.0、HTTP/1.1、HTTP/2.0 等
$http_user_agent
- 客户端浏览器的 User-Agent 信息
$http_referer
- 表示请求来源的 URL。
$http_<name>
- name为任意请求报文首部字段,例如:
- $http_user_agent 客户端浏览器的详细信息,如:curl/7.68.0
- $http_cookie 客户端的cookie信息
$cookie_<name>
- name为任意请求报文首部字段cookie
$request_time
- 总的处理时间
其他常用内置变量
$args # 存放了请求url中的请求指令。比如http://www.myweb.name/server/source?arg1=value1&arg2=value2 中的 arg1=value1&arg2=value2
$content_length # 存放请求头中的Content-length字段。
$content_type # 存放请求头中的Content-Type字段。
$document_root # 存放当前请求在root指令中指定的值。(即当前请求的根路径)
$host # 存放了请求url中的主机字段,比如比如http://www.myweb.name/server/source?arg1=value1&arg2=value2 中的 www.myweb.name。如果请求中的主机部分字段不可用或者为空,则存放nginx配置中该server块中server_name指令的配置值
$http_user_agent # 存放客户端agent信息
$http_cookie # 存放客户端cookie信息
$limit_rate # 这个变量可以限制连接速率。
$request_method # 客户端请求的动作,通常为GET或POST。
$remote_addr # 客户端的IP地址。
$remote_port # 客户端的端口。
$remote_user # 已经经过Auth Basic Module验证的用户名。
$request_filename # 当前请求的文件路径,由root或alias指令与URI请求生成。
$scheme # HTTP方法(如http,https)。
$server_protocol # 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr # 服务器地址,在完成一次系统调用后可以确定这个值。
$server_name # 服务器名称。
$server_port # 请求到达服务器的端口号。
$request_uri # 包含请求参数的原始URI,不包含主机名,如”/foo/bar.php?arg=baz”。
$uri # 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
$document_uri # 与$uri相同。Nginx 自定义变量
自定义变量是用户在 Nginx 配置中定义的变量。它们可以通过 set 指令创建,并且可以在配置文件中的任何地方使用。自定义变量的语法为:
set $variable value;
Context:server,location,if其中,$variable 是变量名,value 是变量的值,可以是一个字符串或一个表达式。
自定义变量可以自己设置,也可以在变量中调用其他变量
自定义变量的使用场景比较广泛,可以用于以下情况:
- 存储一些复杂的计算结果,以便在配置文件的其他地方使用。
- 将某些变量的值传递给后端应用程序。
- 在多个地方使用同一个变量,以避免重复代码。
需要注意的是,自定义变量的值可以在运行时更改,因此应谨慎使用,以免造成意料之外的结果。
范例
# vim /apps/nginx/conf/conf.d/pc.conf
server {
...
location /echo {
set $name azheng;
echo "$name";
set $my_port $server_port;
echo "$my_port";
echo "$server_name:$server_port";
}
...
}
# 测试
# curl www.azheng.com/echo
azheng
80
www.azheng.com:80