变量

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

  • 请求 URI,不包括主机名和参数部分。

$args

$request_uri

$scheme

  • 请求的协议,例如:
    • http、https、ftp 等

$host

$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信息
  • 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