Nginx 作为一个高性能的 HTTP 和反向代理服务器,支持多种变量,这些变量在配置文件(如 nginx.conf
)和模块中被广泛使用,用于控制请求的处理、日志记录、重定向等。Nginx 变量主要分为内置变量(也称为系统变量)和自定义变量。
所有的Nginx变量在Nginx配置文件中引用时都须带上$
前缀。Nginx变量只能存放一种类型的值,即字符串类型。通过变量,可以简化配置、提高配置的灵活性。
一、内置变量
以下是常用的内置变量:
变量名 描述 $host
来自请求行的主机(Host)名,或者处理请求的服务器名称。如果请求行中没有主机(Host)名,则等于设置的服务器名称。 $remote_addr
客户端的IP地址。 $request_uri
请求的URI,包括参数。 $server_name
处理该请求的服务器名称。 $server_protocol
请求使用的协议,例如 “HTTP/1.0”, “HTTP/1.1” 或 “HTTP/2.0”。 $request_method
请求使用的方法,如"GET"或"POST"等。 $scheme
客户端请求的协议,如"http"或"https"。 $http_user_agent
客户端浏览器的用户代理字符串,用于识别客户端的类型和版本。 $http_referer
客户端请求的来源页面,用于追踪请求的来源。 $http_cookie
客户端发送的所有Cookie,可以用于处理基于Cookie的认证或会话管理。
[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server {
listen 80;
server_name www.dh.com;
root /opt/;
location /main {
index index.html;
default_type text/html;
echo "hello world, main-->";
echo "Remote Addr: $remote_addr";
echo "Args: $args";
echo "Arg User: $arg_user";
echo "Document Root: $document_root";
echo "Document URI: $document_uri";
echo "Host: $host";
echo "User Agent: $http_user_agent";
echo "Scheme: $scheme";
}
}
[root@localhost ~]#nginx -s reload
输出
[root@localhost ~]# curl 127.0.0.1
hello world, main-->
Remote Addr: 192.168.1.1
Args:
Arg User: dh
Document Root: /opt
Document URI: /main
Host: www.dh.com
User Agent: curl/7.29.0
Scheme: http
二、自定义变量
自定义变量是在Nginx配置中由用户定义的变量,它们可以通过set
指令在server
、location
、if
等上下文中定义。
server {
listen 80;
server_name localhost;
location / {
set $first "hello ";
echo "${first}world";
}
}
或者
server {
listen 80;
server_name localhost;
location / {
set $first "hello";
echo "$first world";
}
}
输出
[root@localhost ~]# nginx -s reload
[root@localhost ~]# curl 127.0.0.1
hello world
三、变量的作用域和生命周期
Nginx中的变量具有作用域和生命周期的概念。变量的作用域决定了在哪里可以访问该变量,而生命周期决定了变量何时被创建和销毁。以下是Nginx中变量的一些常见作用域和生命周期:
- server:在server块内定义的变量具有局部作用域,仅在该server块内有效。当一个新的请求到达时,Nginx会为每个请求创建一个新的进程,因此每个进程都有自己的变量副本。当请求处理完成后,进程会被销毁,与之相关的变量也会被销毁。
- location:在location块内定义的变量具有局部作用域,仅在该location块内有效。与server块类似,当一个新的请求到达时,Nginx会为每个请求创建一个新的进程,因此每个进程都有自己的变量副本。当请求处理完成后,进程会被销毁,与之相关的变量也会被销毁。
- http:在http块内定义的变量具有全局作用域,在整个配置文件中都有效。这意味着在一个server块或一个location块内定义的同名变量会覆盖全局变量的值。由于全局变量是在主进程中创建的,因此它们在整个服务器的生命周期内都是可用的。但是,需要注意的是,全局变量的使用可能会导致配置复杂性增加,因此应谨慎使用