Nginx接收PROXY协议

1    介绍

PROXY协议使Nginx接收客户端连接信息通过代理服务器和负载均衡器传入,例如HAproxy和亚马逊Elastic负载均衡器(SLB)。

通过PROXY协议传入的是客户端IP地址,代理服务器IP地址和端口号。知道客户端原始IP地址可能对特定语言的网站、保存IP黑名单或只记录和统计目的是有用的。

使用PROXY协议,Nginx能从SSL、HTTP/2、SPDY、WebSocket和TCP学习原始IP地址。

2    使用SSL、HTTP/2、SPDY和WebSocket的PROXY协议

为了使Nginx接收SSL、HTTP/2、SPDY和WebSocket的PROXY协议,在http级别上做以下改变:

  • 配置Nginx接收PROXY协议头。添加proxy_protocol参数到listen指令:

server {

    listen 80   proxy_protocol;

    listen 443  ssl proxy_protocol;

    ...

}

  • 在set_real_ip_from指令,指定IP地址或TCP代理或负载均衡器的CIDR方位地址:

server {

    ...

    set_real_ip_from 192.168.1.0/24;

    ...

}

  • 在real_ip_header指令,添加proxy_protocol参数保存客户端IP地址和端口号: 

server {

    ...

    real_ip_header proxy_protocol;

}

  • 使用proxy_set_header指令和$proxy_protocol_addr变量从Nginx传入客户端IP地址到upstream服务器:

proxy_set_header X-Real-IP       $proxy_protocol_addr;

proxy_set_header X-Forwarded-For $proxy_protocol_addr;

  • 添加$proxy_protocol_addr变量到http级别的log_format指令 

 http {

    ...

    log_format combined '$proxy_protocol_addr - $remote_user [$time_local] '

                        '"$request" $status $body_bytes_sent '

                        '"$http_referer" "$http_user_agent"';

}

3    使用PROXY协议和TCP流

Nginx能为TCP流传入PROXY协议数据。

在Nginx配置文件中,在stream级别的server块中包括proxy_protocol指令:

stream {

    server {

        listen 12345;

        proxy_pass example.com:12345;

        proxy_protocol on;

    }

}

4    完整例子

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;

 

        set_real_ip_from 192.168.1.0/24;

        real_ip_header   proxy_protocol;

 

        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;

        }

    }

}

 

stream {

...

    server {

        listen         12345;

        proxy_pass     example.com:12345;

        proxy_protocol on;

    }

 

}

转载于:https://my.oschina.net/leeck/blog/729498

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值