由于“升级标头:空”,SpringBoot WebSocket的NGINX代理返回400,为什么?

时间:2018-07-17 12:08:42

标签: java spring-boot nginx websocket

Im正在运行默认的SpringBoot嵌入式Tomcat应用程序服务器。我从这台服务器提供一个rest API和一个websocket端点。

在此之前,已设置具有以下配置的NGINX代理:

include /usr/local/etc/nginx/sites-enabled/*;

http {
 map $http_upgrade $connection_upgrade {
  default Upgrade;
  ''      close;
 }

 server {
  listen       80 default_server;
  server_name  SERVER_NAME;
  root /var/www;



  underscores_in_headers on;


  location / {
   index index.html;
   try_files $uri /index.html;

   auth_basic "Restricted Content";
   auth_basic_user_file /etc/nginx/.htpasswd;
  }

  location /api/ {
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header Host $http_host;
   proxy_http_version 1.1;
   proxy_pass http://SERVER_URL:9090/;
  }



  location /websocket {
   proxy_pass http://SERVER_URL:9090/websocket;
   proxy_http_version 1.1;
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection $connection_upgrade;
  }



}
}
events{}
  • NGINX服务器从 / 位置提供Web应用程序。
  • 它从 / api / 位置代理REST API。
  • 它通过 / websocket 位置代理到Spring Boot Websocket。

Web应用程序和REST API可以正常工作。 但是websocket连接不起作用。当我尝试连接到套接字端点时,tomcat应用程序服务器上引发以下错误。

 2018-07-17 11:53:05.516 ERROR 5 --- [nio-9090-exec-1] o.s.w.s.s.s.DefaultHandshakeHandler      : Handshake failed due to invalid Upgrade header: null

因此,似乎是从HTTP升级到WS协议的升级标头, 没有传递到应用程序服务器。这可以通过以下方法解决:

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

但是它不起作用。如果我尝试绕过NGINX直接连接到websocket地址,则会成功建立连接。 我的问题是:

  • NGINX配置中是否缺少某些内容?
  • 有人可以发现另一个可能导致所描述行为的错误吗?

随时询问有关该系统的更多信息。

0 个答案:

没有答案