[英]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.