在监听proxy_protocol时,Nginx会捕获“已损坏的标头”

时间:2015-10-28 08:33:38

标签: nginx proxy

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

我认为我有两个选择

  1. 在另一个端口上执行运行状况检查,并设置nginx以侦听该端口上的http请求并代理我的应用程序。
  2. 如果可以捕获broken header错误,或检测proxy_protocol服务器块中的常规http请求,则将这些请求重定向到侦听http的端口。
  3. 如果可能的话,我更喜欢后者(#2)。有没有办法做到这一点?

    理想情况下,我不想做任何这样的事情。用于解决此问题的feature request已提交给AWS,但它没有ETA。

1 个答案:

答案 0 :(得分:2)

The proxy protocol specification说:

  

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

我认为这意味着选项2是一个非常糟糕的想法,甚至不符合代理协议的一致性实现。

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

另外还有两种选择:

  1. 只需将健康状况检查指向添加标题的内容(即ELB?),而不是直接指向您的Nginx实例。不确定Elastic Beanstalk是否可以使用它,它不是我使用的服务。

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