首页 > 解决方案 > 当我添加第二个 nginx 服务器时,为什么我的 websocket 没有切换协议?

问题描述

我有一个使用 websocket 的 web 应用程序。我有一个为这个应用程序提供服务的初始 Nginx 服务器,它运行良好。当我打开应用程序时,我可以看到对 websocket 的 GET 和 101 切换协议响应。当我直接连接到这个 Nginx 服务器时,一切正常。

Nginx 1 配置

server {
    listen 80;
    location / {
      root /home/frontend;
      index index.html;
      try_files $uri $uri/ /index.html;
    }
    location /socket.io {
      proxy_pass http://csrotator:5000/socket.io/;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "Upgrade";
      proxy_set_header Host $host;
    }
    location /api {
      proxy_pass http://csrotator:5000;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect off;
    }
}

我有第二台 Nginx 服务器,它处理所有将主机名转换为本地 IP 的操作。当我连接到该服务器而不是看到对 GET ws 调用的 101 响应时,我看到 200 OK,然后显示一条错误消息“Firefox 无法在 ws://rotator.gs.dev.aac 建立与服务器的连接-cly.de/socket.io/?EIO=3&transport=websocket&sid=6b04330aee4846918955af32050906cd”。

Web 应用程序未按预期运行。我需要连接 websocket 来发送命令来启动应用程序。似乎反应迟钝。

Nginx 2 配置

# csrotator
upstream csrotator {
  server 127.0.0.1:7200;
}
server {
  server_name rotator.gs.dev.aac-cly.de;
  location / {
    proxy_pass http://csrotator;
  }
}

我已经为 Nginx 2 尝试了各种不同的配置,包括只是从 Nginx 1 复制配置,但似乎没有任何效果。

非常感谢所有帮助。

编辑1,为Nginx 1添加响应头;

GETws://10.0.240.4:7200/socket.io/?EIO=3&transport=websocket&sid=d07f6e863d524bc5b36c39ecf2e58d65
[HTTP/1.1 101 Switching Protocols 506ms]

    
GET
    ws://10.0.240.4:7200/socket.io/?EIO=3&transport=websocket&sid=d07f6e863d524bc5b36c39ecf2e58d65
Status101
Switching Protocols
VersionHTTP/1.1
Transferred234 B (0 B size)

        
    HTTP/1.1 101 Switching Protocols

    Server: nginx/1.18.0

    Date: Tue, 27 Apr 2021 20:53:09 GMT

    Connection: upgrade

    Upgrade: websocket

    Sec-WebSocket-Accept: ZYKL2m8iRuKVBP3a3vbK+7McYCs=

    Sec-WebSocket-Extensions: permessage-deflate
        
    Accept
        */*
    Accept-Encoding
        gzip, deflate
    Accept-Language
        en-GB,en;q=0.5
    Cache-Control
        no-cache
    Connection
        keep-alive, Upgrade
    Cookie
        io=d07f6e863d524bc5b36c39ecf2e58d65
    Host
        10.0.240.4:7200
    Origin
        http://10.0.240.4:7200
    Pragma
        no-cache
    Sec-WebSocket-Extensions
        permessage-deflate
    Sec-WebSocket-Key
        li5CI6raCiCHs7NxjT+Vsg==
    Sec-WebSocket-Version
        13
    Upgrade
        websocket
    User-Agent
        Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0

对于 Nginx 2:

GETws://rotator.gs.dev.aac-cly.de/socket.io/?EIO=3&transport=websocket&sid=2050c84bd3eb41228edd6836dbc29965
[HTTP/1.1 200 OK 610ms]

    
GET
    ws://rotator.gs.dev.aac-cly.de/socket.io/?EIO=3&transport=websocket&sid=2050c84bd3eb41228edd6836dbc29965
Status200
OK
VersionHTTP/1.1
Transferred274 B (0 B size)

        
    HTTP/1.1 200 OK

    Server: nginx/1.17.10

    Date: Tue, 27 Apr 2021 20:52:31 GMT

    Content-Type: application/octet-stream

    Transfer-Encoding: chunked

    Connection: keep-alive

    Access-Control-Allow-Origin: http://rotator.gs.dev.aac-cly.de

    Access-Control-Allow-Credentials: true
        
    Accept
        */*
    Accept-Encoding
        gzip, deflate
    Accept-Language
        en-GB,en;q=0.5
    Cache-Control
        no-cache
    Connection
        keep-alive, Upgrade
    Cookie
        io=2050c84bd3eb41228edd6836dbc29965
    Host
        rotator.gs.dev.aac-cly.de
    Origin
        http://rotator.gs.dev.aac-cly.de
    Pragma
        no-cache
    Sec-WebSocket-Extensions
        permessage-deflate
    Sec-WebSocket-Key
        QjR/ALydBIFDaRJW3Xz4Bw==
    Sec-WebSocket-Version
        13
    Upgrade
        websocket
    User-Agent
        Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0

标签: nginxwebsocket

解决方案


推荐阅读