Socket.io: WebSocket 握手期间出错:意外的响应代码:400

创建于 2015-01-14  ·  129评论  ·  资料来源: socketio/socket.io

找不到解决方案,我在浏览器控制台上收到此错误:
WebSocket 连接到“ws://.../socket.io/?EIO=2&transport=websocket&sid=p3af7ZNfvogtq6tAAAG0”失败:WebSocket 握手期间出错:意外响应代码:400。

有什么建议吗?

最有用的评论

有同样的问题,我的应用程序落后于 nginx。 对我的 Nginx 配置进行这些更改消除了错误。

地点 / {
proxy_pass http://localhost :8080;
proxy_http_version 1.1;
proxy_set_header 升级 $http_upgrade;
proxy_set_header 连接“升级”;
proxy_set_header 主机 $host;
}

这最初来自https://chrislea.com/2013/02/23/proxying-websockets-with-nginx/

所有129条评论

我现在遇到完全相同的问题,有什么帮助吗?

我也遇到了这个问题,因为我在我的域上安装了 SSL 证书。

这是对该问题的更好描述: http ://stackoverflow.com/questions/28025073/error-during-websocket-handshake-unexpected-response-code-400-with-nginx-proxy

我也有一个与 Android 库之一连接的类似问题。 Web 套接字不会通过 HAproxy 执行 ssl 终止或让节点直接执行 ssl 连接到 https。 然而,长轮询工作正常

我通过将域更改为真实 IP 地址来解决它:

var socket = io.connect('http://182.92.79.215:3007');

有同样的问题,我的应用程序落后于 nginx。 对我的 Nginx 配置进行这些更改消除了错误。

地点 / {
proxy_pass http://localhost :8080;
proxy_http_version 1.1;
proxy_set_header 升级 $http_upgrade;
proxy_set_header 连接“升级”;
proxy_set_header 主机 $host;
}

这最初来自https://chrislea.com/2013/02/23/proxying-websockets-with-nginx/

生产服务器上的同样问题。 开发机器不显示错误。

奇怪的是,连接正在工作。 我可以通过 WebSockets 从服务器发送消息,客户端获取它们。 我还可以看到正在服务器上建立 WebSocket 连接。

我只是在开发人员工具中收到此错误消息:

WebSocket 连接到“ wss://.../socket.io/?EIO=3&transport=websocket&sid=2b_v_BXtbwzl5z2yAAAI ”失败:WebSocket 握手期间出错:意外响应代码:400

我正在使用 Apache ProxyPass 将连接发送到节点。

此处相同 - 功能齐全,但开发工具中有错误消息。 我在其他地方读到它与 apache 版本相关 - 在这台机器上使用 2.2.14。

确保您的 socket.io 连接没有通过 Amazon 负载均衡器。 或者如果是这样,请执行以下操作:http: //blog.flux7.com/web-apps-websockets-with-aws-elastic-load-balancing

同样的问题,仅在生产环境中。
Websockets 似乎工作正常,应用程序正常工作。 但是在控制台日志上我可以看到这个错误。

我正在使用 Nginx 并且只有一台服务器用于节点,所以这似乎不是负载平衡问题。 我已经在使用 tylercb 建议的解决方案(“proxy_set_header Host $host;”除外),但它并没有解决问题。

也有问题,但工作得很好......

我有同样的问题。 你在使用 CloudFlare 吗? 目前,只有他们的企业计划支持 WebSockets。

为我解决了。 这是由于 nginx 配置中的 socket.io 地址错误,与使用 websocket 的路径不匹配。

我用谷歌搜索,因为我遇到了同样的问题,而且我也使用 nginx。 解决方案是添加这部分

proxy_http_version 1.1;
proxy_set_header 升级 $http_upgrade;
proxy_set_header 连接“升级”;
proxy_set_header 主机 $host;

像提到的 tylercb 一样进入 nginx 配置文件。

为我工作。 谢谢。

直接连接到我在 Windows Server 2008R2 上托管的应用程序时遇到同样的错误(无代理,无 IIS)。 两者之间只有愚蠢的中间硬件。

将主机名切换为 IP 地址后工作正常,即 127.0.0.1:9000。 可能由 httpd ProxyPassReverse 引起

就我而言,问题是由于 cloudfare 不支持免费计划中的 websockets。 我为该域关闭了 CloudFare,它起作用了。

我只需要添加一些 Apache 重写条件来处理 websockets,更多信息在这里:
http://stackoverflow.com/a/27534443/2044993

我知道这是一个老问题,但由于它在 Google 搜索结果中的排名很高,但这可能会对人们有所帮助:

即使出现此错误,连接仍然有效的原因是 socket.io 正在回退到 AJAX,这不是最佳的,您应该修复您的服务器配置。

顺便说一句,这个问题应该保持关闭,这不是 socket.io 问题。

@arosenfeld-mentel 我一直在阅读您评论上方的帖子,即“这不是 socket.io 问题”,但我看不出有人说问题到底出在哪里。 我自己也看到了这一点,尽管正如您所说,连接似乎仍然有效。 任何提示将不胜感激。 谢谢!

问题可能是真的,你需要调试你的整个设置。 对我来说是 NGINX,它作为反向代理需要上面多次发布的附加配置设置。 因为你可能是别的东西。

首先调试本地连接,让它在没有警告的情况下工作,然后转移到生产服务器,确保你有防火墙、前端服务器和代理来与 WebSockets 配合。

这不是 socket.io 问题,而是 WebSockets 问题,因此请确保服务器和客户端与 WebSockets 配合良好。

谢谢回复。 一切都在本地或通过我们的 VPN 运行,但是一旦涉及到我们的防火墙,就会出现消息。 我猜防火墙以某种方式进行了干扰,我们将不得不学习如何调试该问题,而不是责怪 socket.io。 再次感谢。

有完全相同的问题。 我也创建了stackoverflow(http://stackoverflow.com/questions/34439546/socket-io-with-apache-proxy)问题,但建议的事情还没有对我有用。

我已将这些标头放在 nginx 中,但仍然相同,但不是在浏览器中,而是在https://toolbox.seositecheckup.com

也有这个问题,看起来我的虚拟主机(通过 nginx)没有正确设置以接受升级标头。 @tylercb大约一年前的修复修复了它^

@tylercb为我工作。

+1
此错误发生在 openshift 环境中

我认为如果我准确记录了我为解决问题所做的工作可能会很有用。 这只是将上述各种帖子组合成一个简单的帖子,因此任何其他发现此问题的人都可以轻松获得潜在的解决方案。 我不相信辛勤工作。

我们正在运行

  1. Ubuntu 14.04 LTS 服务器,
  2. nginx 版本:nginx/1.4.6 (Ubuntu) 作为反向代理和 SSL 网关。
  3. 我们根本没有 Apache。 它已从系统中删除。
  4. 我们有一个 node.js 服务器在 nginx v0.10.25 后面运行。 这监听端口 4001。外部访问是通过端口 4000。
  5. 我们在前面运行 ufw 并简单地允许端口 4000 通过。
  6. 我们管理自己的服务器,不使用 Cloudflare 或 Openshift
  7. 我们还没有使用任何负载均衡器。

我们和其他人有同样的问题

WebSocket connection to 'ws://XXXXXXXXXX?EIO=2&transport=websocket&sid=p3af7ZNfvogtq6tAAAG0' failed: Error during WebSocket handshake: Unexpected response code: 400.

我们更新了 /etc/nginx/sites-enabled/default 中的 nginx 文件,内容如下:(注意我们已经提取了我们的域名)

server {
        listen 4000;
        server_name XXXX.YYYY.ZZZZ;

        root html;
        index index.html index.htm;

        ssl on;
        ssl_certificate /etc/ssl/certs/SSL.crt;
        ssl_certificate_key /etc/ssl/private/server.key;

        ssl_session_timeout 5m;

        # ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; # NOTE WE REMOVE SSLv3
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES1\
28-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECD\
HE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SH\
A256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SH\
A:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

        ssl_prefer_server_ciphers on;
        ssl_dhparam /etc/ssl/private/dhparams.pem;

        location / {
                 proxy_set_header        Host $host;
                 proxy_set_header        X-Real-IP $remote_addr;
                 proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                 proxy_set_header        X-Forwarded-Proto $scheme;

                 # Fix the “It appears that your reverse proxy set up is broken" error.
                 proxy_pass          http://127.0.0.1:4001;
                 proxy_read_timeout  90;

                 proxy_redirect      http://127.0.0.1:4001 https://XXXXX.YYYYY.ZZZZZ;

                 # These three lines added as per https://github.com/socketio/socket.io/issues/1942 to remove the error
                 # WebSocket connection to 'wss://XXXXX.YYYYY.ZZZZZ:4000/socket.io/?EIO=3&transport=websocket&sid=0hsRiXu0q9p6RHQ8AAAC' failed:\
 Error during WebSocket handshake: Unexpected response code: 400 in console.log

                 proxy_http_version 1.1;
                 proxy_set_header   Upgrade $http_upgrade;
                 proxy_set_header   Connection "upgrade";
        }
}

我们只需要添加

  1. proxy_http_version 1.1;
  2. proxy_set_header 升级 $http_upgrade;
    3.proxy_set_header 连接“升级”;

正如我们已经拥有的

  1. proxy_set_header 主机 $host;
  2. proxy_pass http://127.0.0.1 :4001;

希望这会有所帮助,它对我们有用。

谢谢您的帮助,

当我使用 CAS(不是经典形式)进行身份验证时,我遇到了同样的问题,并且我使用 Apache 和 LetEncrypt SSL 作为代理,是否需要设置特定的配置?

尝试在 AWS Elastic BeanStalk 上部署 Node.js 应用程序。
我已将文件夹.ebextensions添加到服务器的根目录,并在其中添加了文件nginx.config ,如下所示:

server:
  location /:
    proxy_pass http://localhost:8080;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;

我仍然收到 400 错误,但至少所有其他套接字都可以正常工作。

供参考:这是我为 socket.io 1.x 和 Apache 2.4 找到的唯一可行的配置解决方案: https ://github.com/meteor/meteor/issues/3339#issuecomment -165188938

ProxyPass / http://localhost:3999/
ProxyPassReverse / http://localhost:3999/

RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
RewriteRule .* ws://localhost:3999%{REQUEST_URI} [P]

使用另一个端口,它可能工作

@BlaM感谢您的工作配置!

对于在 AWS Elastic Beanstalk 中遇到此问题的任何人,此.ebextension文件对我有用:

files:
    "/etc/nginx/conf.d/01_websockets.conf" :
        mode: "000644"
        owner: root
        group: root
        content : |
            upstream nodejs {
                server 127.0.0.1:8081;
                keepalive 256;
            }

            server {
                listen 8080;

                location / {
                    proxy_pass  http://nodejs;
                    proxy_set_header Upgrade $http_upgrade;
                    proxy_set_header Connection "upgrade";
                    proxy_http_version 1.1;
                    proxy_set_header        Host            $host;
                    proxy_set_header        X-Real-IP       $remote_addr;
                    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                }
            }

    "/opt/elasticbeanstalk/hooks/appdeploy/enact/41_remove_eb_nginx_confg.sh":
        mode: "000755"
        owner: root
        group: root
        content : |
            mv /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf.old

根据此线程中的说明。

@BlaM - 我正在使用带有 Elastic Bean 的 apache 服务器和 ELB
我应该把你提供的代码放在哪里?
谢谢!

我对 Elastic Bean 一无所知,但我发布的代码片段进入了 Apache 主机文件。

@tylercb谢谢! 它对我有用~

任何不使用 nginx 的人都面临同样的问题?

是的,我在使用 Elastic Beanstalk 和没有 Elastic Load Balancer 的单个服务器(节点和 nginx)时遇到了同样的问题。
我不知道如何从 http/https 更改为 ssl/tls

HAProxy 也有同样的问题

为我工作。 谢谢。 你应该注意顺序

proxy_set_header   Upgrade $http_upgrade;
proxy_set_header   Connection "upgrade";

是的,这也为我做了。

我也面临这个问题。 即使出现 400 错误,客户端和服务器之间的 websocket 通信也很好。 这是在我们的开发环境中。

有人可以告诉我这在生产环境中是否会成为问题。

仅供参考:如果您的 io.sails.url 不是 https,则使用托管在 Heroku 上的 socket.io 使用 postgres 插件连接到 Sails 后端将在您的浏览器中引发此错误。 非常具体的案例,但希望这可以帮助任何具有相同堆栈的人在谷歌上搜索这个

大家好,

我在本地主机上也面临同样的问题。 我们使用 python-flask 作为服务器,使用 HTML/CSS/JS 作为前端。

在前端与我们使用的 Websocket 服务器连接
var socket = io.connect('ws://url/namespace', { 'transports': ['websocket'] });

当我运行应用程序时,它会引发错误
WebSocket connection to 'ws://url/namespace/socket.io/?EIO=3&transport=websocket' failed: Error during WebSocket handshake: Unexpected response code: 400

如果您需要更多信息,请告诉我们。

任何帮助表示赞赏。
感谢您阅读它。

问候
阿杰

我在 webrtc 示例应用程序上遇到了同样的错误。 在服务器端,代码是

var server = require('http').Server(app);
var io = require('socket.io')(server);
var WebRTC = require('../../');
app.use(express.static(__dirname));
var io = require('socket.io')(server);

注释掉第二个“require('socket.io')”后,400 错误消息消失。

需要进一步挖掘原因......但您可以检查您的应用是否尝试两次建立相同的连接。

大家好,我知道这个讨论已经进行了一段时间,并且想发布一个资源,使用 AWS EBS 和 Application Load Balancer 为我解决了这个问题。

https://mixmax.com/blog/deploying-meteor-to-elastic-beanstalk-1

希望这会有所帮助。

特拉维斯

当我使用 etherpad-lite 时,我遇到了同样的问题。
我找到了解决 Apache ProxyPass 问题的方法。
我正在使用 Apache http 2.2 使用来自 http 2.4 wstunnel 模块的 backprot,所以我认为这也可以修复 v.2.4。

首先我修改了socket.io-client/socket.io.js
寻找 WS.prototype.uri = function()
return schema + '://' + (ipv6 ? '[' + this.hostname + ']' : this.hostname) + port + this.path + query;
然后更改为:

return schema + '://' + (ipv6 ? '[' + this.hostname + ']' : this.hostname) + port + this.path +'ws/'+ query;
保存并重新启动节点。

二、修改vhost.conf或ssl.conf
将以下内容添加到 VirtualHost:

        ProxyPass "/etherpad/socket.io/ws/" "ws://localhost:9001/socket.io/"
        ProxyPassReverse "/etherpad/socket.io/ws/" "ws://localhost:9001/socket.io/"

        ProxyPass "/etherpad/socket.io/" "http://localhost:9001/socket.io/"
        ProxyPassReverse "/etherpad/socket.io/" "http://localhost:9001/socket.io/"


        ProxyPass /etherpad/ http://localhost:9001/
        ProxyPassReverse /etherpad/ http://localhost:9001/
        CacheDisable *

        ProxyPreserveHost on
        <Proxy *>
                Options FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Proxy>

`

重启apache httpd,享受~

对于 Apache,请按照@cpres回答,它可以工作。 我的会议

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName reservation.tinker.press

    DocumentRoot /var/www/html/node-js-order-socket-demo
    <Directory />
        Options -Indexes +FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>

    RewriteEngine on
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
    RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
    RewriteRule .* ws://127.0.0.1:3001%{REQUEST_URI} [P]

    ProxyRequests Off
    ProxyPreserveHost On
    ProxyVia Full
    <Proxy *>
        Require all granted
    </Proxy>

    ProxyPass / "http://127.0.0.1:3001/"
    ProxyPassReverse / "http://127.0.0.1:3001/"

    ErrorLog ${APACHE_LOG_DIR}/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

apache-websocket-use-mode-rewrite

我还必须调整我的弹性负载均衡器以使用端口 80 上的 TCP,而不是端口 80 上的 HTTP。

是否可以对多个节点使用ProxyPass指令? 我最终为https://github.com/socketio/socket.io/pull/2819使用RewriteRule

Header add Set-Cookie "SERVERID=sticky.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED

<Proxy "balancer://nodes_polling">
    BalancerMember "http://server-john:3000"    route=john
    BalancerMember "http://server-paul:3000"    route=paul
    BalancerMember "http://server-george:3000"  route=george
    BalancerMember "http://server-ringo:3000"   route=ringo
    ProxySet stickysession=SERVERID
</Proxy>

<Proxy "balancer://nodes_ws">
    BalancerMember "ws://server-john:3000"    route=john
    BalancerMember "ws://server-paul:3000"    route=paul
    BalancerMember "ws://server-george:3000"  route=george
    BalancerMember "ws://server-ringo:3000"   route=ringo
    ProxySet stickysession=SERVERID
</Proxy>

RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) balancer://nodes_ws/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule /(.*) balancer://nodes_polling/$1 [P,L]

@darrachequesne它工作得很好! 谢谢

谢谢!

对于任何仍然遇到 AWS Application Load Balancer 问题的人,请尝试更新您的安全策略,我遇到了同样的问题,即使它在另一个网站的确切设置中运行良好,但注意到安全策略落后了大约 1 年。 将其更新到较新的似乎已经解决了这个问题。

配置了 nginx 和客户端后,我仍在努力寻找确切的解决方案。
但是@visibleajay发表了评论,我意识到我没有在 io.connect 命令中使用 { 'transports': ['websocket'] } 部分。

所以对于任何可能遇到同样麻烦的人,
var socket = io.connect('https://server.com/socket.io-path-here', { 'transports': ['websocket'] });

完成了这项工作,以及正确的 nginx 配置。

@fott1请注意,使用{ 'transports': ['websocket'] }意味着当无法建立 websocket 连接时没有回退到长轮询。

使用 nginx 的完整示例: https ://github.com/socketio/socket.io/tree/master/examples/cluster-nginx

@darrachequesne我相信你是对的,如果我将“websocket”与“轮询”或“xhr-polling”一起包含在数组中怎么办? 感谢您提供的示例。

@fott1默认值确实是['polling', 'websocket'] ( ref )。

但是您需要使用正确的 nginx 配置,因为polling (与websocket不同)传输要求每个请求都路由到同一个 socket.io 服务器。

换句话说, @darrachequesne 。 如果我有多个服务器实例,每个请求都应该路由到同一个实例? 如果我错了,请纠正我。 谢谢你的提示。

@fott1是的,没错。 解释在这里: https ://socket.io/docs/using-multiple-nodes/

FWIW - 我在我的本地(没有 nginx,没有代理)上得到这个。 使用 socket.io 时,您必须将传输明确指定为第一个 websocket,然后在客户端和服务器中轮询。 不知道为什么这不仅仅是默认设置。 或者也许我做错了。

我们最初的问题是我们在 websocket 之前进行了轮询,没有意识到顺序很重要。

原始设置:
服务器:
io.set('transports', ['polling', 'websocket']);
客户:
var socket = io.connect(server, { reconnect: true });

我们意识到我们的客户正在轮询,所以我们将其作为一个选项删除。 然后一切都开始失败,我们收到了 400 bad request。

所以最后我们发现您必须在客户端和服务器中指定顺序,如果您不这样做,客户端将直接进行轮询,这对我来说毫无意义。 你会认为它会首先默认为 websocket。

使固定:
服务器:
io.set('transports', ['websocket', 'polling']);
客户:
var socket = io.connect(server, { reconnect: true, transports: ['websocket', 'polling'] });

同样,请注意,使用{ 'transports': ['websocket', 'polling'] }意味着当 websocket 连接无法建立时,没有回退到长轮询。

让我们关闭这个问题,如果需要请重新打开。

我采用了“扩展” Elastic Beanstalk 的默认 nginx 配置的方法,其位置设置类似于之前的一些建议。 像这样创建一个目录结构:

 〜/工作区/我的应用程序/
 |-- .ebextensions
 | `-- nginx
 | `--conf.d
 | `--myconf.conf
 `-- web.jar

其中myconf.conf ,其名称是任意的,只要它以.conf结尾包含以下内容:

服务器 {
 地点 / {
 proxy_pass http://127.0.0.1:5000;
 proxy_http_version 1.1;
 proxy_set_header 升级 $http_upgrade;
 proxy_set_header 连接“升级”;
 proxy_set_header 主机 $host;
 }
 }

请务必根据需要调整端口号。

我通过仅添加 { transports: ['polling'] } 解决了这个问题。

_

var socket = io.connect(server, {transsports: ['polling']});

_

@hyewon330看起来如果你没有真正_解决_它😉你只是简单地配置了socket.io,甚至一开始就没有尝试使用websockets。 当然,错误消息已经消失了,但现在你强制 socket.io 使用轮询,即使客户端和服务器之间的连接_将_支持 websockets。 不确定这对您的应用程序是否至关重要,只是想确保您知道👌

对于使用Nginx的任何人, @tylercb解决方案都可以完美运行。

这个解决方案解决了我使用闪亮应用程序的问题。 长官。

@tylercb @rudolfschmidt @juanjoLenero @rwillett @cpres你好,我使用你的方法,但它对我不起作用。 我怀疑是不是因为我使用了其他端口而不是 8080。例如,我的应用程序放在机器 A 中,IP 170.8.8.8 监视端口 5000,我将 nginx 放在机器 B 中,IP 170.8.8.2 也监视端口 5000。所以我想访问 B 中的 IP:5000 跳转到 A 中的 IP:5000。下面是我在机器 B 中的 nginx 配置:

upstream cuitccol.com{ #the name of server cluster
        server 170.8.8.8:5000 max_fails=5 fail_timeout=50s; #for the first web server
        }

    server {
        listen       5000;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            proxy_pass http://cuitccol.com;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
        } 

我不知道哪里出了问题。 你能给一些建议吗?
非常感谢~
期待你的回复

我现在在每个环境中都面临这个问题一段时间,包括本地环境。 @darrachequesne如果我需要提供更多信息,请告诉我:

我有一个带有express的节点js和下面的代码,它完全遵循socket.io“如何使用”部分:

var app = require('express')();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
io.on('connection', function(){ /* … */ });
server.listen(3000);

我已经建立了一个非常简单的客户端,只有下面的代码,它完全遵循 socket.io-client “如何使用”部分:

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io('http://localhost:3000');
  socket.on('connect', function(){});
  socket.on('event', function(data){});
  socket.on('disconnect', function(){});
</script>

尽管连接成功,但我仍然收到同样的错误:

WebSocket 连接到“ws:// localhost:3000/socket.io/?EIO=3&transport=websocket&sid=EWl2jAgb5dOGXwScAAAB ”失败:WebSocket 握手期间出错:意外响应代码:400

查看浏览器控制台时,错误指向 websocket.js 的第 112 行,其中指出:

try {
    this.ws = this.usingBrowserWebSocket ? (protocols ? new WebSocket(uri, protocols) : new WebSocket(uri)) : new WebSocket(uri, protocols, opts);
  } catch (err) {
    return this.emit('error', err);
  }

欣赏任何想法...

@rafapetter检查您是否不需要 socket.io 两次,我正在将 www/bin 中的 socket.io 设置移动到 app.js 并且不小心在导致此错误的 bin 中留下了一个 require socket.io。

只需将{transports: ['websocket']}选项添加到 Socket.io 客户端。

看起来像这样。

import io from 'socket.io-client'
const socket = io('http://localhost:5000', {transports: ['websocket']})

服务器上的@spookyUnknownUser socket.io 只需要一次。

@prapansak客户端是一个简单的 javascript 文件,在window.onload函数内,不允许 ES6 导入。 但我确实遵循如何使用部分:
<script src="/socket.io/socket.io.js"></script>

在按照您的建议调用套接字时:
const socket = io('http://localhost:5000', {transports: ['websocket']})

我收到此错误: WebSocket connection to 'ws:// localhost:1337/socket.io/?EIO=3&transport=websocket ' failed: Invalid frame header

谢谢大家,如果您有任何其他想法,请告诉我,我会在这里尝试。

好的,终于解决了!

@spookyUnknownUser你的想法鼓励我进一步寻找重复。 事实证明,在server.listen之后的服务器上,我正在这样做:

io.attach(server, {
  pingInterval: 40000,
  pingTimeout: 25000,
});

我猜这在某种程度上是第二次附加服务器。 所以我一开始就删除了它,当需要 socket.io 时,我改为:

var io = require('socket.io')(server, {
    'pingInterval': 40000,
    'pingTimeout': 25000
});

现在,没有显示任何问题,一切正常。

再次感谢各位大侠的见解

我在 EBS(AWS Elastic beanstalk)上有我的套接字服务器。 我在生产环境中遇到了类似的问题,但可以在不迁移到应用程序负载均衡器且不更改 ngnix 或 apache 配置的情况下解决该问题。

我为解决此问题所做的更改:我允许 443 上的 ssl 访问我的应用程序端口,而不是 https,并在我的安全组上打开端口 443

ebs_lb
ebs_sg

对于 AWS 上的用户:使用 Application Load Balancer 并确保您在目标组上启用了粘性。

事实证明,当我们的服务器过载且在高峰使用时间内,这种情况会间歇性地发生在我们的服务器上。

io.connect触发时允许默认设置会在不久之后创建 XHR 请求和 WS 请求(如上所述)。 所有这些 XHR 请求都使服务器超载,因此返回 400 错误。 通过使用上述将transports: ['websocket']}添加到客户端代码的建议,问题已得到解决。 如果 400 错误仍然存​​在,将发布更新,但现在看起来很可靠。

有同样的问题,上面建议的服务器端更改都没有解决它。 在客户端,我在反应模块中有socket = io.connect(); ,它能够找出我正在连接的服务器。
提供server参数来连接有点麻烦,但没有它我怎么能指定{ reconnect: true, transports: ['websocket', 'polling'] } ? 听起来可选参数是#1,但关键参数是#2

我在下面添加了这个,它对我有用。
地点 / {
proxy_pass http://localhost :8080;
proxy_http_version 1.1;
proxy_set_header 升级 $http_upgrade;
proxy_set_header 连接“升级”;
proxy_set_header 主机 $host;
}
https://chrislea.com/2013/02/23/proxying-websockets-with-nginx/

不幸的是,即使设置了好的标题,我也遇到了同样的问题..我用我的配置创建了一个stackoverflow ..

https://stackoverflow.com/questions/50431587/proxy-socket-io-fails-to-connect-with-nginx-node-on-docker

记下这里的双引号:

proxy_set_header 连接“升级”;

我使用单引号收到此消息,但使用双引号解决了它。

经过大约一个小时的故障排除后,如果您将端点作为集群运行,似乎可能需要一些额外的配置。

这里

tylercb 解决方案对我有用(NgInx)。 谢谢!

我们的关键是@tylercb解决方案中的proxy_http_version 1.1;

我根据这些评论在我的服务器上编辑了 NginX 配置。
但它部分工作。 起初,服务器重新启动后,它工作不好。 主要是硬刷新。 后来效果更好,只是有时需要硬刷新。
在本地使用sails lift它可以工作
但是,如果我在本地使用sails lift --prod ,那么我会得到同样的结果,该套接字无法连接并且 400 错误响应。 但经过一些尝试,它再次稳定。

这似乎仍未解决 - 没有找到最终解决方案为什么我们有这个..

我在文档中添加了各种配置: https ://socket.io/docs/using-multiple-nodes/

欢迎任何改进建议! => https://github.com/socketio/socket.io-website

我刚刚遇到这个问题,即使禁用我的 nginx 仍然会出错。 最后,由于express-status-monitor中间件在 express 上的问题,这使得 WebSocket 的第一次(请求)握手时的 HTTP 调用失败。

我尝试禁用该中间件并且 WebSocket 运行良好

在握手期间你会得到 400 有几个原因。 以下是一些可以尝试的事情

  1. 启用 443 in (ufw/Other) 防火墙以及 (AWS/Google cloud/Other) 控制台的设置
  2. 不要在 nodejs 服务器中启用 TLS。 通过 nginx 来完成。
  3. 使用以下 nginx 配置
    注意:这仅在您的 socket.io 连接已经工作但使用长轮询而不是 websockets 时才有效。 添加以下代码,它将开始使用 websocket。
        location /{
            proxy_pass http://127.0.0.1:5000/;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
        }

也许它会对某人有所帮助。 在我的应用程序中创建两个socket.io 实例时出现此错误。 我两次调用io = socketio(server)并得到错误 400。这是某种愚蠢的错误,但是……那是我的。

确保在应用程序负载均衡器中启用粘性会话(不要使用经典负载均衡器)。 如果您不使用粘性会话,您可能会随机收到 400 个错误。

这是因为当尝试从轮询升级到 websocket 时,负载均衡器可能会将升级请求平衡到从未遇到此套接字 id 的服务器并抛出 400 错误。 更多细节在这里: https ://socket.io/docs/using-multiple-nodes/

此外,如果您使用的是弹性 beanstalk,请在 .ebextensions 文件夹中添加以下 websocket.config 文件以支持 Nginx 升级到 Websockets:

container_commands:
  enable_websockets:
    command: |
     sed -i '/\s*proxy_set_header\s*Connection/c \
              proxy_set_header Upgrade $http_upgrade;\
              proxy_set_header Connection "upgrade";\
      ' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf

我用谷歌搜索,因为我遇到了同样的问题,而且我也使用 nginx。 解决方案是添加这部分

proxy_http_version 1.1;
proxy_set_header 升级 $http_upgrade;
proxy_set_header 连接“升级”;
proxy_set_header 主机 $host;

像提到的 tylercb 一样进入 nginx 配置文件。

所以至少当你使用 nginx 作为反向代理时这有效,这里是解释

WebSocket proxying
To turn a connection between a client and server from HTTP/1.1 into WebSocket, the protocol switch mechanism available in HTTP/1.1 is used.

There is one subtlety however: since the “Upgrade” is a hop-by-hop header, it is not passed from a client to proxied server. With forward proxying, clients may use the CONNECT method to circumvent this issue. This does not work with reverse proxying however, since clients are not aware of any proxy servers, and special processing on a proxy server is required.

Since version 1.3.13, nginx implements special mode of operation that allows setting up a tunnel between a client and proxied server if the proxied server returned a response with the code 101 (Switching Protocols), and the client asked for a protocol switch via the “Upgrade” header in a request.

As noted above, hop-by-hop headers including “Upgrade” and “Connection” are not passed from a client to proxied server, therefore in order for the proxied server to know about the client’s intention to switch a protocol to WebSocket, these headers have to be passed explicitly:

location /chat/ {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}
A more sophisticated example in which a value of the “Connection” header field in a request to the proxied server depends on the presence of the “Upgrade” field in the client request header:

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

    server {
        ...

        location /chat/ {
            proxy_pass http://backend;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    }
By default, the connection will be closed if the proxied server does not transmit any data within 60 seconds. This timeout can be increased with the proxy_read_timeout directive. Alternatively, the proxied server can be configured to periodically send WebSocket ping frames to reset the timeout and check if the connection is still alive.

关于这个问题的任何消息? 我在这里引用了它https://stackoverflow.com/questions/49575350/websocket-connection-to-wss-error-during-websocket-handshake-unexpected-re

许多用户由于 nginx 配置而遇到此问题,而在专用服务器上,您可以使用上述想法(nginx 配置等)修复它,许多用户无权访问这些设置,因此拥有某种设置会很棒从sockets.io修复这个......

没有人?

@deemeetree
如果您使用多个节点,这在我看来可能是由于您网站上的错误消息“会话 ID 未知”,您应该查看我在 StackOverflow (https://stackoverflow.com/a/53163917/6271092)上的回答。

简而言之,socket.io 正如他们在他们的网站(https://socket.io/docs/using-multiple-nodes/)上所说的那样,

如果您计划在不同的进程或机器之间分配连接负载,则必须确保与特定会话 ID 关联的请求连接到发起它们的进程。

这是由于某些传输(如 XHR 轮询或 JSONP 轮询)依赖于在“套接字”的生命周期内触发多个请求。 未能启用粘性平衡将导致可怕的:

Error during WebSocket handshake: Unexpected response code: 400

所以你不能有多个在不同节点上工作的套接字。 按照说明重新配置您的服务器。 对于您的 Express,请像这样配置您的端口,
parseInt(your_port) + parseInt(process.env.NODE_APP_INSTANCE);

希望能帮助到你。

直接连接到我在 Windows Server 2008R2 上托管的应用程序时遇到同样的错误(无代理,无 IIS)。 两者之间只有愚蠢的中间硬件。

我在 Window server 2016 上面临同样的问题,请提及您的修复。 谢谢

我面对这个问题已经有一段时间了。 如果有人有任何信息,请帮助。 我正在使用apache服务器。

有什么线索吗? 在开发上效果很好,但在 SSL 上也有同样的问题。

使用 PM2 节点集群模式:4 x 1

使用apache代理,还是没有头绪

对于那些使用 httpd2/apache2 的人,我有一个似乎可行的解决方案:

    ProxyRequests Off
    <Location />
        ProxyPass http://127.0.0.1:1337/
        ProxyPassReverse http://127.0.0.1:1337/

        RewriteEngine On
        RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
        RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
        RewriteRule /socket.io/(.*) ws://127.0.0.1:1337/socket.io/$1 [P]
    </Location>

@ZeldaZach是用于 .htaccess 文件的吗? 谢谢!

这个配置在我的 sites-enabled/site.conf 文件中,但它也应该在 htaccess 中工作 afaik

我只能说,SSL 是罪魁祸首 :) 禁用、cloudflare 灵活的 SSL 模式并移至 FULL(STRICT) 模式。 当然这会解决问题,
如果不,

在反向代理配置中使用localhost:port

对于这里使用 Nginx 和 React Express (MERN) 的任何人。 我遇到了同样的问题,因为我只有proxy_pass http://localhost:3000;行。 我在此线程中根据上面的@tylercb答案添加了以下几行:

“有同样的问题,我的应用程序落后于 nginx。对我的 Nginx 配置进行这些更改消除了错误。

location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}

这最初来自https://chrislea.com/2013/02/23/proxying-websockets-with-nginx/

如果有人在使用 Nodejs + Express 时仍然遇到问题,那么您的问题可能是express-status-monitor ,正如@slaveofcode提到的那样。 正如其NPM 文档中所述,该模块生成自己的 socket.io 实例,因此您应该使用您的主 socket.io 实例以及端口参数填充 websocket 参数:

const io = require('socket.io')(server);
const expressStatusMonitor = require('express-status-monitor');
app.use(expressStatusMonitor({
  websocket: io,
  port: app.get('port')
}));

这是我的 Apache 配置,请注意它使用了/ws/路径前缀,但除此之外它工作正常。

    ProxyRequests Off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    RewriteEngine On
    RewriteCond %{REQUEST_URI}  ^/ws/socket.io         [NC]
    RewriteCond %{QUERY_STRING} transport=websocket    [NC]
    RewriteRule /ws/(.*)           ws://localhost:6001/$1 [P,L]
    ProxyPass /ws http://127.0.0.1:6001
    ProxyPassReverse /ws http://127.0.0.1:6001

目前面临这个问题,为我们的 EKS 集群公开 Linkerd 仪表板(服务网格)。 我们使用 nginx,所以目前不完全确定如何摆脱那个。

@andrzj 天哪,你刚刚救了我。

有同样的问题,我的应用程序落后于 nginx。 对我的 Nginx 配置进行这些更改消除了错误。

地点 / {
proxy_pass http://localhost :8080;
proxy_http_version 1.1;
proxy_set_header 升级 $http_upgrade;
proxy_set_header 连接“升级”;
proxy_set_header 主机 $host;
}

这最初来自https://chrislea.com/2013/02/23/proxying-websockets-with-nginx/

有用。

谢谢帮帮! 如果有人试图让它在正常的 HTTPS 流量旁边工作,它现在正在使用以下设置为我处理 Elastic Beanstalk:

  • 在 Elastic Beanstalk 上:nginx 已关闭(目前,还没有尝试上述配置)。
  • 在 Elastic Beanstalk 上:负载均衡器如下:
  • 在节点/快递上: const io = require('socket.io')(3030)
  • 在客户端只需命名let connection = io(https://www.myurl.com:3030)

如果你们仍然有这个问题,并且您已将套接字服务器中的允许来源设置为数组或来源而不是回调函数来过滤来源,则会引发此错误

Error during WebSocket handshake: Unexpected response code: 400

在我的情况下更新这个逻辑

io.origins(['https://foo.example.com:443']);

对此

io.origins((origin, callback) => {  
     if (origin !== 'https://foo.example.com') {    
         return callback('origin not allowed', false);  
     }  
    callback(null, true);
});

工作没有抛出任何错误。

得到同样的错误,但我在 NGINX 的配置中添加了,我仍然收到同样的 400 握手错误。 但是,我在 AWS 中使用应用程序负载均衡器,并将其设置为 :80 目标组和转发到目标组的 443 侦听器。

NGINX 配置文件:

`服务器{

listen [::]:80;
listen 80;

server_name <domain_name>;
access_log  /var/log/nginx/access.log;

location / {
    proxy_pass http://127.0.0.1:8000;
    include proxy_params;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
}

location /socket.io {
    include proxy_params;
    proxy_http_version 1.1;
    proxy_cache_bypass $http_upgrade;
    proxy_buffering off;
    proxy_set_header Host $host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_pass http://127.0.0.1:8000;
}

}`

在我的 js 文件中,我有一个 socket.io 的连接,如下所示:
var socket = io()

创建手动实例(没有 express app实例)并分配不同的端口

const io = require('socket.io')(3001, {
  path: '/',
  serveClient: false,
  // below are engine.IO options
  pingInterval: 10000,
  pingTimeout: 5000,
  cookie: false
})

有同样的问题,我的应用程序落后于 nginx。 对我的 Nginx 配置进行这些更改消除了错误。

地点 / {
proxy_pass http://localhost :8080;
proxy_http_version 1.1;
proxy_set_header 升级 $http_upgrade;
proxy_set_header 连接“升级”;
proxy_set_header 主机 $host;
}

这最初来自https://chrislea.com/2013/02/23/proxying-websockets-with-nginx/

我错过proxy_set_header Connection "upgrade";

当我开始使用httpswssssl时,我已经花了整整一个晚上来解决这个问题。 它总是说connection stopped before establish400错误代码。

就在几分钟前,我找到了一个解决方案:

0. Cloudflare

在 SSL/TLS 选项卡上:

  • 如果您有自己的certSSLHTTPS :将其设置为Full 。 (以下123步假设你有自己的https认证)

  • 如果您只有http server :将其设置为Flexible 。 (Cloudflare 会自动将httpsssl添加到您的网站。)

  • 之后,转到 DNS 选项卡,设置Proxied

如果您不确定自己在做什么,只需转到 DNS 选项卡,设置DNS only

1. 确保您有正确的代理配置。

server {
    listen 80;
    server_name ai-tools-online.xyz;
    return 301 https://ai-tools-online.xyz$request_uri;
}

server {
    listen 443 ssl http2;

    ssl_certificate       /data/v2ray.crt;
    ssl_certificate_key   /data/v2ray.key;
    ssl_protocols         TLSv1.2 TLSv1.3;
    #ssl_ciphers           3DES:RSA+3DES:!MD5;
    server_name ai-tools-online.xyz;

    location / {
        proxy_pass http://127.0.0.1:5000;
    }

    location /socket.io {
        proxy_http_version 1.1;
        proxy_buffering off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_pass http://127.0.0.1:5000/socket.io;
    }
}

ai-tools-online.xyz是您的域, http://127.0.0.1:5000是您的套接字服务器。

2. 确保您的服务器Cross-Origin Controls设置为'*'以允许Cross-Origin Access

对于flask-socketio ,是使用flask_socketio.SocketIO(app, cors_allowed_origins = '*')

3. 必须重启 nginx 才能让新配置生效

systemctl restart nginx

4. 关于如何设置caddy的更多详细信息,请参见以下链接:

https://github.com/yingshaoxo/Web-Math-Chat#reverse -proxy-configuration-for-https
https://caddy.community/t/using-caddy-0-9-1-with-socket-io-and-flask-socket-io/508/6
https://www.nginx.com/blog/nginx-nodejs-websockets-socketio/

我用谷歌搜索,因为我遇到了同样的问题,而且我也使用 nginx。 解决方案是添加这部分

proxy_http_version 1.1;
proxy_set_header 升级 $http_upgrade;
proxy_set_header 连接“升级”;
proxy_set_header 主机 $host;

像提到的 tylercb 一样进入 nginx 配置文件。

为我工作得很好,谢谢!

如果您像我一样使用 Elastic Beanstalk 创建节点服务器,
在创建环境时,我们被要求在配置中使用哪个代理服务器。 其中 nginx 是预先填充或默认设置的。
我将该代理服务器设置为无,然后继续继续创建我的服务器。 我正在使用 Elastic Beanstalk 创建一个节点服务器,其中我的代理服务器默认设置为 nginx。
因为它是配置代理服务器的错误。 删除任何代理服务器后,错误消失了。

谷歌搜索了几个小时,因为我们只有一个 nodejs 应用程序而没有 nginx,所以上述解决方案都没有适用于我们。

我们解决这个问题的方法只是从容器中禁用 nginx -> 负载均衡器设置以将所有流量直接传递到节点。

谷歌搜索了几个小时,因为我们只有一个 nodejs 应用程序而没有 nginx,所以上述解决方案都没有适用于我们。

我们解决这个问题的方法只是从容器中禁用 nginx -> 负载均衡器设置以将所有流量直接传递到节点。

你是怎么做到的?

如果您转到配置 > 负载均衡器,您可以找到代理服务器的下拉菜单,您可以使用 nginx、Apache 或将其设置为“无”以通过所有连接到节点应用程序。

这仅在您使用负载均衡器创建环境时出现,不适用于单个实例

编辑:我原来的评论是指 Elastic Beanstalk

有同样的问题,我的应用程序落后于 nginx。 对我的 Nginx 配置进行这些更改消除了错误。

地点 / {
proxy_pass http://localhost :8080;
proxy_http_version 1.1;
proxy_set_header 升级 $http_upgrade;
proxy_set_header 连接“升级”;
proxy_set_header 主机 $host;
}

这最初来自https://chrislea.com/2013/02/23/proxying-websockets-with-nginx/

所以,谢谢你。

本文档适用于使用 laravel-echo-server & Nginx & socket.io & Redis-server 且客户端项目和 Redis-server 之间的服务器分开的用户。

请点击此处的链接。

谢谢

我有这个问题。 更新我的 nginx 配置没有帮助,但@santhosh77h的解决方案为我修复了它。 由于某种原因,传递允许的来源数组不起作用,但使用回调可以。

我使用 Nest.js websockets(只是 Socket.io 的一个包装器)并将以下内容添加到我的网关中:

afterInit(server: Server): any {
    const origins = getOrigins(); // returns an array of origin strings
    server.origins((origin, cb) => {
      if (origins.includes(origin)) {
        cb(null, true)
      } else {
        cb('Invalid origin', false);
      }
    });
  }

AWS Elastic Beanstalk (Nginx proxy)上运行Node.js / Express 的 NUXT.js也遇到了同样的问题。 我花了几天时间才弄清楚这一点。 我会分享我的阅读点。 也许有人会发现它很有用。

我的环境在Application Load Balancer上,有两个端口 80 用于 https,443 用于带有 SSL 的 https。

结合上面的答案,非常感谢@tylercb和来自AWS的官方文档和socket.io 文档,我创建了一个 Nginx 配置文件,似乎可以解决这个问题。

我将快速概述步骤:

在我的 index.js 节点文件中:

const express = require('express')
const app = express()
const server = http.createServer(app)
const io = require('socket.io')(server)
const host = process.env.HOST || '127.0.0.1'
const port = process.env.PORT || 8081

在前端(我的组件之一):
import io from 'socket.io-client';
在我的 Vue 数据()中:
socket: io()

最后,在应用程序根目录中,我创建了一个文件夹 .ebextensions
在里面我创建了一个 01-proxy.config 文件,内容如下:

files:
  /etc/nginx/conf.d/01-proxy.conf:
     mode: "000644"
     owner: root
     group: root
     content: |
        upstream nodejs {
          server 127.0.0.1:8081;
          keepalive 256;
        }
        server {
          listen 8080;
          server_name yourdomain.com;

          if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") {
            set $year $1;
            set $month $2;
            set $day $3;
            set $hour $4;
          }
          access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd;
          access_log  /var/log/nginx/access.log  main;

          location / {
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header Host $host;

              proxy_pass http://nodejs;

              proxy_http_version 1.1;
              proxy_set_header Upgrade $http_upgrade;
              proxy_set_header Connection "upgrade";
          }

          gzip on;
          gzip_comp_level 4;
          gzip_types text/html text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

          location /static {
              alias /var/app/current/static;
          }

        }

  /opt/elasticbeanstalk/hooks/configdeploy/post/99_kill_default_nginx.sh:
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/bin/bash -xe
      rm -f /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf
      service nginx stop 
      service nginx start

container_commands:
  removeconfig:
    command: "rm -f /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf"

附加读数:
nginx配置

而已。 相当冗长。 我很抱歉,祝你好运。

在 ubuntu 和 ngnix 服务器中为 angular .net core 更改下面为我工作

地点 / {
proxy_pass http://localhost :8080;
proxy_http_version 1.1;
proxy_set_header 升级 $http_upgrade;
proxy_set_header 连接“升级”;
proxy_set_header 主机 $host;
}

如果有人在使用 Nodejs + Express 时仍然遇到问题,那么您的问题可能是express-status-monitor ,正如@slaveofcode提到的那样。 正如其NPM 文档中所述,该模块生成自己的 socket.io 实例,因此您应该使用您的主 socket.io 实例以及端口参数填充 websocket 参数:

const io = require('socket.io')(server);
const expressStatusMonitor = require('express-status-monitor');
app.use(expressStatusMonitor({
  websocket: io,
  port: app.get('port')
}));

这个信息帮助了我

确保您的 socket.io 连接没有通过 Amazon 负载均衡器。 或者如果是这样,请执行以下操作:http: //blog.flux7.com/web-apps-websockets-with-aws-elastic-load-balancing

如果其他人在使用 AWS 负载均衡器时遇到此问题,所提及的文章并没有说也可以使用 SSL 作为负载均衡器协议并在此配置上继续使用您的证书,而不是您的应用程序服务器级别。

这就是我的 LB 听众的样子

image

对我来说效果很好!

有同样的问题,我的应用程序落后于 nginx。 对我的 Nginx 配置进行这些更改消除了错误。

地点 / {
proxy_pass http://localhost :8080;
proxy_http_version 1.1;
proxy_set_header 升级 $http_upgrade;
proxy_set_header 连接“升级”;
proxy_set_header 主机 $host;
}

这最初来自https://chrislea.com/2013/02/23/proxying-websockets-with-nginx/

是的。 这很有帮助,也对我有用。

确保您的 socket.io 连接没有通过 Amazon 负载均衡器。 或者如果是这样,请执行以下操作:http: //blog.flux7.com/web-apps-websockets-with-aws-elastic-load-balancing

如果其他人在使用 AWS 负载均衡器时遇到此问题,所提及的文章并没有说也可以使用 SSL 作为负载均衡器协议并在此配置上继续使用您的证书,而不是您的应用程序服务器级别。

这就是我的 LB 听众的样子

image

对我来说效果很好!

很好,它奏效了。

确保您的 socket.io 连接没有通过 Amazon 负载均衡器。 或者如果是这样,请执行以下操作:http: //blog.flux7.com/web-apps-websockets-with-aws-elastic-load-balancing

如果其他人在使用 AWS 负载均衡器时遇到此问题,所提及的文章并没有说也可以使用 SSL 作为负载均衡器协议并在此配置上继续使用您的证书,而不是您的应用程序服务器级别。

这就是我的 LB 听众的样子

image

对我来说效果很好!

在这种情况下,您的应用程序在 80 上运行?

此页面是否有帮助?
0 / 5 - 0 等级