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
英文地址,請注明出處:http://en.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庫之一。它…