nginx WebSocket握手期间出错:意外响应代码:301

zbq4xfa0  于 2023-03-01  发布在  Nginx
关注(0)|答案(2)|浏览(966)

我已经研究了RoR 5.0.0 ActionCable wss WebSocket handshake: Unexpected response code: 301的答案,但它不适用于我的情况。
我使用nginx代理作为运行在docker-container中的几个Web服务器的前台。
现在,在我的docker-container中,我有另一个nginx,其配置如下:

map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

upstream websocket {
    server my-websocket-docker-container:8080;
}

server {
    root /src/html;

    location /websocket/ {
        resolver 127.0.0.11 ipv6=off;
        proxy_pass http://websocket;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }

    location / {
        # try to serve file directly, fallback to index.php
        try_files $uri /index.php$is_args$args;
    }

    ...

}

当尝试连接到wss://www.example.com时example.com/websocket,我得到了前面提到的关于意外响应代码301的错误。当我手动 curl websocket-url时,我可以看到nginx响应告诉我“301永久移动”。但是为什么?这是从哪里来的?
有人能帮忙吗?谢谢!

ohfgkhjo

ohfgkhjo1#

我今天遇到了类似的问题,我使用"经典"的WebSocket API和NGINX测试一些服务之间的连接,我想出了以下的解决方案:
WebSocket示例创建:

const websocket = new WebSocket('ws://' + window.location.host + '/path');

Nginx配置:

location /path {
    proxy_pass http://websocket:port;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

其中:

  1. path是要重定向的路径
  2. websocket是主机的主机名或IP
    1.端口是主机上为应用程序提供服务的端口
nqwrtyyt

nqwrtyyt2#

在我的例子中,这是因为我使用了一个反向代理,带有nginx,并且它是在SSL下。
我正在尝试连接到"ws://..."/"http://..."
但我应该连接到"wss://..."/"https://..."

相关问题