uvicorn必须用--host显式指定绑定ip,默认127.0.0.1仅本机访问;--host 0.0.0.0监听所有ipv4,云服务器还需配置安全组放行端口。

uvicorn --host 参数指定绑定IP
Uvicorn 默认只监听 127.0.0.1,外部机器无法访问。要让服务对外可见,必须显式用 --host 指定绑定地址,不能只改 --port。
-
--host 0.0.0.0:监听所有 IPv4 接口,局域网和公网(若防火墙放行)均可访问 -
--host :::监听所有 IPv6 接口(需系统支持 IPv6) -
--host 192.168.1.100:仅绑定到指定局域网 IP,其他设备仍需在同一子网才能连 -
--host 127.0.0.1:保持默认,仅本机可访问(开发调试最安全)
常见错误是只写 uvicorn main:app --port 8000,以为换端口就能外访——实际仍卡在 127.0.0.1,云服务器上尤其容易踩这个坑。
脚本中用 uvicorn.run() 绑定 IP
在 Python 脚本里调用 uvicorn.run() 时,host 是必填关键字参数,不传会 fallback 到 "127.0.0.1",没有隐式“自动适配”逻辑。
正确写法示例:
import uvicorn from fastapi import FastAPI <p>app = FastAPI()</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/gongju/2843" title="Uvicorn 0.52.1"><img src="https://img.php.cn/upload/manual/001/221/864/6acee78537d78709.png" alt="Uvicorn 0.52.1" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/gongju/2843" title="Uvicorn 0.52.1" class="overflowclass">Uvicorn 0.52.1</a> <p class="overflowclass">Uvicorn 0.52.1 是 Python ASGI Web 服务器,提供异步应用服务及 WebSocket 支持,常用于 FastAPI、Starlette 等应用的开发和部署。本下载为官方 PyPI 通用 wheel 包,可使用 pip 安装,并由包管理器处理所需依赖。</p> </div> <a rel="nofollow" href="/xiazai/gongju/2843" title="Uvicorn 0.52.1" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div><p>if <strong>name</strong> == "<strong>main</strong>": uvicorn.run( app, host="0.0.0.0", # 必须显式写 port=8000, reload=False # 生产禁用 )</p>
- 不要写成
uvicorn.run(app, "0.0.0.0", 8000)—— 位置参数不被接受,会报TypeError - 如果用
reload=True,host和port仍需明确传入,否则热重载后可能回退到默认值 - Windows 上若遇到
Address already in use,大概率是前一次进程没杀干净,用taskkill /f /im python.exe清理
云服务器上绑定 0.0.0.0 还连不上?检查防火墙
即使 uvicorn 正确绑定了 0.0.0.0:8000,云服务器厂商(阿里云、腾讯云等)的**安全组规则**默认会拦截非 80/443 端口。这和本地防火墙是两层独立控制。
- 登录云控制台 → 找到对应 ECS 实例 → 进入「安全组」→ 编辑「入方向规则」
- 添加一条规则:协议类型
TCP,端口范围8000/8000,授权对象0.0.0.0/0(或更严格的 IP 段) - Linux 本机防火墙(如
ufw或firewalld)也需确认是否放行该端口
很多用户反复检查代码和命令无果,最后发现卡在这一层——它不报错,只是静默丢包。
为什么不用 --bind 替代 --host?
uvicorn 命令行**没有 --bind 参数**,那是 gunicorn 的语法。混淆两者会导致命令直接失败:
- ❌ 错误:
uvicorn main:app --bind 0.0.0.0:8000→ 报错unrecognized arguments: --bind - ✅ 正确:
uvicorn main:app --host 0.0.0.0 --port 8000 - ⚠️ 注意:Gunicorn + UvicornWorker 组合时才用
--bind,例如gunicorn main:app -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
跨工具迁移时最容易漏掉这个差异,尤其是从 Flask/Gunicorn 切过来的人。










