WebSocket Nginx 线上404

@ServerEndpoint("/websocket.ws/{userId}")
me.add(new UrlSkipHandler("^/websocket.ws", false));

Nginx 线上配置:

server {
  listen 80;
  listen [::]:80;
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  ssl_certificate /usr/local/nginx/conf/ssl/xxx.crt;
  ssl_certificate_key /usr/local/nginx/conf/ssl/xxx.key;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  ssl_ciphers TLS......;
  ssl_prefer_server_ciphers on;
  ssl_session_timeout 10m;
  ssl_session_cache builtin:1000 shared:SSL:10m;
  ssl_buffer_size 1400;
  add_header Strict-Transport-Security max-age=15768000;
  ssl_stapling on;
  ssl_stapling_verify on;
  server_name xxx.com www.xxx.com;
  access_log /xxx.com_nginx.log combined;
  index index.html index.htm index.jsp;
  root /xxx.com/webapp;
  if ($host != www.xxx.com) {  return 301 $scheme://www.xxx.com$request_uri;  }
  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
    expires 30d;
    access_log off;
  }
  location ~ .*\.(js|css)?$ {
    expires 7d;
    access_log off;
  }
  location ~ /(\.user\.ini|\.ht|\.git|\.svn|\.project|LICENSE|README\.md) {
    deny all;
  }
  location /websocket.ws {
    proxy_pass http://127.0.0.1:8099/websocket.ws;
    proxy_connect_timeout 4s; 
    proxy_read_timeout 300s; 
    proxy_send_timeout 10s; 
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }
  location ~ {
    proxy_pass http://127.0.0.1:8099;
    include proxy.conf;
  }
  
}

线上连接一直报404,本地开发环境是正常的

=======================================================

解决了,将 ~ 改 ^~,^~ 开头表示uri以某个常规字符串开头。

location ^~ /websocket.ws/ {
    proxy_pass http://127.0.0.1:8099;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

如下正确配置:

server {
  listen 80;
  listen [::]:80;
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  ssl_certificate /usr/local/nginx/conf/ssl/xxx.crt;
  ssl_certificate_key /usr/local/nginx/conf/ssl/xxx.key;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  ssl_ciphers TLS......;
  ssl_prefer_server_ciphers on;
  ssl_session_timeout 10m;
  ssl_session_cache builtin:1000 shared:SSL:10m;
  ssl_buffer_size 1400;
  add_header Strict-Transport-Security max-age=15768000;
  ssl_stapling on;
  ssl_stapling_verify on;
  server_name xxx.com www.xxx.com;
  access_log /xxx.com_nginx.log combined;
  index index.html index.htm index.jsp;
  root /xxx.com/webapp;
  if ($host != www.xxx.com) {  return 301 $scheme://www.xxx.com$request_uri;  }
  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
    expires 30d;
    access_log off;
  }
  location ~ .*\.(js|css)?$ {
    expires 7d;
    access_log off;
  }
  location ~ /(\.user\.ini|\.ht|\.git|\.svn|\.project|LICENSE|README\.md) {
    deny all;
  }
  location ^~ /websocket.ws/ {
    proxy_pass http://127.0.0.1:8099;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }
  location ~ {
    proxy_pass http://127.0.0.1:8099;
    include proxy.conf;
  }
  
}



评论区

杜福忠

2021-11-30 18:37

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
前面插一行试试

杜福忠

2021-11-30 18:38

https://jfinal.com/share/2471

tbynet

2021-11-30 19:12

@杜福忠 加了不行,还是404

杜福忠

2021-11-30 20:47

@tbynet 把其他的配置先全部去掉,单独调试websocket,本地也可以安装Nginx做调试

tbynet

2021-11-30 21:30

@杜福忠 已经解决了,是nginx的websocket路由的没匹配上