nginx

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > nginx > Nginx变量字段

解读Nginx变量字段大全

作者:alden_ygq

这篇文章主要介绍了Nginx变量字段,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Nginx 的变量系统功能强大,能够捕获请求、响应和服务器状态的各种信息。

以下是常用的 Nginx 变量分类整理:

一、请求信息变量

变量名描述
$host请求中的主机名(如example.com),优先使用请求行的主机名,否则使用 server_name。
$request_methodHTTP 请求方法(如GET、POST)。
$request_uri完整的请求 URI(如/path?query=string)。
$uri解码后的请求 URI,可能在处理过程中被修改(如/path)。
$args请求中的查询字符串(如query=string)。
$query_string同$args。
$request_body请求体内容,需在location中启用proxy_pass或fastcgi_pass。
$content_type请求的 Content-Type 头(如application/json)。
$content_length请求的 Content-Length 头。
$request

记录请求的URL和HTTP协议

$request_length用于记录客户端请求的总大小(以字节为单位)。这个变量包含了整个 HTTP 请求的所有部分:请求行、请求头和请求体。它在日志分析、流量监控和安全防护等场景中非常有用。

二、客户端信息变量

变量名描述
$remote_addr客户端 IP 地址。
$remote_port客户端端口号。
$http_user_agent客户端 User-Agent 头(如浏览器信息)。
$http_referer客户端 Referer 头(来源页面)。
$http_cookie客户端 Cookie 头。

三、服务器信息变量

变量名描述
$server_addr服务器 IP 地址。
$server_port服务器端口号。
$server_name匹配请求的 server_name。
$scheme请求协议(http或https)。
$server_protocol请求协议版本(如HTTP/1.1)。

四、响应信息变量

变量名描述
$status响应状态码(如200、404)。
$body_bytes_sent发送给客户端的响应体字节数(不包含响应头)。
$bytes_sent用于记录发送给客户端的总字节数,包括响应头和响应体。这个变量在日志记录、流量统计和性能监控中非常有用。
$sent_http_*自定义响应头(如$sent_http_content_type)。

五、时间相关变量

变量名描述
$request_time请求处理时间(单位:秒,精确到毫秒)。
$msec当前时间(单位:秒,精确到毫秒)。
$time_iso8601ISO 8601 格式的时间(如2023-01-01T12:00:00+08:00)。
$time_local本地时间(如01/Jan/2023:12:00:00 +0800)。

六、连接相关变量

变量名描述
$connection连接序列号。
$connection_requests当前连接上的请求数量。
$keepalive_requests持久连接上的请求数量。
$pipe

用于指示请求的处理方式是通过管道(piped)还是缓冲(buffered)。这个变量主要用于调试和性能分析,特别是在处理大文件或代理请求时。

七、Nginx 内置变量

变量名描述
$arg_*获取请求参数(如$arg_name获取?name=value中的value)。
$cookie_*获取 Cookie 值(如$cookie_session)。
$http_*获取任意请求头(如$http_accept)。
$sent_http_*设置响应头(如add_header Cache-Control $sent_http_cache_control)。

八、高级变量

变量名描述
$upstream_addr上游服务器地址(如代理后端的 IP: 端口)。
$upstream_response_time上游服务器响应时间(多个上游时用逗号分隔)。
$uri_filenameURI 中的文件名部分(如/path/file.txt中的file.txt)。
$request_id生成唯一请求 ID(用于日志追踪)。
$upstream_connect_timeNginx与后游服务器建立连接所消耗的时间,其中包含连接握手的时间,单位为秒。
$upstream_header_time接收到后端服务器响应头花费的时间。
$upstream_queue_time

请求保留在upstream队列中的时间。

队列:如果在处理请求时无法立即选择upstream服务器,则该请求将被放入队列中。如果队列已满,或者在timeout参数指定的时间段内无法选择将请求传递给的服务器,则会将502(错误网关)错误返回给客户端。

$http_x_forwarded_for

用于获取客户端的真实 IP 地址。在经过代理服务器(如负载均衡器、CDN)转发的请求中,客户端的原始 IP 会被记录在 X-Forwarded-For 请求头中,而非 $remote_addr(它记录的是直接连接到 Nginx 的客户端或代理服务器的 IP)。
$remote_user 用于获取通过 HTTP 基础认证(Basic Authentication)验证的用户名。它在需要用户身份验证的场景中非常有用,但在使用时需要注意其生效条件和安全问题。
$http_authorization用于获取客户端发送的 Authorization 请求头。这个变量在处理身份验证(如 Basic Auth、Bearer Token、OAuth 等)时非常重要。

九、自定义变量

通过set指令定义:

set $my_var "custom_value";

使用示例

在配置中引用变量:

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

location /proxy {
    proxy_pass http://backend;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

注意事项

  1. 变量生效范围:部分变量(如$request_body)仅在特定模块或指令中可用。
  2. 性能影响:过度使用复杂变量(如正则表达式变量)可能影响性能。
  3. 变量嵌套:某些情况下变量嵌套(如$http_$variable)可能不生效,需用map指令处理。

如需查看完整官方文档,可访问:Nginx Variables

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文