簡體   English   中英

如何使用Apache作為Undertow作為服務器的WebSockets的反向代理

[英]How to use Apache as a reverse-proxy for WebSockets with Undertow as the server

我使用Undertow服務器啟用了WebSockets。 當我直接運行Undertow服務器時,WebSockets可以正常工作。 我使用HTTPS服務頁面,並使用javascript:中的“ wss: ”測試端點。

但是現在,我嘗試使用Apache作為反向代理,並希望它讓WebSocket連接到達Undertow服務器。 這是我當前的虛擬主機:

<VirtualHost *:80 *:443>
    ServerName test.example.org

    SSLEngine on 
    SSLCertificateFile /etc/letsencrypt/live/example.org/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.org/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/example.org/chain.pem

    ProxyPass / http://test.example.org:44444/
    ProxyPassReverse / http://test.example.org:44444/

</VirtualHost>

在這里,Undertow作為端口44444上的HTTP服務器(不是HTTPS)啟動,並且SSL安全由Apache完成。

所有HTML頁面都能正常工作,但是當我嘗試啟動WebSocket連接時,出現此錯誤(Chrome):

WebSocket connection to 'wss://test.example.org/websockets/echo' failed: Error during WebSocket handshake: 'Upgrade' header is missing

而且,當我查看“網絡”選項卡時,在進行“ wss://”調用時,服務器的響應中確實缺少兩個標頭:“ Connection: Upgrade ”和“ Upgrade: WebSocket ”。 當我直接連接到Undertow而不使用Apache時,這些標頭存在

這里有“ Sec-WebSocket-Accept ”和“ Sec-WebSocket-Location ”頭,但是我想這是第二個問題,“ Sec-WebSocket-Location ”是'ws://test.example.org/websockets / echo'不是' wss ://test.example.org/websockets/echo',因為Undertow在HTTP而非HTTPS上運行。

最后, mod_proxy_wstunnel文檔說“ 該連接將自動升級為websocket連接 ”。 這是什么意思? Apache自己將HTTP連接升級為WebSocket連接嗎? 不是我想要的! 我想使用Undertow 自己處理初始HTTP請求和升級過程。 我使用來自初始HTTP連接的信息來驗證用戶是否可以連接到請求的端點,如果可以,我以編程方式調用Undertow的WebSocketProtocolHandshakeHandler#handleRequest(exchange)升級到WebSocket連接。 我只希望Apache讓所有內容通過而不會造成干擾。

在Apache反向代理后面如何使用Undertow運行WebSockets的任何幫助?

我累了,決定嘗試Nginx

3個小時 ,不僅使WebSockets正常工作 ,而且服務器上的所有站點也都移到了其中。 超級容易。

nginx.conf ,WebSocket的神奇之處在於:

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

我知道“升級”是一個特殊的“逐跳”標頭,必須明確配置才能保留。

我希望對Apache也有類似的解決方案,但伙計,關於此的文檔很少!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM