Apache 負載均衡器會話創建錯誤
我一直在嘗試在 apache 中設置負載均衡器;我也是這個東西的新手。
我在本地網路中,我有三台 PC,一台我想設置為反向代理,兩台設置為節點。它們都執行 Apache 2.4、windows 10 和 php 7.3.6,並且兩個節點都有自己的 PHP 網站副本和自己的數據庫(兩個數據庫會立即相互複製,因此數據是共享的——兩個節點也可以可獨立使用並通過使用其主機名或 IP 地址訪問)
至於負載均衡器,它已啟動並正在執行,但它不起作用:為站點提供服務並根據負載在節點之間切換,但它沒有正確創建會話,因此甚至不允許登錄進入網站。如果該站點是通過負載平衡器訪問的,而不是直接通過鍵入節點的名稱之一(因為否則它可以工作),則它不會正確創建會話。
負載均衡器似乎無法創建正確的 PHPSESSID 會話 cookie - 並且僅當存在兩個或更多節點時,因為如果由於另一個節點不可用而僅保留一個節點,則負載均衡器工作並且會話創建正確。而且我認為會話cookie確實被創建——儘管不正確。(我認為,由於新使用者頁面被程式為重定向到索引頁面,以防它檢測到已登錄的使用者……並且索引頁面被程式為如果在會話 cookie 中檢測到無效權限,則將使用者引導回登錄頁面. 我試圖弄亂 Apache httpd.conf 文件以解決此問題,但無濟於事;至於我嘗試過的實際事情(我不保證它們被正確應用,因為我是一個新手在這個領域)。對於所有這些測試,我禁用了每個訪問控制(即任何人都可以訪問代理):
1)我嘗試使用帶有stickysession屬性的ProxyPass,如以下連結所述:Apache2 Loadbalancer with sticky session only sticky for GET, not POST
2)我嘗試使用 ProxyPassReverseCookiePath 和 ProxyPassReverseCookieDomain 指令,如以下連結所述:https ://stackoverflow.com/questions/8676890/apache-proxypass-and-sessions
這就是相關的 .conf 部分的樣子(我已經評論了我嘗試過但不起作用的所有指令):
ProxyRequests Off #Header add Set-Cookie " PHPSESSID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED <Proxy *> #here there would be IP filtering, which I removed altogether for ease </Proxy> <Proxy balancer://myset> BalancerMember "http://192.168.3.202:80" route=route1 BalancerMember "http://192.168.3.203:85" route=route2 ProxySet lbmethod=byrequests #ProxySet stickysession= PHPSESSID </Proxy> ProxyPass /balancer-manager ! ProxyPass "/" "balancer://myset/" ProxyPassReverse "/" "balancer://myset/" #ProxyPassReverseCookiePath "balancer://myset/" "/" #ProxyPassReverseCookieDomain "balancer://myset/" localhost #ProxyPassReverseCookieDomain "balancer://myset/" "/”
任何人都知道為什麼負載均衡器沒有正確創建會話?
粘性平衡器會話有效,但必須使用自己的 cookie。PHPSESSID 應由 PHP 處理。
對於平衡器,設置一個名稱為 balancer-route 或其他名稱的 cookie,並在 stickysession 設置中使用它。當然,客戶端可以只使用這些 cookie,但如果你不理會它們,它應該可以工作。
另一個考慮因素是這不包括平衡器節點上下波動的情況。平衡器只會發送一個沒有儲存 PHP 會話的新路由,因此將生成一個新的 PHPSESSID。
在這種情況下,您應該真正將 PHP 會話儲存在數據庫中,因為您已經複製了它。我不建議嘗試複製 PHP 會話文件,因為它們不會不斷刷新,所以不要反映記憶體中的會話。當然,一些 php 數據庫驅動的應用程序已經將它們的會話儲存在它們自己的數據庫中。