Nginx WebSocket 代理

Nginx WebSocket 代理

💡 原文中文,约1300字,阅读约需3分钟。
📝

内容提要

本文讨论了如何在nginx中将HTTP/1.1连接转换为WebSocket,特别是配置代理时的注意事项。由于Upgrade标头不会传递到代理服务器,需要通过特定设置确保代理服务器能够理解协议切换的意图。文中提供了示例代码,并提到连接超时的处理方法。

🔎

延伸解读

为什么需要显式传递 Upgrade 和 Connection 标头

Upgrade 和 Connection 属于逐跳标头,不会从客户端自动传递到代理服务器。因此,在 nginx 反向代理配置中,必须使用 proxy_set_header 显式设置这两个标头,才能让代理服务器理解客户端希望将协议切换为 WebSocket 的意图。否则,代理服务器无法正确升级连接。

nginx 对 WebSocket 代理的支持条件

从 1.3.13 版本开始,nginx 实现了特殊操作模式:当代理服务器返回 101 切换协议响应,且客户端请求中包含 Upgrade 标头时,nginx 能够正确处理协议切换。这意味着使用较旧版本的 nginx 可能无法正常代理 WebSocket 连接,升级版本是必要前提。

连接超时与保活策略

默认情况下,如果代理服务器在 60 秒内没有传输任何数据,连接会被关闭。可以通过 proxy_read_timeout 指令增加超时时间,或者配置代理服务器定期发送 WebSocket ping 帧来重置超时并检查连接有效性。这两种方法都能避免因空闲导致的连接中断。

❓

Q&A

如何在nginx中将HTTP/1.1连接转换为WebSocket?

可以通过HTTP/1.1中的协议切换机制,将连接转换为WebSocket,特别是需要确保Upgrade和Connection标头被正确传递。

nginx如何处理Upgrade标头?

Upgrade标头不会从客户端传递到代理服务器,因此需要通过特定设置在nginx中明确传递该标头。

nginx从哪个版本开始支持WebSocket协议切换?

nginx从1.3.13版本开始支持代理服务器返回101响应以切换协议。

如何增加nginx的连接超时设置?

可以使用proxy_read_timeout指令来增加连接超时,或者配置代理服务器定期发送WebSocket ping帧。

在nginx中配置WebSocket代理时需要注意什么?

需要确保Upgrade和Connection标头被明确传递,以告知代理服务器协议切换的意图。

nginx如何处理WebSocket连接的超时问题?

默认情况下,如果代理服务器在60秒内没有传输数据,连接将被关闭,可以通过设置proxy_read_timeout来调整此超时。

🏷️

标签

➡️

继续阅读