文档

§设置前端 HTTP 服务器

您可以通过将应用程序 HTTP 端口设置为 80,轻松地将应用程序部署为独立服务器

$ /path/to/bin/<project-name> -Dhttp.port=80

注意:您可能需要 root 权限才能在此端口上绑定进程。

但是,如果您计划在同一服务器上托管多个应用程序,或者为了可扩展性或容错性而负载均衡多个应用程序实例,则可以使用前端 HTTP 服务器。

请注意,使用前端 HTTP 服务器很少能比直接使用 Play 服务器获得更好的性能。但是,HTTP 服务器非常擅长处理 HTTPS、条件 GET 请求和静态资源,并且许多服务都假设前端 HTTP 服务器是您架构的一部分。

§使用 lighttpd 设置

此示例展示了如何将 lighttpd 配置为前端 Web 服务器。请注意,您也可以使用 Apache 执行相同的操作,但如果您只需要虚拟主机或负载均衡,lighttpd 是一个非常好的选择,并且配置起来更容易。

/etc/lighttpd/lighttpd.conf 文件应定义如下配置

server.modules = (
      "mod_access",
      "mod_proxy",
      "mod_accesslog"
)

$HTTP["host"] =~ "www.myapp.com" {
    proxy.balance = "round-robin" proxy.server = ( "/" =>
        ( ( "host" => "127.0.0.1", "port" => 9000 ) ) )
}

$HTTP["host"] =~ "www.loadbalancedapp.com" {
    proxy.balance = "round-robin" proxy.server = ( "/" => (
          ( "host" => "127.0.0.1", "port" => 9001 ),
          ( "host" => "127.0.0.1", "port" => 9002 ) )
    )
}

有关如何配置 mod_proxy 的更多详细信息,请参阅 lighttpd 的文档

§使用 nginx 设置

此示例展示了如何将 nginx 配置为前端 Web 服务器。请注意,您也可以使用 Apache 执行相同的操作,但如果您只需要虚拟主机或负载均衡,nginx 是一个非常好的选择,并且配置起来更容易。

注意:nginx 有关于如何将其配置为负载均衡器的广泛文档。有关详细信息,请参阅 HTTP 负载均衡指南

/etc/nginx/nginx.conf 文件应定义如下 upstreamserver

upstream playapp {
  server 127.0.0.1:9000;
}

server {
  listen 80;
  server_name www.domain.com;
  location / {
    proxy_pass http://playapp;
  }
}

更多详细信息,请参阅 完整示例配置,如果您想使用 nginx 进行 SSL 终止,请参阅 此处文档

注意:请确保您使用的是 Nginx 1.2 或更高版本,否则分块响应将无法正常工作。

§与 Apache 配合使用

以下示例展示了与 Apache httpd 服务器 配合使用的简单设置,该服务器运行在标准 Play 配置之前。

LoadModule proxy_module modules/mod_proxy.so
…
<VirtualHost *:80>
  ProxyPreserveHost On
  ServerName www.loadbalancedapp.com
  ProxyPass  /excluded !
  ProxyPass / http://127.0.0.1:9000/
  ProxyPassReverse / http://127.0.0.1:9000/
</VirtualHost>

§高级代理设置

使用 HTTP 前端服务器时,请求地址被视为来自 HTTP 服务器。在通常的设置中,您同时在同一台机器上运行 Play 应用程序和代理,Play 应用程序将看到来自 127.0.0.1 的请求。

代理服务器可以向请求添加特定标头,以告知代理应用程序请求来自何处。大多数 Web 服务器会添加一个 X-Forwarded-For 标头,其中包含远程客户端 IP 地址作为第一个参数。如果代理服务器运行在 localhost 上并从 127.0.0.1 连接,Play 将信任其 X-Forwarded-For 标头。

但是,主机标头保持不变,它将保留代理发出的状态。如果您使用的是 Apache 2.x,您可以添加类似以下的指令

ProxyPreserveHost on

Host 标头将是客户端发出的原始主机请求标头。通过结合这两种技术,您的应用程序将看起来像直接暴露。

如果您不希望此 Play 应用程序占用整个根目录,请在代理配置中添加一个排除指令

ProxyPass /excluded !

§Apache 作为前端代理以允许透明升级您的应用程序

基本思想是运行两个 Play 实例的 Web 应用程序,并让前端代理对它们进行负载均衡。如果其中一个不可用,它将把所有请求转发到可用的那个。

让我们启动两次相同的 Play 应用程序:一次在端口 9999 上,一次在端口 9998 上。

start -Dhttp.port=9998
start -Dhttp.port=9999

现在,让我们配置 Apache Web 服务器以拥有一个负载均衡器。在 Apache 中,添加以下配置

<VirtualHost mysuperwebapp.com:80>
  ServerName mysuperwebapp.com
  <Location /balancer-manager>
    SetHandler balancer-manager
    Order Deny,Allow
    Deny from all
    Allow from .mysuperwebapp.com
  </Location>
  <Proxy balancer://mycluster>
    BalancerMember http://localhost:9999
    BalancerMember http://localhost:9998 status=+H
  </Proxy>
  <Proxy *>
    Order Allow,Deny
    Allow From All
  </Proxy>
  ProxyPreserveHost On
  ProxyPass /balancer-manager !
  ProxyPass / balancer://mycluster/
  ProxyPassReverse / balancer://mycluster/
</VirtualHost>

重要的部分是balancer://mycluster。这声明了一个负载均衡器。+H选项表示第二个Play应用程序处于待机状态。但您也可以指示它进行负载均衡。

Apache 还提供了一种查看集群状态的方法。只需将浏览器指向/balancer-manager即可查看集群的当前状态。

由于 Play 完全是无状态的,因此您无需管理两个集群之间的会话。实际上,您可以轻松地扩展到超过 2 个 Play 实例。

要使用 WebSockets,您必须使用mod_proxy_wstunnel,它是在 Apache 2.4 中引入的。

请注意,ProxyPassReverse 可能会错误地重写标头,在 URI 中添加额外的 /,因此您可能希望使用此解决方法

ProxyPassReverse / http://localhost:9999
ProxyPassReverse / http://localhost:9998

§配置受信任的代理

Play 支持代理用来指示请求的传入 IP 地址和协议的各种转发标头。Play 使用此配置来计算RequestHeaderremoteAddresssecure字段的正确值。

对于 HTTP 客户端(无论是浏览器还是其他客户端)来说,伪造转发标头,从而欺骗 Play 报告的 IP 地址和协议,这都是微不足道的,因此 Play 需要知道哪些代理是可信的。Play 提供了一个配置选项来配置受信任代理列表,并将验证传入的转发标头以验证它们是否可信,并将找到的第一个不可信 IP 地址作为报告的用户远程地址(如果所有代理都可信,则为最后一个 IP 地址)。

要配置受信任代理列表,您可以配置play.http.forwarded.trustedProxies。这需要一个 IP 地址或 CIDR 子网范围列表。IPv4 和 IPv6 都受支持。例如

play.http.forwarded.trustedProxies=["192.168.0.0/24", "::1", "127.0.0.1"]

这表示以192.168.0开头的所有 IP 地址以及 IPv6 和 IPv4 环回地址都是可信的。默认情况下,Play 只会信任环回地址,即::1127.0.0.1

§信任所有代理

许多云提供商,最值得注意的是 AWS,不保证其负载均衡器代理将使用哪些 IP 地址。因此,支持这些服务转发标头的唯一方法是信任所有 IP 地址。可以通过以下方式配置受信任的代理来实现这一点

play.http.forwarded.trustedProxies=["0.0.0.0/0", "::/0"]

§转发标头版本

Play 支持两种不同的转发标头版本

这可以通过 play.http.forwarded.version 进行配置,有效值为 x-forwardedrfc7239。默认值为 x-forwarded

x-forwarded 使用事实上的标准 X-Forwarded-ForX-Forwarded-Proto 标头来确定请求的正确远程地址和协议。这些标头被广泛使用,但是,它们有一些严重的限制,例如,如果您有多个代理,并且只有一个代理添加了 X-Forwarded-Proto 标头,那么就无法可靠地确定哪个代理添加了它,因此也无法确定客户端的请求是使用 https 还是 http 发出的。rfc7239 使用新的 Forwarded 标头标准,并解决了 X-Forwarded-* 标头的许多限制。

有关更多信息,请阅读 RFC 7239 规范。

下一步:配置 HTTPS


发现此文档中的错误?此页面的源代码可以在这里找到 这里。阅读完 文档指南 后,请随时贡献拉取请求。有疑问或建议要分享?转到 我们的社区论坛 与社区开始对话。