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

时间:2018-08-11 17:54:49

标签: nginx websocket nginx-reverse-proxy

我已经调查了RoR 5.0.0 ActionCable wss WebSocket handshake: Unexpected response code: 301的答案,但不适用于我的情况。

我使用nginx代理作为在docker-containers中运行的多个Web服务器的前端。我使用https://github.com/jwilder/nginx-proxy

中的nginx-config-template

现在在我的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://example.com/websocket 时,出现关于意外响应代码301的上述错误。当我手动卷曲websocket-url时,我可以看到nginx响应说明我“ 301永久移动”。但为什么?这是哪里来的?

有人可以帮忙吗?谢谢!

1 个答案:

答案 0 :(得分:0)

我今天遇到了类似的问题。我使用“经典”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
  3. port 是应用程序在主机上提供服务的端口