Nginx 没有将 websocket 升级响应传递回客户端?

2024-03-29

我在精确的 64 vagrant box 上使用 Nginx + Websockets,并使用 c#/mono 作为应用程序服务器。目标是直接通过 Nginx 提供静态内容,并在同一端口上处理普通的 http 服务请求(在 /service 上)和 websocket 请求(在 /webSocket 上)。这是相关的配置:

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

server {
    listen              80  default_server;

    # (1)
    location / {
        root            /var/www;
        index           index.html;
    }

    # (2)
    location /service {
        add_header      Access-Control-Allow-Origin *;
        proxy_pass      http://localhost:9000;
    }

    # (3)
    location /webSocket {
        proxy_pass         http://localhost:9000;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection $connection_upgrade;
    }
}

大部分都运行良好。静态内容,是的,服务请求,是的,甚至是 websockets 的第一部分。我从我的客户端(Firefox 或 Chrome)收到格式正确的 101 切换协议请求。我正在制作一个很好的 http 升级响应并发送它。然后客户什么也没做……什么也没有收到。

但疯狂的是,当我放弃并手动终止我的服务器端应用程序,并且客户端 Web 套接字因错误关闭时,响应标头就会显示在客户端浏览器调试器上。整个事情看起来像:

REQUEST HEADERS
Request URL:    http://localhost:8086/webSocket
Request Method:     GET
Status Code:    HTTP/1.1 101 Switching Protocols
Request Headers 16:18:50.000
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0)    Gecko/20100101  Firefox/38.0
Upgrade:    websocket
Sec-WebSocket-Version:  13
Sec-WebSocket-Key:  Nx0sUAemOFWM2rsaCAJpfQ==
Sec-WebSocket-Extensions:   permessage-deflate
Pragma: no-cache
Origin: http://localhost:8086
Host:   localhost:8086
Connection: keep-alive, Upgrade
Cache-Control:  no-cache
Accept-Language:    en-US,en;q=0.5
Accept-Encoding:    gzip, deflate
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

RESPONSE HEADERS Δ19660ms
Upgrade:    websocket
Transfer-Encoding:  chunked
Server: nginx/1.1.19
Sec-WebSocket-Accept:   gNiAeqxcVjkiReIpdtP0EZiClpg=
Date:   Mon, 08 Jun 2015 20:18:48 GMT
Connection: keep-alive

NO RESPONSE BODY Δ0ms

没有证据表明我的服务器应用程序没有立即刷新其发送数据 - 我正在使用异步 TcpSocket.BeginSend 和 FinishSend 并且发送似乎立即完成。它在普通的 http 服务通信上工作得很好。

那么我的 websocket 消息数据去哪里了???看起来 Nginx 不想将其发送回我的客户端,除非我从服务器端关闭 Tcp 连接。

有没有人经历过类似的事情。我读到的关于 Nginx 和 Websockets 的所有内容都与使逐跳升级正常工作的基本设置有关,我已经了解了。没有人可以解释为什么从服务器端发回的消息似乎没有到达任何地方。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx 没有将 websocket 升级响应传递回客户端? 的相关文章

  • 在 WCF 上重用我的 PagedList 对象

    问题 我有一个自定义集合PagedList
  • C# 中类似图的实现

    所以我有一个对象 我们称之为 Head 它有一个对象列表 C C1 C2 C3 T T1 T2 和 M M1 M2 并且所有这些都是相互关联的 例如 Head gt C1 C2 C3 T1 T2 M1 M2 T1 gt C1 C2 T2 g
  • 选择initializer_list迭代器定义

    Why std initializer list
  • 从内存流播放视频文件

    只是好奇看看这是否可能 我有一个 Windows 应用程序 它从我的电脑上的 avi 文件读取所有字节 然后将其存储在 byte 中 现在我的内存中有 avi 文件 我想直接从内存将其加载到某种视频播放器控件中 我尝试过使用 wmplaye
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • 如何使用 CUDA/Thrust 对两个数组/向量根据其中一个数组中的值进行排序

    这是一个关于编程的概念问题 总而言之 我有两个数组 向量 我需要对一个数组 向量进行排序 并将更改传播到另一个数组 向量中 这样 如果我对 arrayOne 进行排序 则对于排序中的每个交换 arrayTwo 也会发生同样的情况 现在 我知
  • C# 中的抽象类和接口类有什么不同?

    C 中的抽象类和接口类有什么不同 An 接口不是类 它只是一个contract定义了public一个类的成员must实施 抽象类只是一个类 您从中可以cannot创建一个实例 通常您会使用它来定义一个基类 该基类定义了一些virtual方法
  • 为什么 BinaryFormatter 可以序列化 Action<> 但 Json.net 不能

    尝试序列化 反序列化 Action 尝试我的 1天真 JsonConvert SerializeObject myAction JsonConvert Deserialize
  • 原子存储抛出错误

    我最近升级到了 C 11 兼容编译器 并且尝试将一些代码从 boost 更新到 c 11 标准 我在使用atomic store转换一些代码时遇到了问题 这是一些简单的测试代码 似乎会引发编译器错误 int main std shared
  • 节点*链表中的下一个

    我是数据结构和算法的新手 我遇到了以下代码 typedef struct node int data node next 谁能告诉我为什么我们要声明节点 next next 不能声明为 int next 吗 因为你希望能够做到n gt ne
  • 本地时间的内存需要释放吗?

    void log time t current time 0 tm ptm localtime current stuf 只是想确定 我是否需要在方法结束时释放 tm 指针分配的内存 不 你不应该释放它 该结构是静态分配的 检查文档 htt
  • 使用 OleDbCommand / OleDbDataAdapter 读取 CSV 文件

    我不明白为什么 但是当我使用 OleDbDataAdapter 或 OleDbCommand 读取 CSV 文件时 在这两种情况下 生成的数据结构良好 它识别文件头中的列 但行数据都是空字符串 我之前已经成功进行过多次 CSV 处理 因此我
  • 冒号在c中起什么作用?

    我在课堂上得到了这个例子 但我不确定它的作用 我知道冒号添加了一个位字段 但我仍然不确定这个问题 a b gt 0 3 1 运算符称为条件运算符 If b值为 gt 0 价值3被分配给a否则值1被分配给a 以 Kernighan Ritch
  • 如果finally 块包含await,为什么*有时*不会在ThreadAbortException 上执行?

    UPDATE 我不认为这个问题是重复的ThreadAbortException最后可以跳过吗 https stackoverflow com questions 18002668 can threadabortexception skip
  • 从 C# 调用时无法识别 Powershell 命令

    这是这个的延续Question https stackoverflow com questions 66280000 powershell object returns null 66280138 noredirect 1 comment1
  • 使用 cmake 将两种解决方案合二为一

    我有两个单独的 Visual Studio 2013 解决方案 我想将它们迁移到一个解决方案中 因为第一个解决方案 使用 Qt 充当第二个解决方案的 GUI 最后 我希望有一个结构如下的单一解决方案 Solution All Build P
  • 使用任务的经典永无止境的线程循环?

    给出了一个非常常见的线程场景 宣言 private Thread thread private bool isRunning false Start thread new Thread gt NeverEndingProc thread S
  • C# PasswordDeriveBytes:似乎 Salt 并不重要

    可能我误解了什么 以下代码通过 CryptDeriveKey 使用两种不同的盐生成两个相等的密钥 这是控制台结果 盐1 21 3e 18 a3 9a 8b 5f gt 键 da 89 ea 3d 91 08 20 98 20 e9 dc 4
  • 检查一个数是否是完全平方数?

    我认为以下代码存在精度问题 bool isPerfectSquare long long n long long squareRootN long long sqrt n 0 5 return squareRootN squareRootN
  • 强制函数调用的顺序?

    假设我有一个抽象基类 并且我想要一个必须由派生类实现的纯虚方法 但我想确保派生方法以特定顺序调用函数 我可以做什么来强制执行它 I E base class virtual void doABC 0 virtual void A 0 vir

随机推荐