hostname
用于显示系统的 DNS 名称,以及显示或设置其主机名或 NIS 域名。
一台计算机系统(Linux)是否只有一个主机名?
在虚拟主机中,多个主机名可以解析为 Web 服务器中的不同根目录。如果一台计算机系统(Linux)只能有一个主机名,那么虚拟主机如何可能呢?
谢谢。
答案1
是的,也不是。这是两个不同的东西,称为主机名。
“内部”主机名基本上是内核保存的字符串。这是hostname
命令(或调用)返回的值gethostname()
,并且它在系统中是唯一的(*)。
它主要用于当程序想要为其运行的系统输出一些标识符时。例如,\h
在 Bash 中PS1
扩展为主机名。同样,系统日志样式的日志文件也包含日志条目中的主机名。
(*尽管正如斯蒂芬·基特评论的那样,命名空间可用于向同一系统上的进程显示不同的主机名。这主要用于容器,它们试图表现得就像是不同的系统。)
然后还有 DNS 名称其他系统使用它们来查找另一个系统的 IP 地址。可能有多个 DNS 名称指向同一 IP 地址,即同一主机。
内部主机名和 DNS 名称不需要相同。假设某人有一个网络服务器,他们决定调用orange
(*),并使用 IP 地址192.0.2.9
。它可以为两个不同的域提供服务,并且 DNS 将设置为www.example.org
和www.example.com
都指向192.0.2.9
,而系统的内部主机名可能是orange.example.org
或只是orange
。在这种情况下,DNS 设置通常还会有一个反向查找回到192.0.2.9
名字orange.example.org
,但没有什么可以强制的。
(*因为他们喜欢以水果命名他们的服务器。有人可能会使用webserver1
类似的名称,但重点是它不需要以实际域之一命名。)
除此之外,虚拟主机要求浏览器告诉网络服务器它尝试访问的站点的名称。否则服务器将不知道客户端尝试访问哪个虚拟站点。 HTTP 有Host
标头为了那个原因。
DNS 名称和内部主机名之间的区别是组播DNS协议 (例如由阿瓦希守护进程)和其他发现协议。 mDNS 使主机能够查询同一网络上的所有其他主机的名称信息,并使自己的主机名在其他主机上可见,而无需在 DNS 中显式设置。
答案2
一台计算机系统(Linux)是否只有一个主机名?
不。
[我将完全忽略任何人都可以通过指向主机地址的 DNS 记录为您的主机提供他们喜欢的任何名称,或者您可以在 中为它拥有多个别名/etc/hosts
,或者任何关于什么是主机的哲学考虑姓名真的是]
在 Linux 系统上,主机名只是一个每个进程的资源(“UTS 命名空间”),默认情况下由其子进程继承,但可以使用该标志unshare(2)
与该资源分离。您应该查看联机帮助页。clone(2)
CLONE_NEWUTS
namespaces(7)
就像 pid、端口号、挂载点等一样,主机名不再是全局标识符,它可以像进程的地址空间(虚拟内存)或文件描述符表一样被虚拟化。
在虚拟主机中,多个主机名可以解析为 Web 服务器中的不同根目录。如果一台计算机系统(Linux)只能有一个主机名,那么虚拟主机如何可能呢?
虚拟主机是完全不同的东西,它通常是通过配置通配符 DNS 记录(例如*.foo.com
=> 13.13.13.13
)来完成的,其中 Web 服务器运行13.13.13.13
并根据 http Host:
header[1] 的值提供不同的目录/资源(这是高度可配置的)大多数网络服务器能够根据不同的资源提供服务任何http 标头,而不仅仅是Host:
)。在这一切中,运行 Web 服务器的系统操作系统不起作用。
[1] 或关于服务器名称指示对于 https,它允许同一网络服务器对不同的虚拟主机使用不同的证书。
答案3
您通常在 中设置单个主机名/etc/hostname
。并且,您在/etc/hosts
.
UTS 命名空间允许单个系统对不同进程显示不同的主机名和域名。欲了解更多信息,请参阅Linux 命名空间。因此,同一个系统绝对有可能有多个主机名和域名。例如,同一主机内的 docker 容器具有与主机系统不同的主机名。