搜索
首页运维Nginxnginx中怎么配置使用proxy protocol协议

nginx中怎么配置使用proxy protocol协议

May 18, 2023 am 08:47 AM
nginxproxyprotocol

    proxy protocol在nginx中应用

    我们知道nginx是一个web服务器和代理服务器,它一般工作在proxy server或者负载均衡软件(Haproxy,Amazon Elastic Load Balancer (ELB)的后面。

    首先,客户端向代理服务器或负载均衡软件发起请求,然后请求会被转发到nginx进行实际的web访问。

    因为经过了多层软件,所以客户端的一些信息比如ip地址,端口号等可能就会被隐藏,这对于我们问题分析,数据统计都是不利的。我们希望获得客户端真实的IP地址,以便获取准确的请求环境。

    这种情况下就需要用到PROXY protocol了。

    如果前面所说的proxy或者LSB都实现了PROXY protocol协议的话,不管是HTTP, SSL, HTTP/2, SPDY, WebSocket 还是 TCP协议,nginx都可以拿到客户端的原始IP地址,从而根据原始IP地址进行一些特殊的操作,比如屏蔽恶意IP的访问,根据IP不同展示不同的语言或者页面,或者更加简单的日志记录和统计等,都非常有效。

    当然,如果想要支持PROXY protocol,对nginx的版本也是有要求的,具体版本需求如下:

    • 想要支持PROXY protocol v2,需要NGINX Plus R16或者NGINX Open Source 1.13.11。

    • 想要支持ROXY protocol for HTTP,需要NGINX Plus R3或者NGINX Open Source 1.5.12。

    • 想要支持TCP client‑side PROXY protocol,需要NGINX Plus R7或者 NGINX Open Source 1.9.3。

    • 想要支持PROXY protocol for TCP,需要NGINX Plus R11 或者 NGINX Open Source 1.11.4。

    在nginx中可以通过下面的变量来获得对应的客户端信息,具体而言如下所示:

    $proxy_protocol_addr和$proxy_protocol_port 分别表示的是原始客户端的IP地址和端口号。

    $remote_addr 和 $remote_port表示的是load balancer的的IP地址和端口。

    如果你使用了RealIP扩展模块,那么这个模块会重写$remote_addr 和 $remote_port这两个值,将其替换成原始客户端的IP地址和端口号。

    然后使用$realip_remote_addr 和 $realip_remote_port来表示load balancer的的IP地址和端口。

    在RealIP扩展模块中,$proxy_protocol_addr和$proxy_protocol_port 表示的含义不变,还是原始客户端的IP地址和端口号。

    在nginx中配置使用proxy protocol

    上面我们提到了nginx中proxy protocol的基本应用,下面来讲一下如何在nginx中进行具体的配置。

    在nginx中启用proxy protocol

    如果你的nginx已经是支持proxy protocol的版本,那么启用proxy protocol非常简单,只需要在server中的listen中添加proxy_protocol即可,如下所示:

    http {
        #...
        server {
            listen 80   proxy_protocol;
            listen 443  ssl proxy_protocol;
            #...
        }
    }
       
    stream {
        #...
        server {
            listen 112233 proxy_protocol;
            #...
        }
    }

    大家比较熟悉的是http block,在nginx中,它表示对http/https的支持。Nginx提供了对TCP/UDP协议的支持,这一功能通过stream模块实现,对很多人来说比较陌生。

    通过上面的配置,nginx可以实现在tcp/udp协议和http/https协议同时支持proxy protocol。

    使用Real‑IP modules

    Real‑IP modules是nginx自带的一个模块,可以通过下面的命令来查看nginx是否有安装real-ip模块:

    nginx -V 2>&1 | grep -- 'http_realip_module'
    nginx -V 2>&1 | grep -- 'stream_realip_module'

    如果你当前使用的版本没有real ip,也不要急,这时候你可能需要从源代码进行编译。

    在编译的过程中,我们需要执行一个configure命令,在这个configure命令中可以指定要开启的功能,比如stream或者http_ssl_module:

    $ ./configure
    --sbin-path=/usr/local/nginx/nginx
    --conf-path=/usr/local/nginx/nginx.conf
    --pid-path=/usr/local/nginx/nginx.pid
    --with-pcre=../pcre-8.44
    --with-zlib=../zlib-1.2.11
    --with-http_ssl_module
    --with-stream
    --with-mail

    如果要开启real-ip功能,则可以添加:

    --with-http_realip_module

    如果nginx是运行在SLB或者proxy之后的,那么可以通过set_real_ip_from命令来指定代理或者负载均衡服务器的IP范围,如下所示:

    server {
        #...
        set_real_ip_from 192.168.1.0/24;
       #...
    }

    然后我们需要将proxy或者SLB的IP地址替换成为真实客户端的地址,那么可以这样使用:

    http {
        server {
            #...
            real_ip_header proxy_protocol;
          }
    }

    请求转发

    不管是http还是stream block,都可能遇到请求向后续的upstream进行转发的情况,对于upstream来说,他们希望收到的是真实客户端IP地址,而不是proxy或者slb的地址,那么可以通过下面的设置来解决:

    http {
        proxy_set_header X-Real-IP       $proxy_protocol_addr;
        proxy_set_header X-Forwarded-For $proxy_protocol_addr;
    }
    stream {
        server {
            listen 12345;
            proxy_pass example.com:12345;
            proxy_protocol on;
        }
    }

    http和stream的设置方式是不同的。

    日志记录

    日志是一个非常重要的功能,对于定位问题,执行数据统计分析都非常有用,当然我们需要的是真实的客户端IP地址。

    我们可以通过使用变量$proxy_protocol_addr在http和stream block中记录对应的日志,如下所示:

    http {
        #...
        log_format combined '$proxy_protocol_addr - $remote_user [$time_local] '
                            '"$request" $status $body_bytes_sent '
                            '"$http_referer" "$http_user_agent"';
    }
    stream {
        #...
        log_format basic '$proxy_protocol_addr - $remote_user [$time_local] '
                          '$protocol $status $bytes_sent $bytes_received '
                          '$session_time';
    }

    以上是nginx中怎么配置使用proxy protocol协议的详细内容。更多信息请关注PHP中文网其他相关文章!

    声明
    本文转载于:亿速云。如有侵权,请联系admin@php.cn删除
    NGINX单元与其他应用程序服务器NGINX单元与其他应用程序服务器Apr 24, 2025 am 12:14 AM

    NGINXUnit优于ApacheTomcat、Gunicorn和Node.js内置HTTP服务器,适用于多语言项目和动态配置需求。1)支持多种编程语言,2)提供动态配置重载,3)内置负载均衡功能,适合需要高扩展性和可靠性的项目。

    NGINX单元:架构及其工作原理NGINX单元:架构及其工作原理Apr 23, 2025 am 12:18 AM

    NGINXUnit通过其模块化架构和动态重配置功能提高了应用的性能和可管理性。1)模块化设计包括主控进程、路由器和应用进程,支持高效管理和扩展。2)动态重配置允许在运行时无缝更新配置,适用于CI/CD环境。3)多语言支持通过动态加载语言运行时实现,提升了开发灵活性。4)高性能通过事件驱动模型和异步I/O实现,即使在高并发下也保持高效。5)安全性通过隔离应用进程提高,减少应用间相互影响。

    使用NGINX单元:部署和管理应用程序使用NGINX单元:部署和管理应用程序Apr 22, 2025 am 12:06 AM

    NGINXUnit可用于部署和管理多种语言的应用。1)安装NGINXUnit。2)配置它以运行不同类型的应用,如Python和PHP。3)利用其动态配置功能进行应用管理。通过这些步骤,你可以高效地部署和管理应用,提升项目效率。

    NGINX与Apache:Web服务器的比较分析NGINX与Apache:Web服务器的比较分析Apr 21, 2025 am 12:08 AM

    NGINX更适合处理高并发连接,而Apache更适合需要复杂配置和模块扩展的场景。 1.NGINX以高性能和低资源消耗着称,适合高并发。 2.Apache以稳定性和丰富的模块扩展闻名,适合复杂配置需求。

    NGINX单元的优势:灵活性和性能NGINX单元的优势:灵活性和性能Apr 20, 2025 am 12:07 AM

    NGINXUnit通过其动态配置和高性能架构提升应用的灵活性和性能。1.动态配置允许在不重启服务器的情况下调整应用配置。2.高性能体现在事件驱动和非阻塞架构以及多进程模型上,能够高效处理并发连接和利用多核CPU。

    NGINX与Apache:性能,可伸缩性和效率NGINX与Apache:性能,可伸缩性和效率Apr 19, 2025 am 12:05 AM

    NGINX和Apache都是强大的Web服务器,各自在性能、可扩展性和效率上有独特的优势和不足。1)NGINX在处理静态内容和反向代理时表现出色,适合高并发场景。2)Apache在处理动态内容时表现更好,适合需要丰富模块支持的项目。选择服务器应根据项目需求和场景来决定。

    终极摊牌:nginx vs. apache终极摊牌:nginx vs. apacheApr 18, 2025 am 12:02 AM

    NGINX适合处理高并发请求,Apache适合需要复杂配置和功能扩展的场景。1.NGINX采用事件驱动、非阻塞架构,适用于高并发环境。2.Apache采用进程或线程模型,提供丰富的模块生态系统,适合复杂配置需求。

    nginx行动:示例和现实应用程序nginx行动:示例和现实应用程序Apr 17, 2025 am 12:18 AM

    NGINX可用于提升网站性能、安全性和可扩展性。1)作为反向代理和负载均衡器,NGINX可优化后端服务和分担流量。2)通过事件驱动和异步架构,NGINX高效处理高并发连接。3)配置文件允许灵活定义规则,如静态文件服务和负载均衡。4)优化建议包括启用Gzip压缩、使用缓存和调整worker进程。

    See all articles

    热AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智能驱动的应用程序,用于创建逼真的裸体照片

    AI Clothes Remover

    AI Clothes Remover

    用于从照片中去除衣服的在线人工智能工具。

    Undress AI Tool

    Undress AI Tool

    免费脱衣服图片

    Clothoff.io

    Clothoff.io

    AI脱衣机

    Video Face Swap

    Video Face Swap

    使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

    热工具

    mPDF

    mPDF

    mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

    VSCode Windows 64位 下载

    VSCode Windows 64位 下载

    微软推出的免费、功能强大的一款IDE编辑器

    记事本++7.3.1

    记事本++7.3.1

    好用且免费的代码编辑器

    PhpStorm Mac 版本

    PhpStorm Mac 版本

    最新(2018.2.1 )专业的PHP集成开发工具

    ZendStudio 13.5.1 Mac

    ZendStudio 13.5.1 Mac

    功能强大的PHP集成开发环境