zoukankan      html  css  js  c++  java
  • Nginx核心模块内置变量

    本文根据Nginx官网整理了Nginx的ngx_http_core_module模块的内置变量,可与Apache做对比参考。随后做了一次测试观察各变量的值,并附上测试结果。

    1.变量列表

    $arg_name    请求行中参数name的值。

    $args    请求行中的所有参数。

    $binary_remote_addr    客户端地址的二进制形式。

    $body_bytes_sent    发送给客户端的字节数,不包含响应头的内容,与Apache的mod_log_config模块中的%B兼容。

    $bytes_sent    发送给客户端的字节数(1.3.8, 1.2.5)。

    $connection    连接序列号(1.3.8,1.2.5)(有人说是TCP连接的序列号,但在1.6.2上抓包观察却不是)

    $connection_requests    当前连接的请求数(1.3.8,1.2.5)。

    $content_length    请求头中的Content-Length值。

    $content_type    请求头中的Content-Type值。

    $cookie_name    名为name的cookie值。

    $document_root    当前请求的根目录或别名。

    $document_uri    同$uri

    $host    按如下顺序取值:请求的主机名,请求头的Host值,匹配的服务器名。

    $hostname    服务器主机名。

    $http_name    该变量的最后一部分是请求头中的字段名称转换为小写,破折号由下划线替换而来。比如使用$http_content_encoding获取Content-Encoding的值。

    $https    如果使用SSL模式连接,则值为on,否则为空字符串。

    $is_args    如果请求行中带有参数,则值为?,否则为空字符串。

    $limit_rate    设置的响应速度。

    $msec    精确到毫秒的当前时间(1.3.9, 1.2.6)。

    $nginx_version    nginx版本。

    $pid    进程PID。

    $pipe    如果请求来自管道,则值为p,否则为.。

    $proxy_protocol_addr    来自代理协议头的客户端地址,否则为空字符串(1.5.12)。必须先通过在listen指令中设置proxy_protocol参数来启用代理协议。

    $proxy_protocol_port    代理服务器端口(1.11.0)。同样需要使用proxy_protocol启用代理。

    $query_string    同$args

    $realpath_root    当前请求的根目录或别名的绝对路径,所有符号链接将解析为实际路径。

    $remote_addr    客户端地址。

    $remote_port    客户端端口。

    $remote_user    基本身份认证使用的用户名。

    $request    完整的请求行。

    $request_body    请求体。当请求体被读取到内存缓冲区时,变量的值在proxy_pass,fastcgi_pass,uwsgi_pass和scgi_pass指令处理的位置可用。

    $request_body_file    请求体的临时文件的名称。在处理结束时,需要删除该文件。若要始终将请求主体写入文件,需要启用client_body_in_file_only。当在代理请求或对FastCGI / uwsgi / SCGI服务器的请求中传递临时文件的名称时,应分别通过proxy_pass_request_body off,fastcgi_pass_request_body off,uwsgi_pass_request_body off或scgi_pass_request_body off指令禁用传递请求体。

    $request_completion    一次请求结束时值为OK,否则为空字符串。

    $request_filename    当前请求的文件路径,由根路径或别名和请求URI组成。

    $request_id    16个随机字节生成的唯一请求标识符,用十六进制表示(1.11.0)。

    $request_length    请求长度(包括请求行,请求头和请求体)(1.3.12,1.2.7)。

    $request_method    请求方法,通常是GET或POST。

    $request_time    发出请求时的时间戳。官方说是处理请求所花费的时间(1.3.9,1.2.6)。

    $request_uri    完整的原始请求URI(包含参数)。

    $scheme    请求协议,http或https。

    $sent_http_name    显示自定义的响应头字段,变量名称的最后一部分是字段名称转换为小写,短划线由下划线替换。用法与$http_name类似。

    $sent_trailer_name    在响应结束时发送的任意字段(1.13.2),变量名称的最后一部分是字段名称转换为小写,破折号由下划线替换。

    $server_addr    接受请求的服务器的地址。计算此变量的值通常需要一次系统调用。为避免系统调用,listen指令必须指定地址并使用bind参数。

    $server_name    服务器名。

    $server_port    服务器端口。

    $server_protocol    请求协议,通常是HTTP/1.0、HTTP/1.1或HTTP/2.0。

    $status    响应状态(1.3.2,1.2.2)。

    $tcpinfo_rtt$tcpinfo_rttvar$tcpinfo_snd_cwnd$tcpinfo_rcv_space    有关客户端TCP连接的信息,在支持TCP_INFO套接字选项的系统上可用。

    $time_iso8601    ISO 8601标准格式的本地时间(1.3.12,1.2.7)。

    $time_local    通用日志格式的本地时间(1.3.12,1.2.7)。

    $uri    当前请求的URI。$uri的值可能在请求处理期间发生变化,例如在进行内部重定向或使用索引文件时。

    2.测试

    大致过程如下:

    准备好nginx和php环境,使用fastcgi_param将nginx变量传递给php,在php中设置好cookie,最后通过前端页面将结果输出。

    本次测试将test.com域名与服务器IP绑定,使用Postman发送GET请求,访问地址是http://test.com:89/var.php?name=Tom&age=20,并添加一个Header字段Name:Bob。

    测试结果如下: 

    Variable Value
    $arg_name Tom
    $args name=Tom&age=20
    $binary_remote_addr xC0xA8e8
    $body_bytes_sent 0
    $bytes_sent 0
    $connection 527
    $connection_requests 1
    $content_length  
    $content_type  
    $cookie_name Tommy
    $document_root /var/www
    $document_uri /var.php
    $host test.com
    $hostname debian8
    $http_name Bob
    $https  
    $is_args ?
    $limit_rate 0
    $msec 1532076179.430
    $nginx_version 1.6.2
    $pid 32229
    $pipe .
    $proxy_protocol_addr  
    $proxy_protocol_port  
    $query_string name=Tom&age=20
    $realpath_root /var/www
    $remote_addr 192.168.101.56
    $remote_port 11164
    $remote_user  
    $request GET /var.php?name=Tom&age=20 HTTP/1.1
    $request_body  
    $request_body_file  
    $request_completion  
    $request_filename /var/www/var.php
    $request_id  
    $request_length 281
    $request_method GET
    $request_time 1532076179
    $request_uri /var.php?name=Tom&age=20
    $scheme http
    $sent_http_name  
    $sent_trailer_name  
    $server_addr 192.168.100.64
    $server_name test.com
    $server_port 89
    $server_protocol HTTP/1.1
    $status 000
    $tcpinfo_rtt 4000
    $tcpinfo_rttvar 2000
    $tcpinfo_snd_cwnd 10
    $tcpinfo_rcv_space 29200
    $time_iso8601 2018-07-20T16:42:59+08:00
    $time_local 20/Jul/2018:16:42:59 +0800
    $uri /var.php


     上述测试只是直接访问Web服务器的结果,没有使用代理,nginx也没有做额外的设置,仅供参考。

    注:

    1. 前端$status的值是000,后端输出的是200;

    2. 1.6.2版本中的$proxy_protocol_port、$request_id和$sent_trailer_name三个变量不能使用。

    --------------------------------------------------

    参考资料:

    1. nginx官网

    2. 《nginx内置变量》。

  • 相关阅读:
    Tomcat配置和Spring MVC配置
    Servlet学习总结
    Servlet 工作原理
    Spring MVC
    Spring的线程安全
    Struts的线程安全
    反射实现AOP动态代理
    Spring AOP的实现原理
    JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架
    Spring bean初始化以及管理
  • 原文地址:https://www.cnblogs.com/liuguanglin/p/9341400.html
Copyright © 2011-2022 走看看