侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

使用AWS的ELB服务时为Nginx启用代理协议的步骤讲解

linux  /  管理员 发布于 7年前   211

在使用aws云服务的时候,90%要使用ELB服务作为负载均衡的解决方案,使用ELB要比自己搭建负载均衡要方便得多。
  主要好处有:
  1.可以随时监控实例的健康状态;
  2.当服务器不正常时,ELB的报警策略将自动发送邮件通知运维人员
  3.当服务器负载到达阈值时,通过auto scanning将自动加入新的服务器到集群中,同时负载降下去后将自动关闭多余的实例
  4.ELB的各项监控指标较好地帮助判断服务器性能

AWS ELB nginx 启用代理协议
要使用aws elb服务器来做websocket负载均衡时,只能使用tcp模式。
代理协议是一种 Internet 协议,用于将连接信息从请求连接的源传递到请求连接到的目标。Elastic Load Balancing 使用代理协议版本 1,该版本使用用户可读的标头格式。
默认情况下,当对前端和后端连接使用传输控制协议 (TCP) 或安全套接字层 (SSL) 时,您的负载均衡器会将请求转发到后端实例,而不修改请求标头。如果您启用代理协议,则会向请求标头添加一个用户可读的标头,其中包含连接信息(如源 IP 地址、目标 IP 地址和端口号)。该标头随后作为请求的一部分发送到后端实例。
您可以在使用 SSL 和 TCP 协议的端口上启用代理协议。当使用非 HTTP 协议时,或者当使用 HTTPS 并且未在负载均衡器上终止 SSL 连接时,您可以使用代理协议捕获客户端的源 IP。
代理协议头
在您使用为 TCP/SSL 连接配置的负载均衡器时,代理协议标头有助于识别客户端的 IP 地址。因为负载均衡器会拦截客户端与您的后端实例之间的流量,因此您的后端实例的访问日志中将包含负载均衡器的 IP 地址而不是原始客户端的 IP 地址。您可以分析该请求的第一行,以检索该客户端的 IP 地址和端口号。
IPv6 标头中的代理地址是负载均衡器的公有 IPv6 地址。此 IPv6 地址与从该负载均衡器以 ipv6 或 dualstack 开头的 DNS 名称解析而来的 IP 地址相匹配。如果客户端使用 IPv4 进行连接,则代理标头中的地址是该负载均衡器的私有 IPv4 地址,不能在 EC2-Classic 网络外部通过 DNS 查找进行解析。
该代理协议行以回车符和换行符 ("\r\n") 结束,且具有以下形式:

PROXY_STRING + single space + INET_PROTOCOL + single space + CLIENT_IP + single space + PROXY_IP + single space + CLIENT_PORT + single space + PROXY_PORT + "\r\n"

实例:

PROXY TCP4 198.51.100.22 203.0.113.7 35646 80\r\n

安装AWS CLI工具
AWS 管理控制台是不支持启用代理协议的,因此需要通过命令行来启用。

# sudo apt-get install python-pip# sudo pip install awscli

配置授权连接参数文件。

# sudo vi ~/.aws/config
[default]aws_access_key_id = YOU_ACCESS_IDaws_secret_access_key = YOU_SECRET_IDoutput = json OR bson OR textregion = PREFERRED_AWS_REGION

类似这样的,aws_access_key_id、aws_secret_access_key、region根据你的aws实例填写。
AWS ELB启用代理协议
查看ELB支持的策略。响应包含支持的策略类型的名称和描述。

# aws elb describe-load-balancer-policy-types{  "PolicyTypeDescriptions": [    ...    {      "PolicyAttributeTypeDescriptions": [        {          "Cardinality": "ONE",          "AttributeName": "ProxyProtocol",          "AttributeType": "Boolean"        }      ],      "PolicyTypeName": "ProxyProtocolPolicyType",      "Description": "Policy that controls whether to include the IP address and port of the originating request for TCP messages. This policy operates on TCP/SSL listeners only"    },    ...  ]}

创建启用代理协议的策略

# aws elb create-load-balancer-policy --load-balancer-name YOU_ELB_NAME --policy-name EnableProxyProtocol --policy-type-name ProxyProtocolPolicyType --policy-attributes AttributeName=ProxyProtocol,AttributeValue=True

该命令创建了一个名称为EnableProxyProtocol的策略,并分配下列ELB属性"AttributeName=ProxyProtocol & AttributeValue=True"。
在指定端口上启用上述的策略

# aws elb set-load-balancer-policies-for-backend-server --load-balancer-name YOU_ELB_NAME --instance-port 80 --policy-names EnableProxyProtocol# aws elb set-load-balancer-policies-for-backend-server --load-balancer-name YOU_ELB_NAME --instance-port 81 --policy-names EnableProxyProtocol# aws elb set-load-balancer-policies-for-backend-server --load-balancer-name YOU_ELB_NAME --instance-port 443 --policy-names EnableProxyProtocol

此命令将替代当前已启用的策略组。因此,--policy-names 选项必须同时指定您正在添加到列表中的策略和任何当前已启用的策略。
查看是否启用

# aws elb describe-load-balancers --load-balancer-name YOU_ELB_NAME | jq '.LoadBalancerDescriptions[].BackendServerDescriptions'[ {  "PolicyNames": [   "EnableProxyProtocol"  ],  "InstancePort": 80 }, {  "PolicyNames": [   "EnableProxyProtocol"  ],  "InstancePort": 81 }, {  "PolicyNames": [   "EnableProxyProtocol"  ],  "InstancePort": 443 }]

如果要禁用代理协议可以这么做,同时,可通过第4步查看是否禁用了。

# aws elb set-load-balancer-policies-for-backend-server --load-balancer-name YOU_ELB_NAME --instance-port 80 --policy-names "[]"

配置nginx接受代理协议头
nginx启用这个主要的目的是为了获取到真实的客户端IP地址。否则,都是ELB的内网IP地址。

set_real_ip_from 127.0.0.1;set_real_ip_from 10.0.0.0/8;real_ip_header  proxy_protocol;real_ip_recursive on;server {  listen 80 proxy_protocol;  listen 443 proxy_protocol ssl;...  location / {   proxy_set_header Host        $host;   proxy_set_header X-Real-IP      $proxy_protocol_addr;   proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;   proxy_set_header X-Forwarded-Proto  tcp;   proxy_set_header X-NginX-Proxy    true;...}set_real_ip_from 127.0.0.1;set_real_ip_from 10.0.0.0/8;real_ip_header  proxy_protocol;real_ip_recursive on; server {  listen 80 proxy_protocol;  listen 443 proxy_protocol ssl;...  location / {   proxy_set_header Host        $host;   proxy_set_header X-Real-IP      $proxy_protocol_addr;   proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;   proxy_set_header X-Forwarded-Proto  tcp;   proxy_set_header X-NginX-Proxy    true;...}

当nginx启用了代理协议,$proxy_protocol_addr变量将是真实的客户端IP。
如果没有反代,nginx这么配置即可:

log_format elb_log '$proxy_protocol_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent "$http_referer" ' '"$http_user_agent"'; set_real_ip_from 172.31.0.0/20;set_real_ip_from 10.0.0.0/8;real_ip_header proxy_protocol;


  • 上一条:
    Nginx服务器中的模块编写及相关内核源码初探
    下一条:
    IIS Gzip缓存文件一键批量删除的方法(bat)
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在Linux系统中使用Iptables实现流量转发功能流程步骤(0个评论)
    • vim学习笔记-入门级需要了解的一些快捷键(0个评论)
    • 在centos7系统中实现分区并格式化挂载一块硬盘到/data目录流程步骤(0个评论)
    • 在Linux系统种查看某一个进程所占用的内存命令(0个评论)
    • Linux中grep命令中的10种高级用法浅析(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-11
    • 2017-07
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-03
    • 2022-04
    • 2022-08
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-06
    • 2023-07
    • 2023-10
    • 2023-12
    • 2024-01
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客