§设置前端 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
文件应定义如下 upstream
和 server
块
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 使用此配置来计算RequestHeader
的remoteAddress
和secure
字段的正确值。
对于 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 只会信任环回地址,即::1
和127.0.0.1
。
§信任所有代理
许多云提供商,最值得注意的是 AWS,不保证其负载均衡器代理将使用哪些 IP 地址。因此,支持这些服务转发标头的唯一方法是信任所有 IP 地址。可以通过以下方式配置受信任的代理来实现这一点
play.http.forwarded.trustedProxies=["0.0.0.0/0", "::/0"]
§转发标头版本
Play 支持两种不同的转发标头版本
- 使用 X-Forwarded 标头的传统方法
- 使用 RFC 7239 的 Forwarded 标头
这可以通过 play.http.forwarded.version
进行配置,有效值为 x-forwarded
或 rfc7239
。默认值为 x-forwarded
。
x-forwarded
使用事实上的标准 X-Forwarded-For
和 X-Forwarded-Proto
标头来确定请求的正确远程地址和协议。这些标头被广泛使用,但是,它们有一些严重的限制,例如,如果您有多个代理,并且只有一个代理添加了 X-Forwarded-Proto
标头,那么就无法可靠地确定哪个代理添加了它,因此也无法确定客户端的请求是使用 https 还是 http 发出的。rfc7239
使用新的 Forwarded
标头标准,并解决了 X-Forwarded-*
标头的许多限制。
有关更多信息,请阅读 RFC 7239 规范。
下一步:配置 HTTPS
发现此文档中的错误?此页面的源代码可以在这里找到 这里。阅读完 文档指南 后,请随时贡献拉取请求。有疑问或建议要分享?转到 我们的社区论坛 与社区开始对话。