文件

§設定前端 HTTP 伺服器

您可以透過將應用程式 HTTP 埠設定為 80,輕鬆地將您的應用程式部署為獨立伺服器

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

注意:您可能需要 root 權限才能在此埠上繫結程序。

但是,如果您計畫在同一台伺服器上主機多個應用程式,或為了擴充性或容錯性而負載平衡多個應用程式執行個體,您可以使用前端 HTTP 伺服器。

請注意,使用前端 HTTP 伺服器很少能比直接使用 Play 伺服器提供更好的效能。但是,HTTP 伺服器非常擅長處理 HTTPS、條件式 GET 要求和靜態資源,而且許多服務都假設您的架構中包含前端 HTTP 伺服器。

§使用 lighttpd 設定

此範例說明如何將 lighttpd 設定為前端網路伺服器。請注意,您可以使用 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 ) )
    )
}

請參閱 lighttpd 文件,以取得關於如何設定 mod_proxy 的更多詳細資料。

§使用 nginx 設定

此範例說明如何將 nginx 設定為前端網路伺服器。請注意,您可以使用 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 的要求。

代理伺服器可以將特定標頭新增至要求,以告知代理應用程式要求的來源。大部分的網頁伺服器會新增一個X-Forwarded-For標頭,並將遠端用戶端 IP 位址作為第一個參數。如果代理伺服器在localhost上執行,並從127.0.0.1連線,Play 會信任其X-Forwarded-For標頭。

不過,主機標頭保持不變,它仍會由代理伺服器發出。如果您使用 Apache 2.x,您可以新增一個指令,例如

ProxyPreserveHost on

Host標頭會是用戶端發出的原始主機要求標頭。透過結合這兩種技術,您的應用程式將看似直接公開。

如果您不希望此 Play 應用程式佔用整個根目錄,請將排除指令新增至代理伺服器設定檔

ProxyPass /excluded !

§Apache 作為前端代理伺服器,允許透明升級您的應用程式

基本概念是執行兩個 Play 執行個體的網頁應用程式,並讓前端代理伺服器進行負載平衡。如果其中一個無法使用,它會將所有要求轉發至可用的那個。

讓我們啟動相同的 Play 應用程式兩次:一個在埠9999,另一個在埠9998

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

現在,讓我們設定 Apache 網頁伺服器,使其具有負載平衡器。在 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 https://127.0.0.1:9999
    BalancerMember https://127.0.0.1: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 個叢集之間的會話。您實際上可以輕鬆擴充到超過 2 個 Play 執行個體。

若要使用 WebSockets,您必須使用 Apache 2.4 中導入的 mod_proxy_wstunnel

請注意,ProxyPassReverse 可能會錯誤地改寫標頭,在 URI 中新增一個額外的 /,因此您可能希望使用此解決方法

ProxyPassReverse / https://127.0.0.1:9999
ProxyPassReverse / https://127.0.0.1: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


在這個文件中發現錯誤?此頁面的原始程式碼可以在 這裡 找到。在閱讀 文件指南 之後,請隨時提交拉取請求。有問題或建議要分享嗎?請前往 我們的社群論壇 與社群展開對話。