对于在本地服务器上进行 Web 开发 ( nginx
),我喜欢为一些项目创建子域名虚拟主机,主要是为了方便和灵活。例如
server {
listen 80;
server_name project.myHostname;
root /that/projects/html/root;
....
}
虽然技术上值得怀疑(?)但它在发出请求时工作正常http://project.myHostname
在同一台机器上。但我希望最终得到一个配置,让我可以http://project.myHostname
从本地网络(并且只能在那里)连接的任何设备访问。就像我访问时一样myHostname
(因为,我猜我的路由器 DNS 会将其解析为本地 ip)。但对于另一件事,我收到各种错误,尖叫着没有这样的东西subdomain.hostname
。
到目前为止,我发现的唯一解决方案是手动编辑hosts
每个应该能够请求该“地址”的设备的文件。有没有更方便的解决方案?
我认为这里的主要问题可能是我对主机名、域名等概念和关系的理解不够。我为此苦苦挣扎了一段时间,但还是很难理解。
答案1
您需要 DNS 功能,因此您应该使用 DNS。
- 设置一个 DNS 服务器,例如 Bind9 或 Unbound – 您应该使用一个能够同时充当递归和权威的服务器;
- 配置您的计算机以使用该服务器作为 DNS,而不是您的路由器的 DNS;
- 为了提高性能,请将 DNS 服务器设置为使用您的通常DNS 服务器地址作为“转发器”(以利用其缓存)。
这就是“准备”的部分。
现在创建一个名为“myHostname”的新区域。它与托管您自己的域名大致相同example.com
,因此您可以遵循各种现有的教程。
(区域对应于权威范围 - 通常是 TLD 或“常规”一级域名,但在某些情况下,子域名也可以是其自己的区域。)
许多人使用 dnsmasq 来实现这个目的,但我不知道它是否支持通配符。而且它的配置非常晦涩难懂,所以我就不提了。
在 Unbound(主要是具有非常有限的权威托管功能的递归器)中,它看起来像这样:
server:
(other settings...)
local-zone: "myHostname." static
local-data: "myHostname. A 192.168.1.234"
local-data: "*.myHostname. A 192.168.1.234"
(other settings...)
forward-zone:
name: "."
forward-addr: 8.8.8.8
forward-addr: 8.8.4.4
这将myHostname
和都指向<anything>.myHostname
给定的 IP 地址。
在 Bind9(功能齐全的权威服务器)中,情况稍微复杂一些 - 您需要创建一个单独的“区域文件”:
; /etc/named.conf
options {
(other settings...)
forwarders { 8.8.8.8; 8.8.4.4; };
};
zone "myHostname" {
type master;
file "/var/named/myHostname.zone";
};
; /var/named/myHostname.zone (example in short form, with $ORIGIN)
$ORIGIN myHostname.
$TTL 1h
@ SOA localhost. whatever. ( 1 4h 1h 7d 1h )
@ A 192.168.1.234
* A 192.168.1.234
; /var/named/myHostname.zone (same example but in full form)
$TTL 1h
myHostname. SOA localhost. whatever. ( 1 4h 1h 7d 1h )
myHostname. A 192.168.1.234
*.myHostname. A 192.168.1.234
($ORIGIN
如果名称不是以点结尾,则会自动附加到所有名称上。)
答案2
这里有两个问题。
1)将名称解析为IP。
Grawity 对此的回答非常正确。为此,您可以手动编辑所有计算机上的主机文件(对于两个系统之一可行,但对于大量系统则不行)。
或者使用为此设计的系统。这个系统就是 DNS。
DNS 并非完全微不足道,但有许多简单的指南介绍如何设置它以完成有限的工作。完成设置后,您可以通过编辑单个文件来选择主机名将解析到哪个 IP。
1B)
我认为这里的主要问题可能是我对主机名、域名等概念和关系的理解不够。我为此苦苦挣扎了一段时间,但还是很难理解。
那么,这可能是个不错的起点。没有良好的基础,您就如同在流沙上建造。关于这个问题的完整答案可能不适合一篇文章。因此,请在其他地方寻找完整答案。
2)HTTP。
HTTP 是一种奇怪的协议。互联网上几乎所有协议都通过 TCP/IP 工作。数据报通过 TCP 或 UDP 发送到 IP。
另一方面,HTTP 还在其请求中包含主机名。这允许您从一个 IP:端口组合运行多个不同的网页。通常这非常方便,但它确实需要您发送(并解析)正确的主机。这意味着您首先要谷歌一下并阅读有关 DNS 的入门知识。