我正在使用Spring后端的wss(安全Web套接字),并且使用STOMP来为JavaScript客户端提供支持。
请问有人知道为什么会得到以下错误:
Handshake failed due to invalid Upgrade header: null
我正在使用Spring后端的wss(安全Web套接字),并且使用STOMP来为JavaScript客户端提供支持。
请问有人知道为什么会得到以下错误:
Handshake failed due to invalid Upgrade header: null
我遇到了与nginx https代理到tomcat相同的问题。这是因为我没有支持wss请求。为了支持wss请求,我使用了以下配置:
# WebSocketSecure SSL Endpoint
#
# The proxy is also an SSL endpoint for WSS and HTTPS connections.
# So the clients can use wss:// connections
# (e.g. from pages served via HTTPS) which work better with broken
# proxy servers, etc.
server {
listen 443;
# host name to respond to
server_name ws.example.com;
# your SSL configuration
ssl on;
ssl_certificate /etc/ssl/localcerts/ws.example.com.bundle.crt;
ssl_certificate_key /etc/ssl/localcerts/ws.example.com.key;
location / {
# switch off logging
access_log off;
# redirect all HTTP traffic to localhost:8080
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# WebSocket support (nginx 1.4)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
<VirtualHost _default_:443>
ServerName my.app
ServerAdmin admin@my.app
DocumentRoot /var/www/html
SSLCertificateFile ...
SSLCertificateKeyFile ...
SSLCertificateChainFile ...
ProxyPreserveHost on
RequestHeader set X-Forwarded-Proto https
RequestHeader set X-Forwarded-Port 443
RewriteEngine on
RewriteCond %{HTTP:Upgrade}^websocket$ [NC,OR]
RewriteCond %{HTTP:Connection}^upgrade$ [NC]
RewriteRule .* wss:/127.0.0.1:8081%{REQUEST_URI} [P,QSA,L]
RewriteCond %{REQUEST_URI} ^/api/wsendpoint/%{var1}/%{var2}/websocket [NC,OR]
....
</VirtualHost>
我希望这可以帮助到您... 上面的解决方案是以下链接的一部分: https://forum.mattermost.org/t/solved-apache2-reverseproxy-with-websocket-https/437/3
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule rewrite_module modules/mod_rewrite.so
然后进入您的虚拟主机配置,并使用这些规则。
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule /(.*) "ws://[YOUR_URL]:[YOUR_PORT]/$1" [P,L]
显然,将[YOUR_URL]和[YOUT_PORT]替换为实际的url和端口,并且如果您正在使用安全的Web套接字,则将“ws”替换为“wss”。
就这样!
如果您在服务器上做了正确的事情,您可以阅读以下标题。
upgrade: WebSocket
connection: Upgrade
DefaultHandshakeHandler - "握手失败,原因是无效的升级头: null"
这里的URL应该包含端口号
例如:ws://或wss://{baseUrl}:8080/您的WebSocket端点
并在服务器上使用以下命令启用代理
$ sudo a2enmod proxy
$ sudo service apache2 restart
$ sudo a2enmod proxy_wstunnel
$ sudo service apache2 restart
你可以阅读这篇文章https://github.com/spring-projects/spring-framework/issues/16978#issuecomment-453418847
val headers = HttpHeaders()
headers["Upgrade"] = listOf("websocket")
headers["Connection"] = listOf("Upgrade")
headers["Sec-WebSocket-Version"] = listOf("13")
/subsystem=io/worker=default/server=/127.0.0.1:6080
的connection-count
找到。 简单地应用http://httpd.apache.org/docs/2.4/mod/mod_proxy_wstunnel.html
的建议来“同时代理 HTTP 和 WebSockets”,使得两个错误日志和泄漏问题都消失了。 - Romain Buquet