我最近发现兰多用于本地 Web 开发,在后台使用 docker。到目前为止,它运行良好,但我必须手动将每个项目的每个域添加到我的 hosts 文件中
/etc/hosts
:
127.0.0.1 myproject.local.host
127.0.0.1 bs.myproject.local.host
127.0.0.1 bs-admin.myproject.local.host
(bs.
和bs-admin.
1 代表浏览器同步)
根据lando 文档,可以使用通配符域,而不必对每个域进行硬编码。不幸的是,这些说明适用于 MacOS,而我使用的是 Arch Linux(Manjaro Gnome 41.3)。
我试图在页面的帮助下自己弄清楚Arch Wiki:Dnsmasq和其他在线资源,但我无法让它发挥作用。
这是我目前拥有的:
- 已安装域名管理系统
sudo pacman -S dnsmasq
- 将这些行添加到
/etc/dnsmasq.conf
文件中(文件中的所有其他内容已被注释掉):listen-address=::1,127.0.0.1 expand-hosts domain=local.host
- 重新启动本地服务器
sudo systemctl restart httpd
并sudo systemctl restart dnsmasq
- 将此行添加到
~/.lando/config.yml
domain: local.host
- 重新启动 lando
lando poweroff
并lando start
但是,它不起作用:
❯ ping http://myproject.local.host:8000/
ping: http://myproject.local.host:8000/: Name or service not known
❯ ping http://myproject.local.host
ping: http://myproject.local.host: Name or service not known
❯ ping https://myproject.local.host
ping: https://myproject.local.host: Name or service not known
添加以下几行/etc/resolv.conf
也无济于事:
nameserver 127.0.0.1
更新:
dnsmasq.conf
我仍然对( dnsmasq.d
)、etc/hosts
和etc/resolv.conf
如何/etc/systemd/resolved.conf
相互作用感到困惑。但经过更多的阅读和反复试验后,我目前的情况如下:
- 将此行添加到
/etc/dnsmasq.conf
:address=/local.host/127.0.0.1
- 没有添加任何行
/etc/hosts
这些行来自StevenBlack/主持人127.0.0.1 localhost 127.0.0.1 localhost.localdomain 127.0.0.1 local 255.255.255.255 broadcasthost ::1 localhost ::1 ip6-localhost ::1 ip6-loopback fe80::1%lo0 localhost ff00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts 0.0.0.0 0.0.0.0
- 将此行添加到
/etc/resolv.conf
:nameserver 127.0.0.1
- 跑了
sudo systemctl restart NetworkManager
,sudo systemctl restart dnsmasq
- 将此行添加到
~/.lando/config.yml
domain: local.host
- 跑了
lando poweroff
,lando start
当我测试它时,我得到了这个:
❯ nslookup foo.local.host localhost
Server: localhost
Address: ::1#53
Name: foo.local.host
Address: 127.0.0.1
❯ nslookup foo.local.test
Server: 192.168.2.1
Address: 192.168.2.1#53
** server can't find foo.local.test: NXDOMAIN
❯ ping foo.local.host
ping: foo.local.host: Name or service not known
lando start
显示前两个网址绿色的底部两个红色的:
APPSERVER URLS https://localhost:49291
http://localhost:49292
http://myproject.local.host:8000/
https://myproject.local.host/
答案1
该nslookup
工具很简单:它总是读取 /etc/resolv.conf 并直接与该文件中找到的任何 DNS 服务器通信。但是,如果该文件中有多个nameserver
行,它只会使用其中一行,通常是第一行。
需要记住的是,resolv.conf 中的其他名称服务器不会被“合并”。它们仅在第一个名称服务器完全无法访问时用作后备。但如果第一个服务器做回答“我不知道 foo.local.test”,这就是最终结果– 如果其中一个服务器知道该名称,nslookup 或任何其他程序都不会继续尝试其他服务器。
如果你的 resolv.conf 列出了特殊的 dnsmasq 实例,那么不应该还列出您的路由器或任何其他 DNS 服务器 - 您的所有 DNS 查询都应通过 dnsmasq(如果需要,它会将它们转发到“真实”服务器)。
Systemd-resolved 是一个单独的主题。当它处于活动状态时,大多数程序(dig/nslookup 除外)都会直接与它通信,绕过传统的 /etc/resolv.conf 机制。Systemd-resolved 本身有两种模式:要么读取 resolv.conf,要么提供解决.conf。
因此,如果您使用 systemd-resolved 和 NetworkManager,通常应首先通过 NetworkManager(连接配置文件)更改 DNS 服务器,然后将其传播到 systemd-resolved。但如果您想手动编辑 resolv.conf,请先使用ls -l
以确保它不是符号链接到 systemd 解析的管理文件之一。如果需要,请将其删除并替换为常规文件。
此外,这些是唯一有用/etc/hosts 中的以下行:
127.0.0.1 localhost
::1 localhost
其余的都完全没用,即使它恰好来自 Debian。
答案2
经过多次反复试验和阅读在线资源后,我找到了一个似乎可行的版本。
免责声明:我非常怀疑这是正确的做法,可能还有更好的方法。我也不知道所有这些步骤是否必要,或者我的设置会给我的系统带来什么样的负面影响,我还没有注意到。
之前的问题
- NetworkManager 正在覆盖
/etc/resolv.conf
,因此我所做的任何更改都可以通过运行来恢复sudo systemctl restart NetworkManager
Arch Wiki:网络管理器 - Firefox 中缺少证书Lando 文档
工作版本
- 将此行添加到
/etc/dnsmasq.conf
:address=/local.host/127.0.0.1
- 保持
/etc/hosts
原样 - 创建
/etc/NetworkManager/conf.d/dns.conf
内容文件:[main] dns=none
nameserver 127.0.0.1
在顶部添加/etc/resolv.conf
,对我来说看起来像这样:nameserver 127.0.0.1 nameserver 192.168.2.1 nameserver fe80::1%enp0s20u2u4
- 跑步
systemctl restart dnsmasq systemctl restart NetworkManager
- 将此行添加到
~/.lando/config.yml
domain: local.host
- 跑步
lando poweroff lando rebuild -y
- 跑步
sudo trust anchor ~/.lando/certs/local.host.pem sudo trust anchor ~/.lando/certs/local.host.crt
更新
该解决方案不是持久的,内容/etc/resolv.conf
会被 NetworkManager 覆盖,例如重新启动后,它还会导致我的 wifi 连接出现问题。