Nginx 做 websocket 代理

65535 个客户端连接

前两天 FE 朋友转我一个问题。

1
2
3
4
5
6
7
关于pipeline回显这块,我还是建议做轮询,如果用websocket的话,假设单击(机)

我开30个进程,3台机器也就能同时处理90个。而轮询的话是轮询一次后台就释

放。另外就是由于公司nginx的限制,websocket也只支持30s内,超过30s就强制

断开了。

让我想起来了很久前的另一个事情:

1
2
3
A: 服务端最多支持 65535 个客户端连接
me: 为什么呀?
A: 只有 65535 个端口可用呀...

世间怎还会有如此愚不可及、蠢不可耐的人。

至于 nginx 对 websocket 支持只有 30 秒的事情,想了一会,愣是没有一点印象对。

先前还做过类似的工作: feat: add websocket support to the proxy server,

感觉有点奇怪,赶紧搜索资料简单验证了一下,发现真有超时的的问题。由仔细读一遍

文档,在尾部发现:

1
2
3
4
5
6
7
8
9
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.

原文大意:

1
2
3
4
5
60s 没有数据传输,连接就会关闭,可以通过proxy_read_timeout 配置项增加时间。

或者,上游服务端定期发送 ping 帧给 nginx 用于重置超时时间、检测连接是否

仍旧保持活着。

一点印象没有,看来当时没有完全理解这段话的含义, 五十步笑百步而。

再遇 Hop-by-Hop

前两年写 orange 的插件的时候就发现 HOP-by-Hop 头无法用 ngx.req.set_header 操作,说来惭愧,当时虽然感觉概念很奇怪,但也一直没去调查具体的含义。凑着这次机会,往前走了一小步。发现了很有意思的另外一个概念 End-to-End。

设想这么一个简单的场景,比如一个数据包的路径是 C-P-K-S 若干节点,如果 C 发出的数据包中的字段,在 P 节点被丢弃,那么这个字段就是 Hop-by-Hop ( 逐跳, 比如Http 1.1 中的Upgrade)字段,如果这个字段需要原封不动的传递到 S,那么这个字段就是 End-to-End(端到端)字段。


Nginx 做 websocket 代理
http://blog.soul11201.com/2019/09/02/Hoy-by-Hop/
作者
soul11201
发布于
2019年9月2日
许可协议