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

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 路由路径一致,避免混淆。

相关文章:

  • Spring Boot 数据库最佳实践:从自动配置到高性能优化
  • 2025东三省D题深圳杯D题数学建模挑战赛数模思路代码文章教学
  • LeetCode167_两数之和 Ⅱ - 输入有序数组
  • 大连理工大学选修课——机器学习笔记(6):决策树
  • 通过IP计算分析归属地
  • 2025年“深圳杯”数学建模挑战赛A题-芯片热弹性物理参数估计
  • 硬盘分区丢失≠末日!3步逻辑恢复法+物理修复全流程图解
  • 网易爆米花 1.8.8 | 免费无广告,支持多网盘聚合和智能刮削技术,提供顶级画质和逼真音效的影视管理应用
  • iOS 性能调优实战:三款工具横向对比实测(含 Instruments、KeyMob、Xlog)
  • flutter 专题 五十八 关于Flutter提示Your Xcode project requires migration的错误
  • Spring Boot集成Kafka并使用多个死信队列的完整示例
  • 毫米波通信的技术挑战与解决方案
  • MySQL 基本查询(一)
  • 添加了addResourceHandlers 但没用
  • 理想MEGA,破茧再生?
  • 【“星睿O6”AI PC开发套件评测】+ tensorflow 初探
  • JavaScript:从JS的执行机制到location对象
  • 远程 Debugger 多用户环境下的用户隔离实践
  • Ollama技术架构解析及对标产品
  • uni-app - 小程序使用高德地图完整版
  • 来论|受美国“保护”,日本民众要付出什么代价?
  • 投资者建议发行优惠套票给“被套”小股东,张家界:将研究考虑
  • 排除燃气爆炸、人为放火可能,辽宁辽阳火灾事故起火原因正在调查
  • 移动互联网未成年人模式正式发布
  • 零食连锁鸣鸣很忙递表港交所:去年营收393亿元,门店超1.4万家,净利润率2.1%
  • 节前A股持续震荡,“五一”假期持股还是持币过节胜率更高?