文章目录
在开发或部署 Web 服务时, host 参数往往只有一行,却直接决定了是"只给自己看"还是"向全世界开放"。最常见的选择就是 0.0.0.0 与 127.0.0.1( localhost),下面用最直白的方式拆解它们的区别。
核心对比
| 项目 | 0.0.0.0 |
127.0.0.1(localhost) |
|---|---|---|
| 含义 | 监听本机 所有网络接口(all interfaces) | 只监听 回环接口(loopback) |
| 本机访问 | 可以(127.0.0.1、localhost、本机真实 IP 都行) | 可以(仅 127.0.0.1 或 localhost) |
| 局域网访问 | 可以(用内网 IP,如 192.168.x.x:端口) |
不可以(数据包不会发到真实网卡) |
| 公网访问 | 可以(服务器有公网 IP 或做端口映射时) | 不可以 |
| 典型场景 | 生产环境、需要被他人访问的服务(Flask、FastAPI、Django、Nginx、Node.js 等生产部署默认是 0.0.0.0) | 本地开发调试或不想暴露的服务 |
| 安全性 | 风险高:端口开放就意味着任何人可连,需配合防火墙/安全组 | 相对安全:只能本机访问 |
| 常见命令 | python -m http.server 8000 --bind 0.0.0.0 uvicorn main:app --host 0.0.0.0 --port 8000 |
python -m http.server 8000(默认 127.0.0.1) uvicorn main:app --host 127.0.0.1 |
实际访问对比(假设内网 IP 为 192.168.1.100)
| 启动命令 | 本机访问 http://127.0.0.1:8000 |
本机访问 http://192.168.1.100:8000 |
局域网其他设备访问 http://192.168.1.100:8000 |
|---|---|---|---|
app.run(host="0.0.0.0", port=8000) |
✅ 成功 | ✅ 成功 | ✅ 成功 |
app.run(host="127.0.0.1", port=8000) |
✅ 成功 | ❌ 连接超时 | ❌ 连接超时 |
一句话记住:
0.0.0.0= "只要网络通、端口开放,就欢迎所有人访问"127.0.0.1= "只服务本机,别人一律拒绝"
常见框架默认行为(2025 最新)
| 框架 | 开发环境默认 host | 生产推荐 |
|---|---|---|
| Flask | 127.0.0.1(flask run) |
使用 gunicorn/uvicorn 时绑定 0.0.0.0 |
| FastAPI + uvicorn | 127.0.0.1(uvicorn main:app) |
加 --host 0.0.0.0 |
| Django | 0.0.0.0(runserver 默认) |
生产不要用 runserver,自行配置 WSGI/ASGI |
| Node.js (Express) | 通常监听 0.0.0.0 |
0.0.0.0 并配防火墙 |
Go net/http |
常需显式 :8080(等价 0.0.0.0) |
同开发 |
如何选择
- 本地自测/不想暴露 :使用
127.0.0.1,无需担心他人误连。 - 要被外部访问/正式部署 :绑定
0.0.0.0,再通过防火墙、安全组或反向代理决定哪些 IP 可以进来。
记住:监听地址只是第一道门槛,真正的安全还需要端口加固、认证授权、日志审计等手段。合理地选择 host,能让你的服务既安全又易于访问。