如何从Windows访问WSL2中运行的FastAPI本地服务?
解决WSL2中FastAPI无法被Windows浏览器访问的问题
核心原因
WSL2采用虚拟化网络栈,127.0.0.1仅指向WSL2内部的本地回环,Windows系统的localhost无法直接映射到这个地址,因此必须让FastAPI监听所有网卡,并使用WSL2的实际局域网IP访问。
具体解决步骤
1. 修改FastAPI启动代码,绑定到所有网卡
将启动代码中的host参数从"127.0.0.1"改为"0.0.0.0",让FastAPI监听WSL2的所有网络接口:
from fastapi import FastAPI app = FastAPI() @app.get("/") async def root(): return {"message": "Hello World"} if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000) # 关键修改:host设为0.0.0.0
2. 获取WSL2的正确IP地址
执行以下命令获取WSL2在Windows局域网中的实际IP(最可靠的方式):
ip addr show eth0 | grep inet | awk '{print $2}' | cut -d/ -f1
或者更简洁的命令:
hostname -I | awk '{print $1}'
执行后会得到类似172.18.xx.xx的IP地址,这就是Windows访问WSL2服务的目标地址。
3. 在Windows浏览器访问服务与Swagger UI
- 基础API测试:输入
http://[WSL2_IP]:8000,确认接口正常响应 - Swagger UI测试:输入
http://[WSL2_IP]:8000/docs,直接打开交互式测试界面
4. 排查防火墙拦截问题(若上述步骤无效)
Windows防火墙可能拦截WSL2的端口请求,可按以下操作处理:
- 打开Windows Defender防火墙的「高级设置」
- 新建入站规则,允许TCP端口8000的连接(或直接允许
uvicorn.exe的网络访问权限) - 可临时关闭防火墙进行测试(排查完成后建议恢复防火墙设置)
5. 可选:用自动端口转发简化访问(无需记IP)
WSL2默认支持自动端口转发,满足以下条件即可直接用Windows的localhost访问:
- FastAPI必须绑定到
0.0.0.0(而非127.0.0.1) - WSL2的自动端口转发功能处于默认开启状态
此时直接在Windows浏览器输入http://localhost:8000和http://localhost:8000/docs即可访问服务。
内容的提问来源于stack exchange,提问作者Quốc Khánh Cao
相关产品推荐
相关产品推荐

