nginx的内置变量有哪些
Nginx 内置变量是预定义的变量,可以在配置文件中(如 server
、location
等块)直接使用,主要用于日志记录、条件判断、动态代理等场景。以下是常见的 Nginx 内置变量分类及说明:
1. HTTP 请求相关变量
变量名 |
说明 |
$host |
请求头中的 Host 字段,或服务器名(无 Host 头时)。 |
$http_host |
同 $host ,但包含端口号(如 example.com:80 )。 |
$server_name |
当前匹配的 server 块的 server_name 值。 |
$request_method |
HTTP 请求方法(如 GET 、POST )。 |
$request_uri |
完整的原始请求 URI(带参数,如 /path?arg=value )。 |
$uri / $document_uri |
当前请求的 URI(不含参数,如 /path )。 |
$args / $query_string |
请求参数部分(如 arg=value )。 |
$is_args |
如果请求有参数,值为 ? ;否则为空。 |
$remote_addr |
客户端 IP 地址。 |
$remote_port |
客户端端口号。 |
$server_addr |
服务器 IP 地址。 |
$server_port |
服务器端口号。 |
$scheme |
请求协议(http 或 https )。 |
$http_user_agent |
客户端 User-Agent 信息。 |
$http_referer |
请求来源页面的 Referer 头。 |
$http_cookie |
请求的 Cookie 头。 |
$content_type |
请求的 Content-Type 头。 |
$content_length |
请求的 Content-Length 头。 |
2. 响应相关变量
变量名 |
说明 |
$status |
HTTP 响应状态码(如 200 、404 )。 |
$body_bytes_sent |
发送给客户端的字节数(不含响应头)。 |
$bytes_sent |
发送给客户端的总字节数(含响应头)。 |
$sent_http_* |
响应头字段,如 $sent_http_content_type 、$sent_http_cache_control 。 |
3. 代理相关变量
变量名 |
说明 |
$proxy_host |
代理目标服务器的主机名。 |
$proxy_port |
代理目标服务器的端口号。 |
$proxy_add_x_forwarded_for |
追加客户端 IP 到 X-Forwarded-For 头的值(用于多级代理)。 |
4. 其他实用变量
变量名 |
说明 |
$request_time |
请求处理时间(秒,含客户端响应时间)。 |
$upstream_response_time |
上游服务器响应时间(反向代理时使用)。 |
$time_local |
本地时间的日志格式(如 02/May/2023:10:12:36 +0800 )。 |
$nginx_version |
Nginx 版本号。 |
$pid |
当前 Worker 进程的 PID。 |
5. 动态变量示例
location /example {
# 记录客户端IP和请求URI
add_header X-Client-IP $remote_addr;
add_header X-Request-URI $request_uri;
# 根据参数动态代理
if ($args ~ "service=(\w+)") {
proxy_pass http://$1.example.com;
}
# 记录响应时间到日志
access_log /var/log/nginx/access.log combined;
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" $request_time';
}
注意事项
- 变量作用域:大部分变量在请求处理阶段动态生成,不能用于所有上下文(如
if
条件需谨慎使用)。
- 性能影响:频繁使用复杂变量(如正则匹配)可能影响性能。
- 自定义变量:可通过
set $var value;
定义自定义变量。
如果需要完整列表,可参考 Nginx 官方文档:http://nginx.org/en/docs/varindex.html。