
我有 NGINX 作為反向代理和兩個 Apache 作為上游伺服器。
每當我造訪 example.com (定向到 NGINX )時,兩個 Apache 伺服器都會收到 GET 請求。這看起來很奇怪,因為 NGINX 預設是基於循環方法工作的
這是我的配置:-
upstream apache {
server 172.18.0.164;
server 172.18.8.18;
}
location / {
proxy_pass http://apache;
}
登入 Apache 1 機器:-
192.168.10.236 - - [05/Oct/2015:07:59:21 -0400]「GET / HTTP/1.0」200
登入 Apache 2 機器:-
172.18.8.97 - - [05/Oct/2015:11:59:27 +0000]“取得/wordpress/HTTP/1.0”
答案1
直接從Nginx 管理指南:
啟用會話保持
NGINX Plus 支援三種會話持久性方法。這些方法設定為黏指示。
這黏餅乾方法。透過這種方法,NGINX Plus 將會話 cookie 新增到來自上游群組的第一個回應中,並識別發送回應的伺服器。當客戶端發出下一個請求時,它將包含 cookie 值,NGINX Plus 會將請求路由到同一上游伺服器:
upstream backend {
server backend1.example.com;
server backend2.example.com;
sticky cookie srv_id expires=1h domain=.example.com path=/;
}
在範例中,srv_id
參數設定將要設定或檢查的 cookie 的名稱。可選參數expires
設定瀏覽器保留cookie的時間。可選domain
參數定義設定 cookie 的網域。可選path
參數定義設定 cookie 的路徑。這是最簡單的會話保持方法。
這黏性路線方法。透過這種方法,NGINX Plus會在收到第一個請求時為客戶端分配一條「路由」。所有後續請求都將與路線的參數伺服器指令來識別將代理請求的伺服器。路由資訊取自 cookie 或 URI。
upstream backend {
server backend1.example.com route=a;
server backend2.example.com route=b;
sticky route $route_cookie $route_uri;
}
這餅乾學習方法。使用這種方法,NGINX Plus 首先透過檢查請求和回應來尋找會話標識符。然後NGINX Plus「學習」哪個上游伺服器對應哪個會話標識符。通常,這些標識符會在 HTTP cookie 中傳遞。如果請求包含已經「學習」的會話標識符,NGINX Plus 會將請求轉送到對應的伺服器:
upstream backend {
server backend1.example.com;
server backend2.example.com;
sticky learn
create=$upstream_cookie_examplecookie
lookup=$cookie_examplecookie
zone=client_sessions:1m
timeout=1h;
}
在範例中,其中一台上游伺服器透過在回應中設定 cookie「EXAMPLECOOKIE」來建立會話。
強制參數create
指定一個變量,該變數指示如何建立新會話。在我們的範例中,新會話是根據上游伺服器發送的 cookie「EXAMPLECOOKIE」建立的。
強制參數lookup
指定如何搜尋現有會話。在我們的範例中,在客戶端發送的 cookie「EXAMPLECOOKIE」中搜尋現有會話。
強制參數zone
指定一個共享記憶體區域,其中保存有關黏性會話的所有資訊。在我們的範例中,該區域已命名client_sessions
且大小為 1 兆位元組。
這是一種更複雜的會話持久性方法,因為它不需要在客戶端保留任何 cookie:所有資訊都保存在伺服器端的共享記憶體區域中。