gpt4 book ai didi

Websocket 握手与 HAProxy 挂起

转载 作者:行者123 更新时间:2023-12-02 10:20:58 25 4
gpt4 key购买 nike

使用最新的 Chrome 浏览器,我尝试使用 sockjs 客户端与 haproxy 后面的后端服务器进行通信。在我的本地主机上(中间没有 haproxy),这工作正常 - 客户端可以使用 websocket 协议(protocol)连接、发送和接收消息。例如:

conn.onopen = function() {
if (conn.readyState === SockJS.OPEN) {
conn.send("hello server");
console.log("msg sent");
}
};

一旦我使用 HAProxy 将其部署到服务器上,奇怪的事情就会发生,sockjs 认为连接已打开(如 conn.readyState === SockJS .OPEN 和“消息已发送”出现在控制台日志中),但是,websocket 握手只是挂起,服务器永远不会收到消息。以下是我在 haproxy 日志中看到的内容:

Oct 23 09:08:25 localhost.localdomain haproxy[14121]: 129.xx.xxx.105:55000 [23/Oct/2012:09:08:24.459] public www/content 777/0/0/1/778 200 375 - - ---- 3/3/0/1/0 0/0 "GET /sockjs/info HTTP/1.1"
Oct 23 09:10:54 localhost.localdomain haproxy[14121]: 129.xx.xxx.105:55015 [23/Oct/2012:09:08:25.398] public www/content 0/0/0/1/149017 101 147 - - CD-- 4/4/0/0/0 0/0 "GET /sockjs/478/kyi342s8/websocket HTTP/1.1"

请注意,第二条日志消息仅在我关闭 haproxy 后面的后端服务器时出现。关闭之前,日志中没有错误,但 websocket 握手未完成,服务器没有收到任何消息。

使用 Chrome 的开发者工具,在“网络”选项卡中,我看到以下内容:

Request URL:ws://www.mysite.com/sockjs/478/kyi342s8/websocket
Request Method:GET
Status Code:101 Switching Protocols

Request Headers
Connection:Upgrade
Host:www.mysite.com
Origin:http://www.mysite.com
Sec-WebSocket-Extensions:x-webkit-deflate-frame
Sec-WebSocket-Key:TFEIKYhlqWWBZKlXzXAuWQ==
Sec-WebSocket-Version:13
Upgrade:websocket
(Key3):00:00:00:00:00:00:00:00

Response Headers
Connection:Upgrade
Sec-WebSocket-Accept:D+s3va02KH6QTso24ywcdxcfDgM=
Upgrade:websocket
(Challenge Response):00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00

并且 websocket 对象的“类型”和“时间延迟”在开发者工具的网络选项卡下均显示“待处理”。

最后,这是我的 haproxy 配置(版本 1.4.22):

global
log 127.0.0.1 local1 info
log 127.0.0.1 local1 notice
#log loghost local0 info
maxconn 4096
chroot /usr/share/haproxy
uid 99
gid 99
daemon
#debug
#quiet

defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
maxconn 500
timeout connect 6s

frontend public
mode http
bind *:80
timeout client 300s
option http-server-close
#option http-pretend-keepalive
# define ACLs
acl host_static hdr_beg(host) -i static. data.
acl host_www hdr_beg(host) -i www.
acl url_static path_end .ico .txt .pdf .png .jpg .css .js .csv
acl is_stats path_beg /haproxy/stats
# define rules
use_backend nginx if host_static or host_www url_static
use_backend stats if is_stats
default_backend www

backend nginx
timeout server 20s
server nginx 127.0.0.1:8484

backend stats
stats enable
stats uri /haproxy/stats

backend www
timeout server 300s
option forwardfor
#no option httpclose
option http-server-close
server sockcontent 127.0.0.1:8080

有谁知道为什么会这样吗?是否是由于某些 haproxy 配置,甚至是服务器的某些常规网络设置(例如 iptables)?

附注我尝试在 haproxy 中启用 http-pretend-keepalive,但它不起作用。

最佳答案

就像@Joes所说,这是防火墙行为不当的错误。有人说 FortiGate 等原因导致了这种情况。

更多讨论:https://github.com/sockjs/sockjs-client/issues/94

通过 SSL 提供 SockJS 似乎可以解决这个问题。

关于Websocket 握手与 HAProxy 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13032005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com