文章

Nginx 代理 WebSocket 所需的关键配置说明

Nginx 代理 WebSocket 所需的关键配置说明

Nginx 配置代理 WebSocket 的关键参数解析

在通过 Nginx 转发 WebSocket 请求(如 SignalR 或 Socket.IO)时,常见问题是连接失败或无法升级为 WebSocket 协议。本文将详细解析 WebSocket 代理中几条必不可少的配置项及其原理,帮助你顺利实现转发。

示例配置

1
2
3
4
5
6
7
8
9
10
11
12
13
location /gateway/ {
    proxy_pass http://8.141.91.204:6803/;

    # 1. 启用 HTTP/1.1 协议,支持 Upgrade
    proxy_http_version 1.1;

    # 2. 转发 WebSocket 所需的关键头部
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";

    # 3. 保持原始 Host 头部(可选,根据后端要求)
    proxy_set_header Host $host;
}

关键配置项解析

1. proxy_http_version 1.1

  • 作用:强制 Nginx 与后端服务器使用 HTTP/1.1。
  • 原因:WebSocket 协议要求基于 HTTP/1.1 的协议升级机制(Upgrade),而 HTTP/1.0 不支持该特性。

2. proxy_set_header Upgrade $http_upgrade

  • 作用:将客户端请求中的 Upgrade 头部值(如 websocket)传递给后端。
  • 说明:这是客户端告诉服务端希望“升级协议”的方式,Nginx 需要转发此头部,后端才会响应升级。

3. proxy_set_header Connection "Upgrade"

  • 作用:明确告诉后端当前连接将进行协议升级。
  • 说明:这是 WebSocket 握手协议的一部分,缺失时后端会拒绝升级。

4. proxy_set_header Host $host(可选)

  • 作用:保留原始请求头中的 Host 值,有些后端服务器会用 Host 验证来源。

小结表格

配置项作用说明
proxy_http_version 1.1使用 HTTP/1.1 协议以支持 Upgrade
proxy_set_header Upgrade ...转发 Upgrade 请求头(如 websocket)
proxy_set_header Connection ...明确请求进行协议升级
proxy_set_header Host ...(可选)保留原始主机名

常见错误示例

如果未添加这些配置,可能会遇到如下错误:

1
2
3
Error connecting to downstream service
System.Net.Http.HttpRequestException: Error while copying content to a stream.
Inner Exception: System.IO.IOException: Connection reset by peer

或者浏览器端会提示:

1
WebSocket connection to 'ws://...' failed: Error during WebSocket handshake
本文由作者按照 CC BY 4.0 进行授权