我在 Mac 上使用
Jekyll
和 Vagrant
。我发现 Jekyll server
将绑定到 0.0.0.0:4000
而不是 127.0.0.1:4000
。另外 gem server
将默认绑定到该地址。我仍然可以通过http://localhost:port
访问它。但对于Jekyll
,似乎默认设置(例如0.0.0.0:4000)需要互联网访问。如果没有互联网,我无法运行 Jekyll server
。 这是一个小错误吗?
我也用
Vagrant
。我在 Vagrantfile 中设置了端口转发(8080 => 4000),因为我在 Jekyll
虚拟机中安装了 Vagrant
并在 Macintosh 下测试它。如果我使用默认设置(0.0.0.0:4000),它就可以工作。我可以通过 http://localhost:8080
从我的狩猎之旅中访问它。但如果没有互联网,我无法绑定到 0.0.0.0:4000。我使用 jekyll server -H 127.0.0.1
将服务绑定到 127.0.0.1:4000
,然后我无法通过 http://localhost:8080
访问它。
任何人都可以解释 0.0.0.0、127.0.0.1 和 localhost 之间的区别?任何人都可以解释为什么差异会导致这个问题?
127.0.0.1
通常是分配给“环回”或仅限本地接口的 IP 地址。这是一个“假”网络适配器,只能在同一主机内通信。当您希望支持网络的应用程序仅为同一主机上的客户端提供服务时,通常会使用它。正在侦听 127.0.0.1
连接的进程将仅接收该套接字上的本地连接。
“localhost”通常是
127.0.0.1
IP 地址的主机名。它通常在 /etc/hosts
中设置(或者 Windows 等效名称“hosts”,通常位于 C:\Windows\System32\Drivers\etc\hosts
)。您可以像任何其他主机名一样使用它 - 尝试“ping localhost”以查看它如何解析为 127.0.0.1
。
0.0.0.0
有几个不同的含义,但在这种情况下,当服务器被告知侦听 0.0.0.0
时,这意味着“侦听每个可用的网络接口”。从服务器进程的角度来看,具有 IP 地址 127.0.0.1
的环回适配器看起来就像计算机上的任何其他网络适配器一样,因此被告知侦听 0.0.0.0
的服务器也将接受该接口上的连接。
这有望回答您问题的知识产权方面。我不熟悉 Jekyll 或 Vagrant,但我猜测您的端口转发
8080 => 4000
以某种方式绑定到特定的网络适配器,因此当您本地连接到 127.0.0.1
时,它不在路径中
在当前版本的 Jekyll 中,默认为 http://127.0.0.1:4000/。
如果您已连接到网络但不希望其他人访问您的应用程序,那么这很好。
但是,您可能想查看您的应用程序如何在移动设备或其他笔记本电脑/计算机上运行。
在这种情况下,你可以使用
jekyll serve --host 0.0.0.0
这会将您的应用程序绑定到主机,然后使用以下命令从其他主机连接到它
http://host's IP adress/4000
我将通过示例解释 127.0.0.1 和 0.0.0.0 的区别:
想象一下,您在远程计算机上运行任何 Web 服务器(例如 Nginx),以便您希望互联网上的任何人都可以访问它。
如果你的 Nginx Web 服务器监听 127.0.0.1:80 那么除了你登录该服务器之外没有人可以访问它。
如果 Web 服务器监听 0.0.0.0:80,互联网上的任何人都可以通过在浏览器中输入您的服务器 IP 地址来连接到您的服务器。
请注意,可以监听任何端口,而不是端口 80。我在这个例子中使用了 80,因为这是 Web 服务器的默认端口,并且浏览器不会强制用户在输入 IP 地址后输入它。