# nginx配置wss反向代理

# 背景

最近需要配置一个web服务,该web服务提供了HTTPwss两种协议通信,在配置反向代理的过程中,wss协议的请求一直失败。了解后发现是相关参数未设置的问题,下面我将就我遇到的这个问题,简要的介绍一下什么是wss协议,以及如何正确的配置nginx代理wss

# 什么是wss

WSS, 全称:WebSocket Secure。顾名思义,就是安全的WebSocket协议。

WebSocket是一种网络协议,它允许在客户端和服务器之间建立全双工的通信连接,这意味着双方可以同时发送和接收数据。与传统的HTTP协议不同,WebSocket连接在建立之后保持打开状态,可以实时传输数据,而不需要不断地发起新的HTTP请求。

WSS协议是WebSocket协议的加密版本,用于在安全的TLS/SSL连接上进行WebSocket通信。以下是WSS协议的一些关键步骤:

  1. 握手过程:
  • 客户端向服务器发起WebSocket握手请求,这与普通的HTTP握手类似。
  • 但在WSS中,客户端与服务器之间的通信将使用TLS/SSL进行加密,确保数据的机密性和完整性。
  • 服务器接收握手请求后,响应并建立WebSocket连接,确认使用WSS协议进行加密通信。
  1. 数据传输:
  • 一旦握手成功,WebSocket连接就建立起来了,客户端和服务器可以开始实时地在双方之间传输数据。
  • 这些数据可以是文本、二进制数据或任何其他格式,具体取决于应用程序的需求。
  1. 保持连接:
  • WebSocket连接是持久的,不像HTTP协议那样每次请求都需要重新建立连接。这使得WebSocket非常适合需要实时通信的应用,如聊天应用、在线游戏等。
  1. 关闭连接:
  • 当通信结束或需要关闭连接时,可以通过发送特定的关闭帧来关闭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协议。