在客户端请求过程中,Nginx提供了内置变量来获取HTTP或TCP的信息。充分了解这些内置变量,才能够对应用场景中的业务进行合理的配置,下面先来熟悉一下常见的内置变量。
注意: Nginx 1.9之后的版本开始支持TCP代理,这使Nginx的功能更为丰富(后面会有单独的介绍和案例示范)。本书默认以HTTP代理为例进行讲解,中间涉及TCP的地方会有特别说明。
常见内置变量的说明见表2-3。
表2-3 常见内置变量的说明
续表
注意:随着Nginx版本的不断更新,会出现更多新的指令,更多与Nginx内置变量有关的解释可参考Nginx 官方Wiki。
Nginx的内置变量主要用于日志记录和分析,以及业务逻辑的处理。下面将介绍一些常用内置变量的配置方式。
· $arg_name
上述代码的请求默认路径是http://a,如果URL中的参数是at=5,则路径变为http://b。关于if、location的配置后面会有单独的章节进行说明。
· $body_bytes_sent和$bytes_sent
这两个变量的值之差就是HTTP 响应头的大小。如果两个值相差悬殊,那么响应头就很大,需要确保proxy_buffer设置了合适的大小,因为如果超过proxy_buffer设置的值,error.log就会显示如下内容:
读者可以修改如下的参数值(具体大小需要根据自身需求来确定)来解决这个问题,例如:
· $realip_remote_addr
在Nginx 1.9.7版本以后加入ngx_http_realip_module的变量,此变量可以获取用户的IP地址(如常见的代理或CDN的节点IP地址)。
· $request_time和$upstream_response_time
$upstream_response_time指的是在Nginx启用了upstream的情况下,从Nginx与后端建立连接开始到接收完数据然后关闭连接为止的时间。$request_time指从接收到用户请求到发送完响应数据的时间,包括接收请求数据的时间、程序响应的时间和输出响应数据的时间。
如果要检查后端服务的性能,需要使用$upstream_response_time的值。
· $uri和$request_uri
$uri记录的是执行一系列内部重定向操作后最终传递到后端服务器的URL(不包含参数$args的值)。
$request_uri记录的是当前请求的原始URL(包含参数),如果没有执行内部重定向操作,$request_uri去掉参数后的值和$uri的值是一样的。在线上环境中排查问题时,如果在后端服务中看到的请求和在Nginx中存放的$request_uri无法匹配,可以考虑去 $uri里面进行查找。
· $scheme
近几年来,HTTPS非常流行,很多互联网企业都把HTTP切换成了HTTPS,但是当用户手动输入网站地址时,很少会主动加上https://。为了让用户的请求能够顺利跳转到HTTPS,首先需要判断用户输入的是HTTP还是HTTPS。$scheme就具有此功能,如果用户输入的是HTTP可以通过重定向跳转到HTTPS,示例代码如下: