# nginx配置wss反向代理
# 背景
最近需要配置一个web服务,该web服务提供了HTTP
和wss
两种协议通信,在配置反向代理的过程中,wss
协议的请求一直失败。了解后发现是相关参数未设置的问题,下面我将就我遇到的这个问题,简要的介绍一下什么是wss协议,以及如何正确的配置nginx
代理wss
。
# 什么是wss
WSS, 全称:WebSocket Secure
。顾名思义,就是安全的WebSocket
协议。
WebSocket
是一种网络协议,它允许在客户端和服务器之间建立全双工的通信连接,这意味着双方可以同时发送和接收数据。与传统的HTTP
协议不同,WebSocket
连接在建立之后保持打开状态,可以实时传输数据,而不需要不断地发起新的HTTP
请求。
WSS协议是WebSocket
协议的加密版本,用于在安全的TLS/SSL连接上进行WebSocket
通信。以下是WSS协议的一些关键步骤:
- 握手过程:
- 客户端向服务器发起
WebSocket
握手请求,这与普通的HTTP
握手类似。 - 但在WSS中,客户端与服务器之间的通信将使用TLS/SSL进行加密,确保数据的机密性和完整性。
- 服务器接收握手请求后,响应并建立
WebSocket
连接,确认使用WSS协议进行加密通信。
- 数据传输:
- 一旦握手成功,
WebSocket
连接就建立起来了,客户端和服务器可以开始实时地在双方之间传输数据。 - 这些数据可以是文本、二进制数据或任何其他格式,具体取决于应用程序的需求。
- 保持连接:
WebSocket
连接是持久的,不像HTTP
协议那样每次请求都需要重新建立连接。这使得WebSocket
非常适合需要实时通信的应用,如聊天应用、在线游戏等。
- 关闭连接:
- 当通信结束或需要关闭连接时,可以通过发送特定的关闭帧来关闭
WebSocket
连接。
# 如何正确的配置nginx
代理wss
通过上面的简要学习,我们知道了wss协议是基于WebSocket
的,而WebSocket
协议通常需要使用HTTP
/1.1或更高版本的HTTP
协议来建立初始连接。WebSocket
连接的建立过程始于一个HTTP
握手(handshake),其中包括客户端向服务器发送一个HTTP
请求,并在服务器响应中包含与WebSocket
相关的头信息。
具体来说,WebSocket
连接建立过程如下:
- 客户端发起一个
HTTP
请求到WebSocket
服务器,该请求包含一个特殊的HTTP
头字段:Upgrade:
WebSocket``和Connection: Upgrade
,以表示客户端希望升级到WebSocket
协议。 - 服务器接收到这个
HTTP
请求后,如果支持WebSocket
,会响应一个101状态码的HTTP
响应,同时包含一些WebSocket
特定的头信息,如Upgrade:
WebSocket``和Connection: Upgrade
。这表示升级到WebSocket
协议。 - 一旦这个
HTTP
握手成功完成,连接将从普通的HTTP
协议切换到WebSocket
协议,允许双向实时通信。
所以相比常规的HTTP
协议代理,我们需要新增下面两项:
proxy_set_header Upgrade $`HTTP`_upgrade;
proxy_set_header Connection "upgrade";
其中,$HTTP
_upgrade 是一个Nginx内置变量,通常用于配置WebSocket
反向代理时。它用于控制升级头部的值,这在WebSocket
连接中非常重要。当客户端发送WebSocket
连接请求时,服务器需要升级HTTP
协议为WebSocket
协议。