2017-01-03 123 views
0

我已經看過this question以及SO和其他相關網站上的其他人,但迄今爲止所提出的解決方案都沒有奏效。如何配置Apache以正確轉發Websockets?

我在localhost:8080上運行tty.js,並驗證當直接點擊該端口時websockets正常工作。現在,我試圖通過Apache反向代理連接到tty.js。該應用程序可以不使用Websockets,但我想了解爲什麼Websockets不起作用。

這是我的Apache配置,用於在localhost上進行測試,其中包含source的新版Apache版本。

Listen 9000 
# Load proxy modules 
LoadModule proxy_module "modules/mod_proxy.so" 
LoadModule proxy_http_module "modules/mod_proxy_http.so" 
LoadModule proxy_wstunnel_module "modules/mod_proxy_wstunnel.so" 

<VirtualHost *:9000> 
ServerName localhost 

ProxyPass /tty/socket.io/1/ ws://localhost:8080/socket.io/1/ 
ProxyPassReverse /tty/socket.io/1/ ws://localhost:8080/socket.io/1/ 
ProxyPass /tty/ http://localhost:8080/ 
ProxyPassReverse /tty/ http://localhost:8080/ 

</VirtualHost> 

當我連接到http://localhost:9000/tty/,我得到一個500錯誤。

在服務器端日誌中,出現以下錯誤。

[Mon Jan 02 19:30:32.342551 2017] [proxy:warn] [pid 28226:tid 140098955872000] [client 127.0.0.1:38372] AH01144: No protocol handler was valid for the URL /tty/socket.io/1/. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule., referer: http://localhost:9000/tty/ 

什麼是正確的配置Apache以使WebSockets的正常工作?

回答

0

在調試器中運行Apache幾個小時後,我發現Apache正在通過mod_proxy忠實地傳遞與給定路徑相匹配的所有請求,包括以下內容。

http://localhost:9000/tty/socket.io/1/ 

事實證明,這個請求轉到脫離與Upgrade: Websocket頭的實際請求之前,並且它是一個正常AJAX請求

當這個請求被傳遞到mod_proxy_wstunnel,模塊通告的WebSocket的頭部丟失,並拒絕處理它,造成權利要求的Apache是​​No protocol handler was valid日誌消息,並返回狀態碼500

修復的方法是擴展ProxyPath指令的路徑,以便它只覆蓋實際的WebSocket請求,而不會丟棄Ajax請求。

ProxyPass /tty/socket.io/1/websocket/ ws://localhost:8080/socket.io/1/websocket/ 
ProxyPassReverse /tty/socket.io/1/websocket/ ws://localhost:8080/socket.io/1/websocket/