Playframework 播放框架-检索客户端';在使用TCP负载平衡时使用IP

Playframework 播放框架-检索客户端';在使用TCP负载平衡时使用IP,playframework,playframework-2.0,Playframework,Playframework 2.0,用例:AmazonELB后面的一个播放应用程序,它被配置为TCP负载平衡 Amazon ELB通过提供客户端的连接信息 如何在播放中检索此信息?您可以从请求中检索任何HTTP头。如果代理信息在HTTP头中可用(我不熟悉Amazon ELB及其使用的HTTP头,但我假设它会使用某种HTTP头),您可以自己解析它,如下所示: val maybeClientIp: Option[String] = request.headers.get("PROXY").flatMap { header =>

用例:AmazonELB后面的一个播放应用程序,它被配置为TCP负载平衡

Amazon ELB通过提供客户端的连接信息


如何在播放中检索此信息?

您可以从请求中检索任何HTTP头。如果代理信息在HTTP头中可用(我不熟悉Amazon ELB及其使用的HTTP头,但我假设它会使用某种HTTP头),您可以自己解析它,如下所示:

val maybeClientIp: Option[String] = request.headers.get("PROXY").flatMap { header =>
  val proxyProtocolHeader = header.split(" ")
  if (proxyProtocolHeader.length > 2) {
    Some(proxyProtocolHeader(2))
  } else {
    None
  }
}

如果启用了代理协议支持,它会将haproxy的专有代理协议头添加为TCP请求中发送的第一个内容。实际上,它在http请求之前添加了以下行:

PROXY TCP4 192.168.0.1 192.168.0.11 56324 443
这是无效的HTTP,所以Play不支持它,如果Play接收到这样的请求,它只会返回一个错误

您可以在EC2节点上安装一个支持代理协议的代理,然后让它将代理协议ip地址添加到Play应用程序的X-Forwarded-For头中。有关如何配置nginx以支持代理协议的说明,请参见:


X-Forwarded-For不可用,如果使用TCP负载平衡,我读得太快了。您是否实际使用编码的代理标头获取任何类型的HTTP标头?看起来,一旦你有了头,你就可以自己解析它了。yourselfELB为TCP数据预先添加了一个头。所以真正的问题是如何检索它。是否有任何ETA将添加代理协议支持作为一项功能?这是可以在游戏本身内部完成的,还是需要在外部库中进行修改?谢谢。游戏是建立在Netty的基础上的,Netty确实有一个可以添加的代理协议句柄。它可以作为配置选项提供。目前还没有实施该计划的计划,如果真的发生,将是来自社区的请求。另外,Play 3正在迁移到akka http(又名spray),它不支持代理协议。功能要求如下:Play 2.5或Play 2.6版本是否支持代理协议?