nginx 配置要领

你提出的问题非常好!确实在配置 WebSocket 代理时,proxy_pass 的 URL 处理需要特别注意。以下是关键解释和修正建议:


1. 原配置的问题分析

location /ws/ {proxy_pass http://fastapi-container:8000;  # 会保留 /ws/ 前缀传递给后端
}
  • 这种配置会将完整路径(包括 /ws/)传递给 FastAPI 服务。
  • 如果你的 FastAPI 的 WebSocket 路由是 /ws/chat,实际请求会被转发为:
    http://fastapi-container:8000/ws/chat

2. 两种正确的配置方式

方式 1:保留路径前缀(推荐)
location /ws/ {proxy_pass http://fastapi-container:8000;  # 不写结尾的 /proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";
}
  • 行为
    • 请求 wss://your-domain.com/ws/chat
    • → 转发到 http://fastapi-container:8000/ws/chat
  • 适用场景
    FastAPI 的 WebSocket 路由需要完整路径(如 @app.websocket("/ws/chat")
方式 2:去除路径前缀
location /ws/ {proxy_pass http://fastapi-container:8000/;  # 结尾有 /proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";
}
  • 行为
    • 请求 wss://your-domain.com/ws/chat
    • → 转发到 http://fastapi-container:8000/chat(去除了 /ws 前缀)
  • 适用场景
    FastAPI 的 WebSocket 路由直接使用根路径(如 @app.websocket("/chat")

3. 完整修正方案

情况 1:FastAPI 需要完整路径
location /ws/ {proxy_pass http://fastapi-container:8000;  # 无结尾 /# 其他 WebSocket 头保持不变...
}# FastAPI 代码
@app.websocket("/ws/chat")  # 匹配完整路径
async def websocket_endpoint(websocket: WebSocket):...
情况 2:FastAPI 不需要前缀
location /ws/ {proxy_pass http://fastapi-container:8000/;  # 有结尾 /# 其他 WebSocket 头保持不变...
}# FastAPI 代码
@app.websocket("/chat")  # 路径已去除 /ws
async def websocket_endpoint(websocket: WebSocket):...

4. 测试验证方法

  1. 检查实际转发路径
    在 FastAPI 中添加日志:

    @app.websocket("/ws/chat")
    async def websocket_endpoint(websocket: WebSocket):print("Received WebSocket at:", websocket.url.path)  # 查看实际路径
    
  2. Nginx 调试日志
    在 Nginx 配置中添加:

    error_log /var/log/nginx/error.log debug;
    

5. 常见误区

错误配置结果修正
proxy_pass http://backend; + location /ws/保留 /ws/ 前缀符合预期
proxy_pass http://backend/; + location /ws/去除 /ws/ 前缀需调整 FastAPI 路由
proxy_pass http://backend/ws/; + location /ws/重复 /ws/ws/绝对避免

总结

  • 关键规则
    • proxy_pass 的 URL / 结尾 → 去除 location 匹配的前缀
    • proxy_pass 的 URL / 结尾 → 保留完整路径
  • 推荐做法
    保持 Nginx 的 location 和 FastAPI 路由路径一致,避免混淆。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/79086.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/79086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AI】DeepSeek 流程图 / 时序图制作,Word 排版错乱问题,文字转直观图形

一:动态流程图 / 时序图制作(DeepSeek Draw.IO) 工具准备 DeepSeek(AI 生成代码):官网(免费)Draw.IO(可视化渲染):官网(免费&#…

4. python3基本数据类型

Python3 中有六个标准的数据类型: Number(数字) String(字符串) List(列表) Tuple(元组) Set(集合) Dictionary(字典) Pyt…

WPF之TextBox控件详解

文章目录 1. TextBox概述2. 基本属性与功能3. 输入控制详解3.1 MaxLength3.2 AcceptsReturn3.3 AcceptsTab3.4 CharacterCasing3.5 IsUndoEnabled3.6 自定义输入限制 4. 文本选择与操作4.1 选择属性4.2 选择方法4.3 文本操作4.4 选择事件4.5 实现自定义文本处理功能 5. 滚动支持…

1.4 点云数据获取方式——结构光相机

图1-4-1结构光相机 结构光相机作为获取三维点云数据的关键设备,其工作原理基于主动式测量技术。通过投射已知图案,如条纹、点阵、格雷码等,至物体表面,这些图案会因物体表面的高度变化而发生变形。与此同时,利用相机从特定

【MATLAB第118期】基于MATLAB的双通道CNN多输入单输出分类预测方法

【MATLAB第118期】基于MATLAB的双通道CNN多输入单输出分类预测方法 一、双通道CNN简介 在深度学习领域,卷积神经网络(CNN)凭借其强大的特征提取能力,已成为图像识别、自然语言处理等任务的核心技术。传统单通道CNN在处理单一模态…

2025上海车展 | 移远通信推出自研NG-eCall QuecOpen方案,助力汽车安全新标准加速落地

4月29日,在2025上海国际汽车工业展览会期间,全球领先的物联网和车联网整体解决方案供应商移远通信宣布,正式发布自主研发的NG-eCall(下一代紧急呼叫系统)QuecOpen解决方案。 该方案凭借高度集成的软硬件协同设计&…

leetcode76

目录 803ms超时。。。。越改越超时。。。 一些纠缠 代码分析: 代码问题: 改进建议: 示例代码: The error message you’re seeing indicates that there is a reference binding to a null pointer in your code. This typ…

大数据应用开发和项目实战-Seaborn

一、Seaborn概述 Seaborn是基于Python数据可视化库Matplotlib开发的扩展库,专注于统计图形的绘制,旨在通过简洁的代码实现复杂数据的可视化,帮助用户更轻松地呈现和理解数据。其核心设计目标是简化统计可视化流程,提供高级接口和美…

数据科学与计算

Seaborn的介绍 Seaborn 是一个建立在 Matplotlib 基础之上的 Python 数据可视化库,专注于绘制各种统计图形,以便更轻松地呈现和理解数据。 Seaborn 的设计目标是简化统计数据可视化的过程,提供高级接口和美观的默认主题,使得用户…

深入浅出循环神经网络(RNN):原理、应用与实战

1、引言 在深度学习领域,循环神经网络(Recurrent Neural Network, RNN)是一种专门用于处理**序列数据**的神经网络架构。与传统的前馈神经网络不同,RNN 具有**记忆能力**,能够捕捉数据中的时间依赖性,广泛应…

广州创科——湖北房县汪家河水库除险加固信息化工程

汪家河水库 汪家河水库位于湖北省房县,建于1971年,其地利可谓是天公之作,东西二山蜿蜒起伏,山峰相连,峰峰比高,无有尽头,东边陡峭,西边相对平坦,半山腰有一条乡村道路&am…

C++日更八股--day2

### C sort 的底层原理 这里其实原来问的是你如何优化快速排序,但是我最初只以为是随机选择基准,但是很显然面试官对此并不满意 闲暇之际,看到一篇介绍sort的原理的文章,才知道原来如是也 1.快速排序:作为主要算法&…

UniApp 的现状与 WASM 支持的迫切性

UniApp 的现状与 WASM 支持的迫切性 点击进入免费1 UniApp 的现状与 WASM 支持的迫切性 点击进入免费版2 一、UniApp 的跨平台优势与性能瓶颈 UniApp 凭借“一次开发,多端发布”的核心理念,已成为跨平台开发的主流框架之一。然而,随着移动应用场景的复杂化(如 3D 渲染、音…

如何正确使用日程表

日程安排,是时间管理中非常重要的一项,也是不容易管好的一项。 日程安排,通常指放到日程表里的事情,一般来说,放到日程表的事情要符合以下几个特点: 01.明确具体时间段,比如是下午2点到下午三…

【Token系列】14|Prompt不是文本,是token结构工程

文章目录 14|Prompt不是文本,是token结构工程一、很多人写的是“自然语言”,模型读的是“token序列”二、Prompt写法会直接影响token结构密度三、token分布影响Attention矩阵的聚焦方式四、token数 ≠ 有效信息量五、Prompt结构设计建议&…

研发效率破局之道阅读总结(4)个人效率

研发效率破局之道阅读总结(4)个人效率 Author: Once Day Date: 2025年4月30日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: 程序的艺术_Once-Day…

CNN代码详细注释

import torch from torch import nn#定义张量x,它的尺寸是5x1x28x28 #表示了5个单通道28x28大小的数据 xtorch.zeros([5,1,28,28])#定义一个输入通道是1,输出通道是6,卷积核大小是5x5的卷积层 convnn.Conv2d(in_channels1,out_channels6,ker…

机器指标监控技术方案

文章目录 机器指标监控技术方案架构图组件简介Prometheus 简介核心特性适用场景 Grafana 简介核心特性适用场景 Alertmanager 简介核心特性适用场景 数据采集机器Node ExporterMySQL ExporterRedis ExporterES ExporterRocketMQ ExporterSpringcloud ExporterNacos 数据存储短期…

【Office-Excel】单元格输入数据后自动填充单位

1.自定义设置单元格格式 例如我想输入数字10,回车确认后自动显示10kg。 右击单元格或者快捷键(Ctrl1),选择设置单元格格式,自定义格式输入: 0"kg"格式仍是数字,但是显示是10kg&…

JavaScript的3D库有哪些?

JavaScript的3D库有哪些? 在3D开发领域,JavaScript提供了多种库和框架,使开发者能够在浏览器中创建丰富的3D体验。以下是一些流行的3D方面的JavaScript库: Three.js:这是最著名的用于创建3D图形的JavaScript库之一。它…