当前位置: 首页 > news >正文

Nginx 代理 WebSocket 失败排查全过程:从 426 到连接成功的完整复盘

Nginx 代理 WebSocket 失败排查全过程:从 426 到连接成功的完整复盘

  • 🧩 问题现象
  • 🔍 初步怀疑:Nginx 配置错误?
  • 🕵️‍♂️ 关键转折:前端页面来源被忽略
    • ❌ 问题本质
  • ✅ 解决方案
    • 方法 1:显式指定虚拟机 IP(临时可用)
    • 方法 2:使用相对路径(推荐 ✅)
  • 🛠 附:正确的 Nginx 配置模板
  • 💡 经验总结
  • 📌 最后提醒
  • ✅ 结语


关键词:Nginx、WebSocket、Docker、426 Upgrade Required、前端连接失败、代理配置

在开发基于 WebSocket 的实时应用时,使用 Nginx 作为反向代理是常见做法。可是我遇见了后端直连 WebSocket 成功,通过 Nginx 代理却失败。本文将完整复盘一次真实排查过程,带你避开所有“坑”。


🧩 问题现象

  • 后端服务运行在 192.168.1.10:8080,提供 WebSocket 接口 /ws/xxx
  • 使用 wscat 或浏览器直连 ws://192.168.1.10:8080/ws/xxx ✅ 成功
  • 配置 Nginx 反向代理后,前端连接 ws://localhost/ws/xxx ❌ 失败
  • 浏览器 Network 面板显示 WebSocket 请求失败(无 101 响应)
  • 关键线索:Nginx 的 access_log没有任何 WebSocket 请求日志

🔍 初步怀疑:Nginx 配置错误?

首先检查 Nginx 配置:

map $http_upgrade $connection_upgrade {default upgrade;'' close;
}upstream webservers {server 192.168.1.10:8080;
}server {listen 80;server_name localhost;location /ws/ {proxy_pass http://webservers/ws/;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "$connection_upgrade";  # ⚠️ 这里有坑!proxy_read_timeout 3600s;}
}

常见错误包括:

  • Connection 头加了双引号 → 变成字面量
  • map 没放在 http 块顶层
  • 缺少 proxy_buffering off

但即使修正这些,日志依然为空,说明:请求根本没到 Nginx!


🕵️‍♂️ 关键转折:前端页面来源被忽略

通过 docker ps 确认端口映射正常:

nginx     0.0.0.0:80->80/tcp

但发现一个致命细节:

前端页面是通过虚拟机 IP 打开的:http://192.168.228.128/
而 WebSocket 地址写的是:ws://localhost/ws/xxx

❌ 问题本质

  • 浏览器中的 localhost 永远指向客户端本机(Windows 电脑)
  • 而我的 Nginx 运行在 虚拟机中
  • 所以 ws://localhost/... 实际请求的是 我 Windows 的 80 端口,而非虚拟机!

→ 请求压根没发给 Nginx,自然没有日志!


✅ 解决方案

方法 1:显式指定虚拟机 IP(临时可用)

// 前端 JS
const ws = new WebSocket('ws://192.168.228.128/ws/xxx');

✅ 立即生效!

方法 2:使用相对路径(推荐 ✅)

// 自动继承当前页面的 host
const ws = new WebSocket('/ws/xxx');

优势:

  • 页面在 http://localhost → 连 ws://localhost
  • 页面在 http://192.168.228.128 → 连 ws://192.168.228.128
  • 部署到域名也无需修改代码

🛠 附:正确的 Nginx 配置模板

http {# 必须在 http 块顶层!map $http_upgrade $connection_upgrade {default upgrade;'' close;}upstream backend {server host.docker.internal:8080;  # Docker Desktop 推荐# 或 server 192.168.1.10:8080;}server {listen 80;server_name _;  # 匹配任意 Hostlocation / {root /usr/share/nginx/html;index index.html;}location /ws/ {access_log /var/log/nginx/ws_access.log;proxy_pass http://backend/ws/;proxy_http_version 1.1;proxy_buffering off;          # 必须关闭proxy_cache off;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $connection_upgrade;  # 无引号!proxy_read_timeout 3600s;}}
}

💡 经验总结

问题类型排查要点
Nginx 无日志先确认请求是否真的发到了 Nginx(检查前端地址、端口映射)
WebSocket 426检查 UpgradeConnection 头是否正确传递
前端连接失败确保 WebSocket 地址与页面同源(避免硬编码 localhost
Docker 环境host.docker.internal 代替 IP 更可靠

📌 最后提醒

localhost 在前端代码中 ≠ 你的服务器!
它永远指向用户浏览器所在的机器

开发时务必注意页面来源与 WebSocket 目标的匹配关系,这是 WebSocket 代理失败的最高频原因


✅ 结语

从“426 Upgrade Required”到“连接成功”,看似是配置问题,实则是网络拓扑理解偏差。希望本文能帮你少走弯路!

欢迎点赞、收藏、评论交流!
如果你也在 Docker + Nginx + WebSocket 中踩过坑,欢迎留言分享你的故事!

http://www.dtcms.com/a/482217.html

相关文章:

  • multi-head attention 多头注意力实现细节
  • 第七章 完整的模型训练
  • 08-Vue3组合式API最佳实践指南
  • 山东网站建设网站做全世界的生意的网站
  • 【文献分享】通过基于大型语言模型嵌入的蛋白质的 k 均值聚类来探索同源性检测
  • Redis 黑马点评-优惠券秒杀
  • 网站页面示意图怎么做宁波北仑做网站
  • ffmpeg转化mp3至wav格式
  • 不同类型的 3D 文件格式
  • ElasticSearch 实战:全文检索与数据聚合分析的完整指南​
  • Day62 设备驱动程序开发基础与LED控制
  • 支持Word (doc/docx) 和 PDF 转成一张垂直拼接的长PNG图片工具类
  • JAVA同城预约服务家政服务美容美发洗车保洁搬家维修家装系统源码小程序+公众号+h5
  • 正规拼多多代运营公司如何优化网站结构
  • 三层前馈神经网络实战:MNIST手写数字识别
  • 深度学习(四)
  • 学习HAL库STM32F103C8T6(MQTT报文)
  • 【C++】C++11特性学习(1)——列表初始化 | 右值引用与移动语义
  • 网站布局 种类手机商城页面设计
  • 如何建设手机端网站电力公司建设安全文化
  • 红色 VR 大空间:技术赋能红色文化传承的运营价值与实践路径
  • 网络协议工程 - eNSP及相关软件安装 - [eNSP, VirtualBox, WinPcap, Wireshark, Win7]
  • WHAT - 前端性能指标(交互和响应性能指标)
  • 专业的媒体发稿网
  • dede旅游网站模板wordpress教学主题
  • 做网站的技术性说明怎么自己做微网站吗
  • VScode安装以及C/C++环境配置20251014
  • 黄页网站大全通俗易懂wordpress 数据库配置错误
  • 常规的红外工业镜头有哪些?能做什么?
  • 一文读懂分子结合位点的预测:为双荧光素酶实验铺路