本地开发时,我们经常会遇到这样的需求:

  • 项目 A 使用 3000 端口
  • 项目 B 也使用 3000 端口
  • 希望两个项目同时启动,互不影响

通常的答案是“改端口”。但在本机上,还有一种更整洁的办法:使用不同的 127.x.x.x 地址。

端口不是单独存在的

一个网络服务真正监听的不是“端口”,而是一个地址组合:

IP 地址 + 端口

因此,下面两个监听实际上并不冲突:

127.0.0.2:3000
127.0.0.3:3000

它们的端口号相同,但 IP 地址不同。

127.x.x.x 是什么

127.0.0.0/8 整个网段都用于回环地址,也就是:发往这些地址的数据不会经过物理网卡,而是回到本机。

最常见的是:

127.0.0.1

但下面这些地址通常也可以使用:

127.0.0.2
127.0.0.3
127.10.10.10

它们都指向当前电脑,只是可以被操作系统区分为不同的本地地址。

一个可以直接运行的例子

准备两个目录,在两个终端分别运行:

python -m http.server 3000 --bind 127.0.0.2 --directory project-a
python -m http.server 3000 --bind 127.0.0.3 --directory project-b

现在两个程序都使用了 3000 端口,但访问地址不同:

http://127.0.0.2:3000   → project-a
http://127.0.0.3:3000   → project-b

这就是本地开发中“多个相同端口”的核心用法。

技巧:用域名代替 IP

直接记 127.0.0.2127.0.0.3 并不困难,但开发时写域名更直观。

在 hosts 中配置域名和 IP 的映射:

127.0.0.2 app-a.local
127.0.0.3 app-b.local

配置后,域名就会指向对应的本机地址。之后可以直接这样访问,不必再写 IP:

http://app-a.local:3000
http://app-b.local:3000

常见陷阱

不要监听 0.0.0.0

如果程序监听的是:

0.0.0.0:3000

它表示监听本机所有网卡地址,通常会占用 3000 端口的所有本地 IP。此时再绑定 127.0.0.2:3000,很可能仍然会冲突。

什么时候适合这样做

这种方法适合:

  • 同时开发多个前端项目
  • 多个微服务需要使用统一端口配置
  • 相同服务启动两个版本对比差异

它只适用于本机回环网络,不会让局域网中的其他设备访问这些服务。若需要对外提供访问,还是应该使用真实网卡地址、反向代理或专门的端口转发方案。

结语

“端口不能重复”并不准确。更准确的说法是:

同一个 IP 地址上,不能重复绑定同一个端口。

利用 127.0.0.0/8 的多个回环地址,就可以让多个本地程序同时使用 30008080 等相同端口,彼此独立,配置也更接近真实的多服务开发环境。