2009-11-07 56 views
0

我希望Apache和遊戲服務器都可以在同一IP地址的端口443上訪問。在Apache和遊戲服務器之間分離https

遊戲服務器連接是一個正常的TCP連接,當客戶端登錄並保持打開狀態時才建立,直到客戶端註銷(可能幾個小時後)。

起初我雖然關於在反向模式下使用mod_proxy,並讓客戶端開始與特定URL的請求進行通信,但我想這不會讓我很長時間客戶端和遊戲服務器之間的雙向通信。

另一個想法是在轉發模式下使用mod_proxy_connect(當然有嚴格的訪問規則),並讓客戶端發送一個CONNECT請求。理論上這應該起作用。

然而,這兩個提到的嘗試都有一個很大的問題:遊戲服務器不再看到客戶端的IP地址。不幸的是,這是一項艱鉅的任務

顛倒順序有同樣的問題:如果我讓遊戲服務器偵聽端口443並轉發Web請求到Apache,.php程序和access.log不會再看到真正的IP地址。我有點擔心這種方法會對遊戲性能產生負面影響。 (特別是在其龐大的非緩存圖像數頁)

操作系統:Linux(Debian的) Web服務器:Apache 2的 ,遊戲服務器和客戶端是用Java編寫

預先感謝您的任何想法。

+0

請參閱http://serverfault.com/questions/74223/how-can-i-set-up-a-reverse-proxy-for-several-web-applications-and-static-content – 2009-11-07 15:51:12

+1

究竟是什麼遊戲服務器呢,它是如何工作的?您需要單個連接還是定期重新連接? – 2009-11-07 16:00:52

回答

1

您可以讓Apache創建會話ID並將其存儲到數據庫中,然後使用mod_proxy_connect。當遊戲服務器接受來自本地Apache的請求時,它應該從頭部獲取會話ID並從數據庫中讀取客戶端的IP地址。

+0

絕妙的主意。 遊戲客戶端使用正常的HTTP GET請求一個.php頁面,該頁面將生成一個會話令牌,並將它的時間戳和IP地址寫入數據庫。客戶端將使用CONNECT連接到遊戲服務器,並將該會話令牌作爲(待擴展的)遊戲協議的一部分進行傳輸。需要額外的步驟,因爲在連接遊戲服務器時Apache沒有生成頭文件。 非常感謝。 – 2009-11-07 16:08:37

1

你如何運行遊戲服務器?如果它由Tomcat或Jetty運行,你可以嘗試mod_jk

+0

它不使用Tomcat或Jetty。但是,mod_jk/AJP13看起來像是將請求及其客戶端IP地址轉發到服務器的一種很好的方式。我不確定是否可以建立雙向通信,因爲GET/POST/PUSH似乎都設計成客戶端 - >服務器請求,服務器 - >客戶端 - 答案,完成。但這是值得仔細觀察的方法。 – 2009-11-07 16:22:30

1

從你所描述的,遊戲服務器不是一個HTTP服務器,它只是使用端口443(TCP連接,當客戶端日誌並且保持打開狀態,直到客戶端退出,可能幾小時後

這聽起來不像HTTP,即使使用保持活動狀態,HTTP連接也不會存活超過幾分鐘。

如果遊戲服務器不是HTTP,那麼您的流量不能使用HTTP代理。

+0

http連接可以保持打開幾個小時。一些基於Web的聊天頁面使用Ajax以前的版本。但雙向溝通是一個問題。那些舊式聊天頁面使用第二個請求向服務器發送聊天線。 – 2009-11-07 16:19:12