【问题标题】:Nginx catch "broken header" when listening to proxy_protocolNginx 在监听 proxy_protocol 时捕获“损坏的标头”
【发布时间】:2015-10-28 08:33:37
【问题描述】:

我需要在启用代理协议的情况下对 Elastic Beanstalk 应用程序使用 http 运行状况检查。目前这是不可能的,并且健康检查失败并出现错误 --> *58 broken header while reading PROXY protocol

我想我有两个选择

  1. 在另一个端口上执行健康检查,并设置 nginx 以侦听该端口上的 http 请求并代理到我的应用程序。
  2. 如果可以捕获broken header 错误,或在proxy_protocol 服务器块中检测到常规http 请求,则将这些请求重定向到侦听http 的端口。

如果可能的话,我更喜欢后者(#2)。那么有没有办法做到这一点呢?

理想情况下,我宁愿不必这样做。解决此问题的 feature request 已提交给 AWS,但它没有 ETA。

【问题讨论】:

    标签: nginx proxy


    【解决方案1】:

    The proxy protocol specification 说:

    必须将接收器配置为仅接收本文中描述的协议 规范并且不得尝试猜测协议头是否存在 或不。这意味着该协议明确禁止在 公共和私人访问。否则,它将打开一个重大的安全漏洞 允许不受信任的各方欺骗他们的连接地址。

    我认为这意味着选项 2 是一个非常糟糕的主意,它甚至不被符合代理协议的实现所支持。

    另一方面,选项 1 似乎很合理。您可以设置一个安全组,以便在未启用代理协议的情况下,只有合法的健康检查才能进入端口。

    另外几个选项也浮现在脑海中:

    1. 只需将您的健康检查指向添加标头的对象(即 ELB?),而不是直接指向您的 Nginx 实例。不确定这是否可以通过 Elastic Beanstalk 实现,这不是我使用的服务。

    2. 在将运行状况检查流量转发到 Nginx 之前,使用其他东西添加代理协议标头,这样可以避免复制 Nginx 配置。例如,与 Nginx 在同一台机器上运行的 HAProxy 可以做到这一点。同样,使用安全组来确保只有合法流量才能通过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-30
      • 1970-01-01
      • 2016-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 2015-02-04
      相关资源
      最近更新 更多