当前位置: 首页 > news >正文

【Nginx15】Nginx学习:HTTP核心模块(十二)内嵌变量

Nginx学习:HTTP核心模块(十二)内嵌变量

关于内嵌变量,其实就是 Nginx 开放给我们的在配置文件中可以使用的变量。源码中无非就是替换成真实的代码变量进行操作。这些变量可以帮助我们做很多事情。之前的文章中其实也有不少地方用到了,比如说 $uri 这个变量,是不是已经见过很多次了。而且这些变量基本上和 Apache 是对应的。

默认提供的变量非常多,在这里我也只是将官网的 HTTP 核心模块中提供的这些变量先列出来,然后尽已所能的借助工具翻译一下。最常用的那些大家至少要知道是什么意思,而不常用的那些也可以随时过来查阅。大部分自己使用 return 指令打印一下返回的结果看下效果就好了,特殊的我会单独写出来并加粗字体或者直接放上测试效果代码。

  • $arg_[name] 请求行中的 name 参数,注意这个 name 是可变的,指的就是 GET 参数。

// nginx.conf
location /params1/ {return 200 $arg_a;
}// linux
[root@localhost ~]# curl http://localhost/params1/?a=111
111

看出来效果了吧,直接可以获得我们的 GET 参数中的某一个具体的参数。如果要获取全部的参数,就要使用下面的变量。

  • $args 请求行中参数字符串。

// nginx.conf
location /params2/ {return 200 $args;
}// linux
[root@localhost ~]# curl "http://localhost/params2/?a=111&b=222"
a=111&b=222
  • $binary_remote_addr 客户端IP地址的二进制形式,值的长度总是4字节的 IPv4 或者16字节的 IPv6 地址。

  • $body_bytes_sent Nginx 返回给客户端的字节数,不含响应头。

  • $bytes_sent nginx返回给客户端的字节数。

  • $connection 连接的序列号。这个连接是 Nginx 自己计数的,比如刚开机或者完全重启 Nginx 就会从 1 开始,然后快速访问重用 TCP 连接时也不会增加,大家可以自己试下哦。

  • $connection_requests 当前通过连接发出的请求数。啥意思呢?也是和连接有关的,指的是当前这个 TCP 连接下的请求数,如果是新开的一个 TCP 连接,就会归零从1开始。用 CURL 和浏览器分别测试就很明显。浏览器请求一次后等一会再试也可以看到效果,和之前我们讲过的连接及长连接的内容吻合。

  • $connection_time 连接时间(以秒为单位,分辨率为毫秒)。当前建立的 TCP 连接的持续连接时间。同样的,新开 TCP 连接之后归零,和上面的测试方式类似。

  • $content_length “Content-Length” 请求头的值。

  • $content_type “Content-Type” 请求头的值。

  • $cookie_[name] 和第一个 $arg_[name] 一样的,这里是获取指定的 Cookie 的值。

  • $document_root 当前请求的 root 或者 alias 指令确定的目录路径。如果是相对路径,比如 root html 那个,返回的也是完整的绝对路径。

  • $document_uri 和 $uri 是一样的,之前我们就用过了,一会去那边看。

  • $host “Host” 请求头的值,如果没有该请求头,则为与请求对应的虚拟主机的首要主机名。

  • $hostname 机器名称。

  • $http_[name] 任意请求头的值;变量名的后半部为转化为小写并且用下划线替代横线后的请求头名称。还是和 $arg_[name] 一样,只不过这回是请求头中指定的字段值。

  • $https 如果连接是SSL模块,返回 on ,否则返回空字符串。

  • $is_args 如果请求行带有参数,返回 “?” ,否则返回空字符串。也就是说,有 GET 参数的话,这个变量的值就是个问号,如果没有 GET 参数的话,它就是空的。

  • $limit_rate 允许设置此值来限制连接的传输速率。之前在学习限流相关内容的时候我们已经了解过啦。

  • $msec 当前时间戳,单位是秒,精度是毫秒。(1.3.9, 1.2.6)

  • $nginx_version Nginx 的版本号。

  • $pid worker进程的PID,如果你当前只有一个 worker 进程,那么可以修改下 worker_process 多设置几个就能看出效果了。

  • $pipe 如果当前请求使用 pipeline 了,就会设置为 p ,否则的话就是 . 。这个 pipeline 也是 HTTP1.1 的一个特性,我也只是知道皮毛,这里就不多解释了,大家可以自己查阅下相关的资料。

  • $proxy_protocol_addr 通过代理协议获取真实地址。这个和 HAProxy 这种四层代理服务器有关,不在我们的讨论范围内。简单来说,就是四层负载转发过来的请求,要拿到真实 IP 比较麻烦,不像 Nginx 做反向代理时可以直接设置头。但如果使用 HAProxy 抛出的 Proxy Protocol 的话,就会简单很多。这一块的内容我记下了,如果将来要学习 HAProxy 相关的内容的话,那么会再进行更详细的测试与解读。

  • $proxy_protocol_port 和上面的一样,不过是获取端口号。

  • $proxy_protocol_server_addr 通过代理协议获取服务器地址。

  • $proxy_protocol_server_port 通过代理协议,获取服务器端口号。

  • $query_string 和 $args 一样。

  • $realpath_root 按 root 或者 alias 配置算出的当前请求的绝对路径,如果有软连接的文件也会解析成真实的文件路径。这个比较常用,我这里就是默认的 /usr/local/nginx/html 这个目录。

  • $remote_addr 客户端的 IP 地址。非常重要的,做反向代理的时候转发真实 IP 地址就靠它了。

  • $remote_port 客户端的端口号。注意,是客户端的,不是我们在 Nginx 用 listen 监听的。

  • $remote_user 为基本用户认证提供的用户名。这个直接请求加个 Authorization 请求头就可以测试出来,之前我们学习过 PHP的HTTP验证https://mp.weixin.qq.com/s/H8I1MSeqsuOn16lKXZ4Nrw ,其实,HTTP相关的验证直接在 Nginx 配就可以,后面我们也会学习到。

  • $request 完整的原始请求行。HTTP 请求中的第一行哦。

  • $request_body 请求正文。只有通过 proxy_pass 或者 fastcgi_pass 相关配置路径的路径中,这个变量里面才有值。最常见的一个需求,将 POST 请求的参数也放到 access 日志中,就需要使用这个变量。注意,只有动态页面才可以使用,因此才必须是需要 proxy_pass 或者 FastCGI 这些的路径。

  • $request_body_file 请求正文的临时文件名。处理完成时,临时文件被删除。这个和我们之前讲过的 client_body_in_file_only 参数有关。如果在被代理的请求或者 FastCGI 中传递临时文件名,就应该禁止传递请求正文。使用 proxy_pass_request_body off 配置和 fastcgi_pass_request_body off 配置来禁止传递普通的请求正文。

  • $request_completion 请求完成时返回 ok ,否则返回空字符串。没测试出效果,有了解的小伙伴可以留言哦。

  • $request_filename 比较有用的一个变量,根据 root 或者 alias 配置的路径,以及请求的 URI ,得到当前请求的完全文件路径。

  • $request_id 生成一个 16 字节的唯一哈希 ID ,在 1.11.0 版本之后才有的。

  • $request_length 请求的长度,包括请求行、请求头以及请求体的长度。

  • $request_method 请求方法,就是 POST 、GET 那些啦,比较有用的。

  • $request_time 请求处理的时间,单位为秒,精度是毫秒(1.3.9, 1.2.6),请求处理时间从由客户端接收到第一个字节开始计算。

  • $request_uri 返回原始的请求行(带 GET 参数的),注意它和 $uri 以及 $document_uri 的区别。

  • $scheme 请求协议的类型,比如 http 或 https 。

  • $sent_http_[name] 响应头的信息,这个 name 可以替换成响应头的名称,比如说 $sent_http_connection 就是响应头里面的 Connection 内容。

  • $sent_trailer_[name] 响应结束时发送的任意字段(1.13.2),变量名的后半部分 name 可以替换成任意响应头的名称。这个不太好测,需要使用日志,我们可以先在 http 模块中定义一个自定义日志 log_format vvv op_trailer=$sent_trailer_op; 这一块的内容我们后面才会学到。然后在 location 中添加 add_trailer op 111; 以及 access_log logs/params2.log vvv; 。接着访问链接之后,就可以在 /usr/local/nginx/logs 下面的 params2.log 日志文件中看到我们设置的内容。

  • $server_addr 接受请求的服务器地址。为计算这个值,通常需要进行一次系统调用。为了避免系统调用,必须指定listen 指令的地址,并且使用 bind 参数。我这里啥都没配,就是显示当前服务器的 IP 地址。

  • $server_name 接受请求的虚拟主机的首要主机名。server_name 配置指令的第一个主机名。

  • $server_port 接受请求的虚拟主机的端口。

  • $server_protocol 请求协议,通常为“HTTP/1.0”或“HTTP/1.1”。

  • $status 返回响应的状态码。

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

  • $time_iso8601 ISO 8601 标准的服务器当前时间,我这里的结果是 2022-08-14T22:43:00-04:00 。

  • $time_local 日志中的时间记录变量,格式是 14/Aug/2022:22:43:00 -0400 。

  • $uri 非常常用的,返回完整的 URI ,不包含 GET 参数。它值可能随请求的处理过程而改变。 比如,当进行内部跳转时,或者使用默认页文件。

总结

哈哈哈哈,是不是好简单啊,水了一篇文章。不过虽说内容少,但咱们可是一个一个真实地测了一下效果的,真不是从哪里复制粘贴来就完事了。

好了,这回真的要和 HTTP 核心模块道别了,我们即将进入 HTTP 扩展模块的学习了。说是扩展,但是其实也都是随安装包一起发布的,只需要在编译安装时的 configure 添加相应的模块即可,这一类的教程太多了,熟悉 Linux 安装软件的同学也都不会有问题。另外也有一部分模块本身就包含在核心源码中,只是区分出了不同的模块分类。因此,咱们还是以配置指令的介绍学习为主,商业版部分的模块也不在我们的学习范围内。

参考文档:

http://nginx.org/en/docs/http/ngx_http_core_module.html

相关文章:

【Nginx15】Nginx学习:HTTP核心模块(十二)内嵌变量

Nginx学习:HTTP核心模块(十二)内嵌变量 关于内嵌变量,其实就是 Nginx 开放给我们的在配置文件中可以使用的变量。源码中无非就是替换成真实的代码变量进行操作。这些变量可以帮助我们做很多事情。之前的文章中其实也有不少地方用到…...

2023年中国HPV宫颈癌疫苗需求量、竞争格局、市场规模及行业细分产品规模分析[图]

HPV宫颈癌疫苗也是人乳头瘤病毒疫苗,由重组表达的HPV主要衣壳蛋白L1病毒样颗粒制备而成,可以预防由HPV感染及其引起的各种疾病,包括宫颈癌、阴道癌、肛门癌和口咽癌等癌症,及相关癌前病变。 目前中国在售的HPV疫苗包括万泰生物的二…...

基于LMK2572的FPGA逻辑实现

项目背景: 在时钟同步或类似时钟方案系统,需要用到一些时钟芯片,LMK2572就是一款频率带宽覆盖广的芯片。 项目介绍: LMK2572该器件是一个低功耗、高性能的宽带合成器,可生成 13MHz 到 6.4GHz 的任何频率,而无需使用内部倍频器。该 PLL 可提供优异的性能,而 3.3V 单电源…...

数据通信——VRRP

引言 之前把实验做了,结果发现我好像没有写过VRRP的文章,连笔记都没记过。可能是因为对STP的记忆,导致现在都没忘太多。 一,什么是VRRP VRRP全名是虚拟路由冗余协议,虚拟路由,看名字就知道这是运行在三层接…...

第二章:CSS基础进阶-part2:CSS过渡与动画

文章目录 CSS3 过渡动画一、transition属性二、transform属性-2D变换2.1 tanslate : 移动2.2 rotate-旋转2.3 scale-变形2.4 skew-斜切2.5 transform-origin: 变换中心点设置 三、CSS3关键帧动画四、CSS3-3D变换4.1 perspective 定义3D元素距视图距离4.2 transform-…...

华为OD真题---玩牌高手--带答案

2023华为OD统一考试(AB卷)题库清单-带答案(持续更新)or2023年华为OD真题机考题库大全-带答案(持续更新) 玩牌高手 给定一个长度为n的整型数组,表示一个选手在n轮内可选择的牌面分数。选手基于规…...

案例14 Spring MVC文件上传案例

基于Spring MVC实现文件上传&#xff1a; 使用commons-fileupload实现上传文件到本地目录。 实现上传文件到阿里云OSS和从阿里云OSS下载文件到本地。 1. 创建项目 选择Maven快速构建web项目&#xff0c;项目名称为case14-springmvc03。 ​ 2. 配置Maven依赖 <?xml ver…...

如何用Python实现多线程

1 问题 线程是操作系统能够进行运算调度的最小单位。进程被包含在进程中&#xff0c;是进程中实际处理单位。一条线程就是一堆指令集合。一条线程是指进程中一个单一顺序的控制流&#xff0c;一个进程中可以并发多个线程&#xff0c;每条线程并行执行不同的任务。那么如何用pyt…...

Chrome浏览器导出插件并安装到其他电脑浏览器上的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

对话即数据分析,网易数帆ChatBI做到了

大数据产业创新服务媒体 ——聚焦数据 改变商业 在当今数字化快速发展的时代&#xff0c;数据已经成为业务经营与管理决策的核心驱要素。无论是跨国大企业还是新兴创业公司&#xff0c;正确、迅速地洞察数据已经变得至关重要。然而&#xff0c;传统的BI工具往往对用户有一定的…...

简单记录牛客top101算法题(初级题C语言实现)BM17 二分查找 BM21 旋转数组的最小数字 BM23 二叉树的前序遍历

1. BM17 二分查找 要求&#xff1a;给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff08;下标从 0 开始&#xff09;&#xff0c;否则返回 -1。 输入&#xff1a…...

日常BUG——Java使用Bigdecimal类型报错

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 直接上代码&#xff1a; Test public void test22() throws ParseException {System.out.p…...

为Windows Terminal设置背景图片

直接通过界面上选项无法达到修改背景图片的目的&#xff0c;后再在官网&#xff0c;和git上找到通过修改配置文件来更改背景图片 首先打开设置界面 点击左下角打开settings.json文件 在json中profiles关键字default选项相面增加几个key,就像下面 修改前修改后 修改后的termin…...

【Spring】-Spring中Bean对象的存取

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【Framework】 主要内容&#xff1a;往spring中存储Bean对象的三大方式&#xff1a;XML方式(Bean标签)&#xff1b;五大类注解&#xff1b;方法注解。从spring中取对象的两种方式…...

机器人CPP编程基础-03变量类型Variables Types

机器人CPP编程基础-02变量Variables 全文AI生成。 C #include<iostream>using namespace std;main() {int a10,b35; // 4 bytescout<<"Value of a : "<<a<<" Address of a : "<<&a <<endl;cout<<"Val…...

或许有用的开源项目平台——物联网、区块链、商城、CMS、客服系统、低代码、可视化、ERP等

摘自个人印象笔记Evernote Export wumei-smart-物美智能开源物联网平台 官网&#xff1a;https://wumei.live/ gitee&#xff1a;https://gitee.com/kerwincui/wumei-smart 一个简单易用的物联网平台。可用于搭建物联网平台以及二次开发和学习。适用于智能家居、智慧办公、智慧…...

火车头采集伪原创插件【php源码】

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python代码大全和用法&#xff0c;python代码大全简单&#xff0c;现在让我们一起来看看吧&#xff01; 火车头采集ai伪原创插件截图&#xff1a; 1、题目&#xff1a;列表转换为字典。 程序源代码&#xff1a; 1 #!/us…...

【数学】CF1514 C

Problem - 1514C - Codeforces 题意&#xff1a; 思路&#xff1a; Code&#xff1a; #include <bits/stdc.h>using i64 long long;constexpr int N 2e5 10; constexpr int M 2e5 10; constexpr int mod 998244353;void solve() {int n;std::cin >> n;std:…...

SqlServer基础之(触发器)

概念&#xff1a; 触发器&#xff08;trigger&#xff09;是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法&#xff0c;它是与表事件相关的特殊的存储过程&#xff0c;它的执行不是由程序调用&#xff0c;也不是手工启动&#xff0c;而是由事件来触发&#x…...

数据结构刷题训练:队列实现栈

目录 前言 1. 题目&#xff1a;使用队列实现栈 2. 思路 3. 分析 3.1 创建栈 3.2入栈 3.3 出栈 3.4 栈顶数据 3.5 判空和 “ 栈 ” 的销毁 4. 题解 总结 前言 我们已经学习了栈和队列&#xff0c;也都实现了它们各自的底层接口&#xff0c;那么接下我们就要开始栈和队列的专项刷…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...