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源码得到证明:


                

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

系统架构设计师【第15章】: 面向服务架构设计理论与实践 (核心总结)

文章目录 15.1 SOA的相关概念15.1.1 SOA的定义15.1.2 业务流程与BPEL 15.2 SOA的发展历史15.2.1 SOA的发展历史15.2.2 国内SOA的发展现状与国外对比15.2.3 SOA的微服务化发展 15.3 SOA的参考架构15.4 SOA主要协议和规范15.4.1 UDDI协议15.4.2 WSDL规范15.4.3 SOAP协…

子域名太多如何实现HTTPS?一张通配符SSL证书全搞定

在当今数字化时代,网站安全性已经成为网站运营者以及访问者都非常关注的重要问题。部署SSL证书实现HTTPS加密,确保数据传输安全,防止信息被泄露或篡改,消除浏览器“不安全”提示,提高网站安全性以及可信任度已成为必然…

代理IP如何提高网站的SEO排名

目录 一、代理IP的作用 二、使用代理IP提高SEO排名的几种常见方法 1. 采集数据 2. 提交网站 3. 模拟用户行为 4. 搜索引擎优化 三、合理使用代理IP的注意事项 四、代码示例 总结 代理IP是一种可以隐藏真实IP地址的技术,通过使用代理IP,可以实现…

记一次mysql索引优化

生产日志告警出现一条慢 sql 告警, 通过 sql 监控平台拿到 这条sql 语句是 : SELECTid,report_id,report_detail_id,item_code,report_type,photo FROM**** 表 WHEREdel_flag 0 AND (report_type 1 AND report_detail_id IN ( 1742 )) 之后用 explain 分析这条 sql 的命中…

前端框架前置知识之Node.js:Node.js入门

前端程序员有必要学 Node.js 吗?要学到什么程度? 小朋友,你是否有很多问号? 对于node.js,不知道你是否和我一样有很多问号? 其实在学习node.js之前,我已经学完了Vue框架,而且已经…

cad怎么一键闭合所有线

在CAD软件中,将断开的图形快速闭合为一个整体是一项常见且实用的操作。下面详细介绍几种不同的方法来实现一键闭合所有线: 使用圆角命令FILLET 输入命令:在CAD命令行中输入“FILLET”(快捷键:F)。多选模式&…

122. 买卖股票的最佳时机 II(中等)

122. 买卖股票的最佳时机 II 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转:122. 买卖股票的最佳时机 II 2.详细题解 实现最大的利润,即只要有盈利就收入囊中,由于交易没有具体限制次数,因此可以依…

若依开发-数据库修改密码

若依忘记密码 在SecurityUtils类添加 public static void main(String[] args) {System.out.println(SecurityUtils.encryptPassword("admin123"));}即可打印出加密后密码

视频汇聚共享平台LntonCVS安防视频监控系统搭建医院医疗监控统一管理方案

近年来,一些不法分子已经将其罪恶活动延伸到医院,严重威胁了医院和病人的生命财产安全。这些不法分子使用扒窃、抢劫和破坏等卑劣手段扰乱了医院的工作秩序,窃取他人财物并破坏社会治安。鉴于此,社会对良好的医院环境给予了广泛关…

订单排队新纪元:创新营销模式引领企业腾飞

在当今高度竞争的商业环境中,如何以新颖的方式吸引用户并推动企业持续盈利?接下来,我们将探讨一种独特的营销策略——循环订单机制,帮助企业家们巧妙抓住市场机遇,实现业绩飞跃。 循环订单机制,作为一种创新…

查询语言:ClickHouse的SQL基础与特点

1.背景介绍 查询语言:ClickHouse的SQL基础与特点 作者:禅与计算机程序设計艺術 1. 背景介绍 1.1 ClickHouse简介 ClickHouse是Yandex开源的一个高性能分布式 column-oriented DBSMS (Column-based Distributed SQL Management System),它…

关于软件<PDF文档管理系统V1.0>的介绍

<PDF文档管理系统V1.0>&#xff08;下载地址在最下面&#xff09;是我在2023年发布的<知识辅助系统>的改善以及重新开发版本&#xff0c;软件在重新开发提供了<知识辅助系统>的所有功能的基础上&#xff0c;添加了一些新的功能。软件尽量提供简单、实用的功能…

你还不知道的APP安全测试项总结!

一、安装包测试 1.1、关于反编译 目的是为了保护公司的知识产权和安全方面的考虑等&#xff0c;一些程序开发人员会在源码中硬编码一些敏感信息&#xff0c;如密码。而且若程序内部一些设计欠佳的逻辑&#xff0c;也可能隐含漏洞&#xff0c;一旦源码泄漏&#xff0c;安全隐患…

Linux驱动开发笔记(三)平台设备驱动

文章目录 前言一、Linux的设备模型1. 总线1.1 bus_type结构体1.2 注册/注销总线 2. 设备2.1 device结构体2.2 内核注册/注销设备 3. 驱动3.1 device_driver结构体3.2 注册/注销驱动 4. attribute属性文件4.1 attribute_group结构体4.2 设备属性文件4.3 驱动属性文件4.3. 总线属…

构建高可用微服务:SpringCloud Alibaba解决方案揭秘

【前言】 随着互联网的快速发展,越来越多的企业在应用程序开发过程中选择微服务架构。微服务架构是将一个大型应用程序拆分成多个小型服务的架构模式,每个服务都具有独立的业务逻辑,并且可以独立部署、升级和扩展。 Spring Cloud Alibaba 是阿里巴巴基于 Spring Cloud 开发…

【matlab】绘图文本标注

用代码生成标注 代码 clc clear close all%创建一个球&#xff0c;使用地质颜色映射表&#xff1a; cla reset%清除当前坐标轴中的所有图像对象,同时把除position.units属性外的其他属性设为默认状态 load topo; [x y z]sphere (45); ssurface (x,y, z,facecolor,texturemap,…

深入理解feign远程调用的各种超时参数

1. 引言 在spring cloud微服中&#xff0c;feign远程调用可能是大家每天都接触到东西&#xff0c;但很多同学却没咋搞清楚这里边的各种超时问题&#xff0c;生产环境可能会蹦出各种奇怪的问题。 首先说下结论&#xff1a; 1)只使用feign组件&#xff0c;不使用ribbion组件&…

超强算力 Orange Pi Kunpeng Pro 开发板基础测评与体验

目录 开箱体验资源简介系统启动连接网络登录系统通过桌面登录通过串口登录通过 SSH 登录配置散热风扇 算力测试MNIST示例MBNET示例 体验总结 大家好&#xff0c;我是 Hello 阿尔法&#xff0c;有幸接到 CSDN 的邀请参与 Orange Pi Kunpeng Pro 开发板的测评活动&#xff0c;本文…

图片怎么快速转换大小?在线将图片改小的方法

目前在网上平台上传图片时&#xff0c;比较常见的一个问题就是图片太大导致无法正常上传&#xff0c;需要调整图片大小到平台的要求后才可以正常使用。那么如何将图片压缩到需要使用的大小呢&#xff1f; 图片大小转换现在可以使用在线改图片大小的工具会更加的简单的快捷&…

贝锐向日葵分组策略:减少重复操作,提升管理效率

面对大数量级的IT设备&#xff0c;如何高效实施管理是运维的关键所在&#xff0c;如何快速准确的对大量的设备按需分组&#xff0c;则是管理精准触达的第一步。 但是&#xff0c;传统的分组方式应付少量设备还可行&#xff0c;设备数量级一旦来到上千台甚至更多时&#xff0c;…