先说结论:
/etc/hosts文件下缺失127.0.0.1与localhost的映射关系,添加以下两行即可:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
以下是问题发生原因及排查步骤:
启动InfluxDB提示:
2023-11-06T02:18:25.965931Z error Failed to start nats streaming server {"log_id": "0lKbcE1l000", "error": "unable to start a NATS Server on localhost:0"}
Error: unable to start a NATS Server on localhost:0
查看源码,是nats启动不成功。
由于InfluxDB的nats服务没有打印日志,因此自行编写一段测试代码:
package main
import (
"fmt"
"github.com/nats-io/gnatsd/logger"
"github.com/nats-io/gnatsd/server"
"time"
)
func main() {
s := server.New(&server.Options{
Host: "localhost",
Port: 4222,
NoSigs: true,
NoLog: false,
Debug: true,
Trace: true,
Logtime: true,
})
log := logger.NewStdLogger(true, true, true, false, true)
s.SetLogger(log, true, true)
go s.Start()
fmt.Println("Start success: ", s.ReadyForConnections(10*time.Second))
}
运行代码,提示:
./nats_test
[1440169] 2023/11/06 10:50:25.750984 [INF] Starting nats-server version 1.3.0
[1440169] 2023/11/06 10:50:25.751034 [DBG] Go build version go1.19.5
[1440169] 2023/11/06 10:50:25.751067 [INF] Git commit [not set]
[1440169] 2023/11/06 10:50:25.751911 [FTL] Error listening on port: localhost:4222, "listen tcp: lookup localhost on [::1]:53: read udp [::1]:21521->[::1]:53: read: connection refused"
有关键词read: connection refused
。查看防火墙和NAT文件:
sudo firewall-cmd --state
sudo iptables -L
cat /etc/resolv.conf
一切正常。
谷歌一下,发现这个报错在stackoverflow提到,有答案提示与/etc/hosts
文件关联,查看文件:
cat /etc/hosts
192.168.25.xx xxx
192.168.25.xx xxx
192.168.25.xx xxx
发现没有localhost字段。对比查看其他机器上的hosts文件:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
...
看来是hosts缺失了localhost相关信息。添加后,nats服务正常运行。
补充ChatGPT对于hosts文件的说明:
/etc/hosts 文件是一个用于在本地系统上进行主机名解析的静态映射文件。它通常用于将主机名映射到 IP 地址,以便在本地系统上进行名称解析,而无需依赖 DNS 服务器。
请注意,修改 /etc/hosts 文件只会影响本地系统上的名称解析。这对于在本地测试或配置特定的主机名映射很有用,但不会影响其他设备或远程系统上的名称解析。