Nginx中HTTPS重定向与WebSocket长连接必须协同配置:需排除WebSocket路径免于301跳转,显式启用HTTP/1.1并透传Upgrade和Connection头,关闭缓冲与缓存,设置超时为86400秒以上,且跨域头由后端在101响应中返回。

HTTPS 重定向和 WebSocket 长连接在 Nginx 中需协同配置,不能只做单点优化。HTTP 到 HTTPS 的跳转必须保留原始请求头(尤其是 Upgrade 和 Connection),否则 WebSocket 握手会在重定向过程中被降级或中断;同时,WebSocket 路径不能被重定向规则误捕获,否则 101 升级响应会被变成 301,导致连接失败。
HTTPS 强制跳转要避开 WebSocket 路径
把所有 HTTP 请求 301 跳转到 HTTPS 是常见做法,但必须排除 WebSocket 的路径(如 /ws、/socket、/api/v1/realtime 等)。否则浏览器发起的 WebSocket upgrade 请求会被重定向,而重定向响应无法完成协议升级。
- 用 location 块精确匹配 WebSocket 路径,并直接代理,不触发 return 301
- 把通用跳转规则放在更宽泛的 location / {} 中,确保它不覆盖 WebSocket 路径
- 示例:若 WebSocket 接入点为 /ws/,则配置中应先定义 location /ws/ { ... },再定义 location / { return 301 https://$host$request_uri; }
WebSocket 代理必须启用 HTTP/1.1 并透传升级头
WebSocket 握手依赖标准 HTTP Upgrade 流程,Nginx 默认使用 HTTP/1.0 且会过滤逐跳头部,必须显式声明并透传关键字段:
- proxy_http_version 1.1; —— 强制使用 HTTP/1.1,这是 Upgrade 机制的前提
- proxy_set_header Upgrade $http_upgrade; —— 将客户端原始 Upgrade 头(如 websocket)原样转发
- proxy_set_header Connection "upgrade"; —— 固定设为 upgrade 字符串,不是变量;Nginx 不允许继承客户端的 Connection 值
- 务必避免写成 proxy_set_header Connection $http_connection;,这会导致 keep-alive 或 close 被错误传递,中断升级
超时与缓冲设置直接影响连接存活
WebSocket 是长生命周期连接,Nginx 默认 60 秒超时和响应缓冲会主动断开或延迟帧传输:
- proxy_read_timeout 86400; —— 设置为 24 小时或更大,防止空闲期间后端无响应导致断连
- proxy_send_timeout 86400; —— 保证服务端心跳或消息能持续发出,不被 Nginx 中断
- proxy_buffering off; —— 关闭缓冲,避免 WebSocket 帧被暂存、合并或延迟发送
- 不配置任何 proxy_cache_* 指令 —— WebSocket 数据不可缓存,启用会直接失败
WSS 要求后端支持 TLS 终止或透传
浏览器访问 wss:// 时,Nginx 必须完成 TLS 终止,并将明文 WebSocket 流量(ws://)安全转发给后端;或者由 Nginx 透传 TLS 到后端(较少见):
- 推荐方式:Nginx 终止 HTTPS/WSS,后端监听普通 HTTP + WebSocket(如 http://127.0.0.1:8080/ws)
- SSL 配置需包含完整证书链和私钥,启用 TLSv1.2+,禁用不安全协议(如 SSLv3、TLSv1.0)
- 若后端也要求 WSS(即双层加密),需配置 proxy_ssl_* 系列指令,但多数场景无需此复杂层级
- 跨域头(如 Access-Control-Allow-Origin)必须由后端在 101 响应中返回,Nginx 不应添加或覆盖


















