Nginx系列之常用内置变量

1、前言

之前在大学里学PHP时,一直用的是LAMP/WAMP架构,对nginx不甚了解,大概一年前给新公司搭建后端环境时,选择了LNMP架构,如今使用nginx已有时日,打算对常用知识做个总结,免得每次需要时都去百度或者查官方文档。该系列文章都是根据nginx官方文档练习和自己的使用经验总结而来,绝非随便摘抄。
该文章主要总结了nginx常用的内置变量的含义,熟悉这些变量有助于熟练编写nginx配置文件,亦能够结合其它指令实现一些特殊需求。

2. 从请求行中解析到的变量

以访问http://invo.com/nginx-var/request-line?a=1&b=2得到的结果为例,invo.com为测试的虚拟主机

变量 含义 示例
$request 整个请求行 GET /nginx-var/request-line?a=1&b=2 HTTP/1.1
$request_method 请求方法(如GET、POST) GET
$request_uri 完整的请求URI /nginx-var/request-line?a=1&b=2
$uri URI,除去查询字符串 /nginx-var/request-line
$document_uri $uri /nginx-var/request-line
$args 查询字符串 a=1&b=2
$query_string $args a=1&b=2
$server_protocol 请求协议(如HTTP/1.0 HTTP/1.1) HTTP/1.1
$arg_name 请求行中name参数的值 $arg_a = 1 , $arg_b = 2

说明: 这些变量在配置文件中通常配合try_files指令和rewrite指令使用。

3. 从请求头中解析到的变量

用Firefox的HttpRequester插件,添加Cookie为CA=abc;CB=123,Referer为http://invo.com的请求头,
以访问地址http://invo.com/nginx-var/header-var得到的结果为例。

变量 含义 示例
$host 该变量按如下优先级获得:请求行中解析到的host、请求头“Host”中的host、配置文件中匹配到的server_name invo.com
$remote_addr 客户端ip地址 127.0.0.1
$remote_port 客户端端口 4204
$http_user_agent 用户代理(“User-Agent”请求头的值) Mozilla/5.0 (Windows NT 6.1; rv:50.0) Gecko/20100101 Firefox/50.0
$http_cookie “Cookie”请求头的值 CA=abc;CB=123
$cookie_name Cookie中名为name的值 $cookie_CA=abc, $cookie_CB=123
$http_referer “Http-Referer”请求头的值 http://invo.com

说明: $host、$remote_addr、$http_user_agent、$http_referer在配置文件中经常用到,可以根据这些变量来决定如何处理请求。以上变量也经常用在log_format指令中,这些变量的值将记录在日志文件,用于分析日志。有一次特意查看了下日志文件,发现同一个客户端每次请求服务器的端口($remote_port)会变化,推断公司网络的类型为对称型NAT。

4. 其它内置变量

变量 含义 示例
$body_bytes_sent 发给客户端的数据大小,以字节计,不包括http报头
$bytes_sent 发给客户端的数据大小,以字节计
$status http响应状态码
$request_time 请求处理时间
$upstream_response_time 从与upstream建立连接到收到最后一个字节所经历的时间(nginx做反向代理服务器时可用)
$upstream_connect_time 与upstream建立连接所消耗的时间(nginx做反向代理服务器时可用)

说明:以上变量通常用于日志配置中,用于统计流量和监视服务器性能。

5、本文中用到的配置内容

相关nginx配置内容如下,其中用到的echo指令需要用到第三方echo模块,推荐使用OpenResty,各种常用第三方模块都有。

    listen       80;
    server_name  invo.com invo.com;
    root   "D:/phpStudy/WWW/invo";
    access_log  logs/access.log  invo_com;
    location / {
        index  index.html index.htm index.php;
        #autoindex  on;
    }
    # variables parsed from request line
    location /nginx-var/request-line {
        default_type text/html;
        echo "Request Line: $request
"; echo "Request Method: $request_method
"; echo "Full Uri: $request_uri
"; echo "uri: $uri
"; echo "args: $args
"; echo "Server Protocol: $server_protocol
"; echo "Document Uri: $document_uri
"; echo "Query_String: $query_string
"; echo "arg_a=$arg_a, arg_b=$arg_b"; } # variables parsed from http header; location /nginx-var/header-var { default_type text/html; echo "Host: $host
"; echo "Remote Addr: $remote_addr
"; echo "Remote Port: $remote_port
"; echo "Content-Type: $content_type
"; echo "User-Agent: $http_user_agent
"; echo "Http-Cookie: $http_cookie
"; echo "cookie_CA=$cookie_CA, cookie_CB=$cookie_CB
"; echo "Http-Referer: $http_referer
"; }

你可能感兴趣的:(Nginx)