§設定前端 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
檔案應定義類似這樣的 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
的要求。
代理伺服器可以將特定標頭新增至要求,以告知代理應用程式要求的來源。大部分的網頁伺服器會新增一個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 使用此設定來計算 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 標頭的舊式方法
- 使用 Forwarded 標頭的 RFC 7239
這會使用 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
在這個文件中發現錯誤?此頁面的原始程式碼可以在 這裡 找到。在閱讀 文件指南 之後,請隨時提交拉取請求。有問題或建議要分享嗎?請前往 我們的社群論壇 與社群展開對話。