nginx和proxy_protocol协议

目录

  • 1. 引言
  • 2. HTTP server的配置
  • 3. Stream server的配置
    • 3.1 作为proxy_protocol的前端服务器
    • 3.2 作为proxy_protocol的后端服务器

1. 引言

  proxy_protocol 是haproxy开发的一种用于在代理服务器和后端服务器之间传递客户端连接信息的协议。使用 proxy_protocol 的主要优势是能够准确地获取客户端的真实 IP 地址,而不受代理服务器的影响。这对于需要根据客户端 IP 地址进行访问控制、日志记录等操作的应用程序非常有用。目前有v1和v2两个版本。详细文件可以参见:https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt

  proxy_protocol协议在一些主流的服务器上面得到了广泛的应用,如tomcat、mariadb、apache、HAPROXY等等。本文要介绍如何在nginx中开启对proxy_protocol的支持。

  nginx对于proxy_protocol协议的支持在HTTP服务和Stream代理服务上面是不一样的。对于前者它只能作为后端服务,支持利用proxy_protocol协议来获取客户端的IP。而对于stream代理,它则是作为前端来发起proxy_protocol的握手的。

2. HTTP server的配置

  对于http协议下的典型架构如下图:

在这里插入图片描述

  其中负载均衡服务器负责封装proxy_protocol报文传递客户端的信息,nginx服务器负责解析proxy_protocol的协议信息来获取客户端的信息,而应用服务器可以有或者没有,对于静态内容可能就只要nginx提供服务就可以了,而动态内容则需要应用服务器来负责。

  下面是给nginx的HTTP服务开启proxy_protocol功能支持的配置,如下:

http {log_format combined '$proxy_protocol_addr - $remote_user [$time_local] ''"$request" $status $body_bytes_sent ''"$http_referer" "$http_user_agent"';#...server {server_name localhost;listen 80   proxy_protocol;listen 443  ssl proxy_protocol;ssl_certificate      /etc/nginx/ssl/public.example.com.pem;ssl_certificate_key  /etc/nginx/ssl/public.example.com.key;location /app/ {proxy_pass       http://backend1;proxy_set_header Host            $host;proxy_set_header X-Real-IP       $proxy_protocol_addr;proxy_set_header X-Forwarded-For $proxy_protocol_addr;}}
}

  其中两个listen语句中均添加了"proxy_protocol"的属性,表示对于监听的端口,在新建连接的时候会进行proxy_protocol协议的握手处理。
  对于下面这两行配置:

	proxy_set_header X-Real-IP       $proxy_protocol_addr;proxy_set_header X-Forwarded-For $proxy_protocol_addr;

  则用于告诉nginx在发起向后端应用服务器发起请求的时候,会在HTTP请求头中添加X-Real-IP和X-Forwarded-For两个请求头,并都设置其为通过解析Proxy protocol协议头中得到的客户端的真实地址“$proxy_protocol_addr"。

  最后,对于访问日志,也会记录客户端的真实IP地址,如下:

    log_format combined '$proxy_protocol_addr - $remote_user [$time_local] ''"$request" $status $body_bytes_sent ''"$http_referer" "$http_user_agent"';

  在访问日志的格式模板里面也设置了$proxy_protocol_addr 变量用来获取客户端的真实IP。

  至此,nginx就能够在收到http请求的时候首先进行proxy_protocol的握手。当然,在开启proxy_protocol协议支持的时候,请确保nginx的前端也同样配置了proxy_protocol协议,否则nginx会无法正好工作。
  这可以通过下面nginx源码得到证明:

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

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

相关文章

Linux上安装和使用Docker容器的指南

🍁 作者:知识浅谈,CSDN签约讲师,CSDN博客专家,华为云云享专家,阿里云专家博主 📌 擅长领域:全栈工程师、爬虫、ACM算法,大数据,深度学习 💒 公众号…

【ai】livekit服务本地开发模式1:example app信令交互详细流程

文档要安装git lfs 下载当前最新版本1.6.1windows版本:启动dev模式 服务器启动 (.venv) PS D:\XTRANS\pythonProject\LIVEKIT> cd .

python列表基本运算

列表基本运算 成员运算符 in 老师你在上课喊人回答问题的时候,就犯了难。想点的人名字已经脱口而出了,但发现这位同学没来。 可不,今天的课就来了 8 个人: students [林黛玉, 薛宝钗, 贾元春, 妙玉, 贾惜春, 王熙凤, 秦可卿,…

云WAF的负载均衡和流量分发功能

云WAF(Web Application Firewall)是一种专门设计来保护Web应用免受网络攻击的网络安全设备。它通过监控、过滤和阻止HTTP流量中的恶意攻击,确保Web应用的安全和可用性。云WAF的负载均衡和流量分发功能是其重要的特性之一,这些功能…

VS2022+QT5.15.2+MySQL8.4大集合

网上的教程都建议用Qt5,不要用6,不死心的尝试了整整一天失败了,乖乖用回5,qt5需要编译一下生成mysql的动态和静态库 1. mysql8.4安装 下载社区开发版,注意要64位 https://dev.mysql.com/downloads/mysql/ 配置一下数…

安卓SystemServer进程详解

目录 一、概述二、源码分析2.1 SystemServer fork流程分析2.1.1 [ZygoteInit.java] main()2.1.2 [ZygoteInit.java] forkSystemServer()2.1.3 [Zygote.java] forkSystemServer()2.1.4 [com_android_internal_os_Zygote.cpp]2.1.5 [com_android_internal_os_Zygote.cpp] ForkCom…

CANDela studio基础使用

ECU Information 可以修改ECU的名称 里面有个Supported Interfaces,可以在CDDT里面选择支持的通讯接口 可以在tools下面新建internface,也可以从其他CDDT文件里面复制过来,复制的时候注意要另外将里面的参数再复制一次。 也可以在这里点击新…

HTML与Python语法:深度探索与实用指南

HTML与Python语法:深度探索与实用指南 在编程领域,HTML和Python是两个截然不同的语言,各自在Web开发和数据分析等领域发挥着关键作用。然而,当这两者结合时,可以产生强大的效果。本文将分别从四个方面、五个方面、六个…

JavaScript基础知识2(常量、数据类型、类型转换、算术运算符优先级)

JavaScript基础知识2(常量、数据类型、类型转换、算术运算符优先级) 常量数据类型数值类型字符串类型模板字符串基本用法你的例子改写成模板字符串详细解释完整示例(使用模板字符串) 布尔类型undefined获取数据类型使用 typeof返回…

倪师哲学。能让我好,我就接受

还有有些人更搞笑的是,把自己的行为啊,建立在别人的基础之上,如果那个人么样对我,我肯定能怎么样对这个人。 生而为人呐,你是一个独立的人,不要去总是拿着各种各样的前提,来限制了自己个人的成长…

Python 时间戳转时间

一、 10 位 时间戳 ,秒级 转换为时间 方式一: import timetimeStamp 1717149862 timeArray time.localtime(timeStamp) timeStr time.strftime("%Y-%m-%d %H:%M:%S", timeArray) print(timeStr) 输出: 2024-05-31 18:04:22方式二&#xf…

打造你的专属Vue组件:超实用“手机号、邮箱、身份证号加密显示组件“实战

随着Web应用程序的发展,我们经常需要处理用户敏感信息,如手机号码和身份证号码。为了保护用户隐私,我们需要在前端对这些信息进行加密处理,以避免直接暴露在页面上。在这篇博客中,我们将介绍如何使用Vue 3.0单文件组件…

CATO原理中的数学与魔术(十一)——Parity Principle及其应用二:集合的可视化...

早点关注我,精彩不错过! 上篇文章中,我们已经进入了CATO原理魔术介绍的深水区,是第3个系列Parity Principle中集合性质的章节,聊到了关于张数和求和集合性质,并对性质之间的偏序关系,性质之间的…

USB - Linux Drivers介绍

在 Linux 中,USB 驱动程序子系统负责管理 USB 设备与操作系统之间的通信。下面概述了 Linux 中 USB 驱动程序子系统的组件和功能: USB 核心: USB 内核是 USB 驱动程序子系统的核心,它为 USB 通信提供了基本的基础设施。它负责设备…

three.js官方案例(animation / keyframes)webgl_animation_keyframes.html学习

目录 ​编辑 1 PMREMenerator 1.1 构造函数 1.2 fromScene方法 2 AnimationMixer 3 animal1.html全部 4 animal1.js全部 1 PMREMenerator 此类生成预过滤的 Mipmapped 辐射环境贴图 (PMREM) 来自 cubeMap 环境纹理。这允许不同的级别 的模糊&…

GPTQ 量化大模型

GPTQ 量化大模型 GPTQ 算法 GPTQ 算法由 Frantar 等人 (2023) 提出,它从 OBQ 方法中汲取灵感,但进行了重大改进,可以将其扩展到(非常)大型的语言模型。 步骤 1:任意顺序量化 OBQ 方法选择权重按特定顺序…

桶形畸变和枕形畸变

桶形畸变和枕形畸变是两种常见的光学畸变现象,主要发生在使用广角镜头或远摄镜头拍摄时。这些畸变是因为镜头的光学特性不能完美地将光线汇聚到一个共同的焦点上,导致图像的不同部分在形状上发生扭曲。下面分别对这两种畸变进行详细描述: 桶…

快手万合通脚本,磁力广告挂机变现项目,号称单窗口日收益10+(教程+软件)

在这个项目中,我们采用一种简便的方法来获取额外收入。比如: 1. 主账号准备:首先,确保拥有一个已开通磁力万合功能的快手主账号。账号需拥有至少一万粉丝,以确保广告收益。 2. 创建快手小号:无需粉丝基础…

每日一题《leetcode--LCR 021.删除链表的倒数第N个结点》

https://leetcode.cn/problems/SLwz0R/ 这道题我们可以设一个哨兵位,然后把要遍历链表的结点指向该哨兵位。最后用for循环将指针指向要删除结点的前一个。 struct ListNode* removeNthFromEnd(struct ListNode* head, int n){struct ListNode* dummy malloc(sizeof…

什么是成就动机?如何判断人的成就动机?

什么是成就动机? 成就动机指的是一个人追求成就的心理,对成就(成绩,目标)的渴望心理,成就动机促进我们实现个人价值,完成工作当中的任务,始终被成就动机驱使的人往往懂得吃苦耐劳&a…