深入理解ngx_http_proxy_connect_module模块(上)

目录

  • 1. 缘起
  • 2. 分析验证环境的配置
  • 3. 配置指令
    • 3.1 proxy_connect
    • 3.2 proxy_connect_allow
    • 3.3 proxy_connect_connect_timeout
    • 3.4 proxy_connect_read_timeout
    • 3.5 proxy_connect_send_timeout
    • 3.6 proxy_connect_address
    • 3.7 proxy_connect_bind
    • 3.8 proxy_connect_response
    • 3.9 proxy_connect_send_lowat
  • 4. 变量
    • 4.1 $connect_host
    • 4.2 $connect_port
    • 4.3 $connect_addr
    • 4.4 $proxy_connect_connect_timeout
    • 4.5 $proxy_connect_read_timeout
    • 4.6 $proxy_connect_send_timeout
    • 4.7 proxy_connect_response
    • 4.8 proxy_connect_resolve_time
    • 4.9 proxy_connect_connect_time
    • 4.10 proxy_connect_first_byte_time

1. 缘起

  在用nginx正向代理https网站中,了解到如果需要用nginx做正向代理,来支持https的代理,如果nginx不作用ssl的terminator(ssl终结点),那么可行的办法就是用http协议支持的CONNECT请求来构建client->nginx, nginx->rs 之间的连接通道,由于官方原生的nginx是不支持CONNECT请求的,所以需要用到tengine上的ngx_http_proxy_connect_module模块,并且需要对原生nginx打上相应的补丁。本文就对ngx_http_proxy_connect_module模块的实现原理从源码层面来进行一个详细的分析。本文分为上下两部分,上部分主要从配置指令和模块内置变量来说明模块如何使用,下部分主要从源码的层面来进行详细分析。

2. 分析验证环境的配置

  在用nginx正向代理https网站中已经有详细的描述,这里不再赘述。

3. 配置指令

   接下来对ngx_http_proxy_connect_module模块支持的配置指令进行说明。

3.1 proxy_connect

指  令: proxy_connect
默认值: none
上下文: server功能描述: 开启对HTTP方法"CONNECT"的支持。

3.2 proxy_connect_allow

指  令: proxy_connect_allow all | [port ...] | [port-range ...]
默认值: 443 563
上下文: server功能描述:指定允许开启CONNECT方法的端口。  默认情况下,只有443和563端口被允许。使用如下参数来修改默认行为:all值允许所有端口。port指定允许的特定端口。port-range指定允许的指定端口范围,示例:proxy_connect_allow 1000-2000 3000-4000; # 允许端口范围1000-2000 和 3000-4000

3.3 proxy_connect_connect_timeout

指  令: proxy_connect_connect_timeout time  
默认值: none 
上下文: main, server功能描述: 指定与对端服务器建联的超时时间,单位y/M/w/d/h/m/s。

3.4 proxy_connect_read_timeout

指  令: proxy_connect_read_timeout time
默认值: 60s
上下文: main, server功能描述: 指定读对端服务器数据的等待时间。超时时间仅在两次读数据之间生效,而不是整个应答数据时间。如果对端服务器在超时时间内未发送任何数据,连接将被关闭。

3.5 proxy_connect_send_timeout

指  令: proxy_connect_send_timeout time  
默认值: 60s 
上下文: server功能描述: 指定发送数据到对端服务器的等待时间。  超时时间仅在两次发送数据之间生效,而不是整个请求时间。  如果对端服务器在等待时间内未收取任何数据,连接将被关闭。

3.6 proxy_connect_address

指  令: proxy_connect_address address | off  
默认值: none
上下文: main, server功能描述: 指定对端服务器的地址。该值可以包含变量。  值`off`或者不设置该指令,则对端服务器的地址是通过CONNECT请求行的host字段提取并解析(如查询DNS)出来得到。

3.7 proxy_connect_bind

指  令: proxy_connect_bind address [transparent] | off  
默认值: none 
上下文: main, server功能描述: 指定与对端服务器的连接的来源地址。  该值可以包含变量。值"off"或者不设置该指令将由系统自动分配来源地址和端口。"transparent"参数值使与对端服务器的连接的来源地址为非本地地址。示例如下(使用客户端地址作为来源地址):proxy_connect_bind $remote_addr transparent;为了使`transparent`参数生效,需要配置内核路由表去截获来自对端服务器的网络流量。

3.8 proxy_connect_response

指  令: proxy_connect_response  response
默认值: none 
上下文: main, server功能描述: 指定和上游服务器连接成功后,给客户端发回的HTTP响应内容,该响应内容应该符合HTTP协议规范并包括HTTP响应头的信息,本指令可以包含动态变量,示例如下:proxy_connect_response "HTTP/1.1 200 Connection Established\r\n
Proxy-agent: nginx\r\n\r\nCONNECT OK, Upstream addrress: $connect_addr"

3.9 proxy_connect_send_lowat

指  令: proxy_connect_send_lowat  byte
默认值: 0 
上下文: main, server功能描述: 控制发送缓冲区中的数据量,可用单位Kk/Mm/Gg:示例如下:proxy_connect_send_lowat 1024;

4. 变量

  ngx_http_proxy_connect_module模块也提供了若干动态变量,关于动态变量的原理可以查看[[深入理解nginx的动态变量机制]]。

4.1 $connect_host

只读变量,用于获取CONNECT请求行的主机名(host)字段。

4.2 $connect_port

只读变量,用于获取CONNECT请求行的端口(port)字段。

4.3 $connect_addr

只读变量,用于获取上游服务器的IP地址和端口,如"192.168.1.5:12345"。

4.4 $proxy_connect_connect_timeout

可写变量, 用于获取和设置proxy_connect_connect_timeout指令的超时时间。

4.5 $proxy_connect_read_timeout

可写变量, 用于获取和设置proxy_connect_read_timeout指令的超时时间。

4.6 $proxy_connect_send_timeout

可写变量, 用于获取和设置proxy_connect_send_timeout指令的超时时间。

4.7 proxy_connect_response

可写变量,用于获取和设置proxy_connect_response指令设置的给客户端的响应内容。

4.8 proxy_connect_resolve_time

只读变量,用于获取实际进行域名解析所花的时间,单位: ms。

4.9 proxy_connect_connect_time

只读变量,用于获取实际从开始发起连接请求到连接建立所花的时间,单位: ms。

4.10 proxy_connect_first_byte_time

只读变量,用于获取从开始发起连接请求到收到从上游服务器发送过来的第一个字节所花的时间,单位: ms。

未完待续:深入理解ngx_http_proxy_connect_module模块(下)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/706564.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

弱结构化日志 Flink SQL 怎么写?SLS SPL 来帮忙

作者:潘伟龙(豁朗) 背景 日志服务 SLS 是云原生观测与分析平台,为 Log、Metric、Trace 等数据提供大规模、低成本、实时的平台化服务,基于日志服务的便捷的数据接入能力,可以将系统日志、业务日志等接入 …

《PCI Express体系结构导读》随记 —— 第II篇 第10章 MSI和MSI-X中断机制(1)

前言中曾提到:本章重点介绍MSI和MSI-X。 在PCI总线中,所有需要提交中断请求的设备,必须能够通过INTx引脚提交中断请求,而MSI机制是一个可选机制;而在PCIe总线中,PCIe设备必须支持MSI或者MSI-X中断请求机制&…

10.selenium的基本使用

selenium是一个关于爬虫功能python的库,它的整体逻辑与之前的请求爬虫思路不同。selenium是模拟出一个浏览器,你通过代码操作这个浏览器从而获取一些信息,比如执行click()就相当于点击了浏览器中的某个元素,相当于是针对浏览器的鼠…

PyTorch张量运算

诸神缄默不语-个人CSDN博文目录 在深度学习领域,张量是一种非常核心的数据结构,它是标量、向量和矩阵等数学概念的高维扩展。PyTorch作为一款流行的深度学习框架,提供了丰富的张量操作API,帮助研究人员和开发者有效地实现复杂的数…

一款开源.NET WPF界面库介绍

一款开源.NET WPF界面库介绍 这是一个WPF版的Layui前端UI样式库,该控件库参考了Web版本的LayUI风格,利用该控件库可以完成现代化UI客户端程序,让你的客户端看起来更加简洁丰富又不失美感 如何使用 步骤一 : 添加LayUI.Wpf Nuget包; Inst…

物联网APP开发:技术、挑战与前景

随着科技的快速发展,物联网(IoT)已经成为当今世界的重要趋势。物联网是将物理世界的各种“事物”与互联网连接起来,通过智能设备、传感器和执行器实现数据的收集、交换和处理,以改善生活和工作的方式。物联网APP是实现…

关于大数据学习之hadoop的安装

前部安装提示: 建议先将电脑中基础内容进行清洁,维持基础的极简主义, 通过这样的方式可以快速帮助我们完成软件的安装,同时也是符合计算机的基础网络结构, 什么是hadoop? 处理大数据的分布式存储和计算框…

LeetCode_Java_动态规划系列(3)(题目+思路+代码)

338.比特位计数 给你一个整数 n &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 class Solution {public int[] countBits(int n) {/** 思路&#xff1a;* 1.创建一个长度为 n…

pr2024 Premiere Pro 2024 mac v24.2.1中文激活版

Premiere Pro 2024 for Mac是Adobe公司推出的一款强大的视频编辑软件&#xff0c;专为Mac操作系统优化。它提供了丰富的剪辑工具、特效和音频处理选项&#xff0c;帮助用户轻松创建专业级的影视作品。 软件下载&#xff1a;pr2024 Premiere Pro 2024 mac v24.2.1中文激活版 无论…

java高级——反射

目录 反射概述反射的使用获取class对象的三种方式反射获取类的构造器1. 获取类中所有的构造器2. 获取单个构造器 反射获取构造器的作用反射获取成员变量反射变量赋值、取值获取类的成员方法反射对象类方法执行 反射简易框架案例案例需求实现步骤代码如下 反射概述 什么是反射 反…

【学习总结】什么是弹性负载均衡? LB和ELB的区别

[Q&A] 什么是 LB (Load Balancer) 负载均衡器&#xff1a; 这是一个广泛的概念&#xff0c;泛指任何用于在网络流量进入时进行分配以实现服务器集群间负载均衡的设备或服务。传统的负载均衡器可以是硬件设备&#xff0c;也可以是软件解决方案&#xff0c;其基本目标是将客…

关于Vue中npm install出现报错及解决方法

在Vue项目开发过程中&#xff0c;我们经常会使用npm工具来安装项目所需的依赖包。然而&#xff0c;有时候在执行npm install命令时会遇到各种报错&#xff0c;这可能会影响项目的正常开发和运行。本教程将介绍一些常见的npm install报错及其解决方法&#xff0c;帮助开发者更好…

利用 ChatGPT 提升个人工作、生活品质

利用 ChatGPT 提升个人工作、生活品质和个人智慧是一个多方面而又切实可行的方法。 以下是一些具体的建议&#xff1a; 获取信息和知识&#xff1a; ChatGPT 可以回答各种问题并提供相关信息和知识。你可以利用它来查询工作中遇到的问题、学习新的知识领域或是获取日常生活中的…

【JSON2WEB】06 JSON2WEB前端框架搭建

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 前端技术路线太多了&#xff0c;知识点更多&…

HC32F460 是否有 RTC?在电池供电方案中该如何使用?

[技术问答]HC32F460 是否有 RTC&#xff1f;在电池供电方案中该如何使用&#xff1f;_hc32f460 rtc-CSDN博客 华大HC32A460 系列介绍&#xff08;三&#xff09;_华大单片机内部温度传感器-CSDN博客 HC32F460PETB-LQFP100-华大半导体有限公司 [【HC32F460开发板测评】&#xf…

8.题目:编号191 特别数的和

###这道题主要考察枚举 #include<bits/stdc.h> using namespace std; bool f(int x){while(x){int yx%10;if(y2||y0||y1||y9){return true;}x/10;}return false; } int main(){int n;cin>>n;int ans0;for(int i1;i<n;i){if(f(i)){ansi;}}cout<<ans<&…

【Redis 常见的5种数据类型】List | Set | Zset

文章目录 [toc] 1 :peach:List:peach:1.1 :apple:lpush:apple:1.2 :apple:lpushx:apple:1.3 :apple:rpush:apple:1.4 :apple:rpushx:apple:1.5 :apple:lrange:apple:1.6 :apple:lpop:apple:1.7 :apple:rpop:apple:1.8 :apple:lindex:apple:1.9 :apple:linsert:apple:1.10 :appl…

QT摄像头采集

主界面为显示框&#xff0c;两个下拉框&#xff0c;一个是所有相机&#xff0c;一个是相机支持的分辨率 系统根据UI界面自动生成的部分不再描述&#xff0c;以下为其他部分源码 widget.h #include <QWidget> #include <QMouseEvent> class QCamera; class QCamer…

阿里云ECS服务器vCPU是什么意思?

阿里云ECS服务器vCPU和CPU是什么意思&#xff1f;CPU和vCPU有什么区别&#xff1f;一台云服务器ECS实例的CPU选项由CPU物理核心数和每核线程数决定&#xff0c;CPU是中央处理器&#xff0c;一个CPU可以包含若干个物理核&#xff0c;通过超线程HT&#xff08;Hyper-Threading&am…

Linux——静态库

Linux——静态库 静态库分析一下 ar指令生成静态库静态库的使用第三方库优化一下 gcc -I(大写的i) -L -l(小写的l)&#xff0c;头文件搜索路径&#xff0c;库文件搜索路径&#xff0c;连接库 今天我们来学习静态库的基本知识。 静态库 在了解静态库之前&#xff0c;我们首先来…