Jep*_*zen 5 postgresql ipv6 npgsql
所以我一直在开发一个连接到另一台机器上的 postgresql 服务器的 Web 应用程序。一切正常。
然后我将 Web 应用程序部署到运行 postgresql 服务器的同一台计算机上,并收到一条错误消息:
FATAL: 28000: no pg_hba.conf entry for host "fe80::ccee:154f:18f5:418f%11", user "myuser", database "mydb", SSL off
Run Code Online (Sandbox Code Playgroud)
我的 pg_hba-conf 已经有这一行:
# IPv6 local connections:
host all all ::1/128 md5
Run Code Online (Sandbox Code Playgroud)
那应该是 ipv6 的环回地址,对吗?
我可以通过添加这一行来修复它(纯粹猜测):
#host all all fe80::/16 md5
Run Code Online (Sandbox Code Playgroud)
我怀疑这可以让每个人都连接起来吗?
那么问题是为什么要使用 ipv6 而不是 ipv4?
为什么环回不起作用?
当您使用主机名进行连接时,首先发生的事情之一是 libpq(postgresql 客户端库)将尝试解析主机名。在大多数情况下,这意味着通过 DNS 查找。返回的任何地址都将用于连接。
我猜测在您的情况下,主机名解析的地址是 IPv6 地址。你的 ping 实验似乎支持了这个假设。
因此,尽管位于同一台计算机上,但它是通过主机的 IPv6 地址进行连接的。就服务器而言,它看到来自主机的 IPv6 地址的连接。该地址不是 ::1/128 (localhost),因此它与 pg_hba.conf 中的条目不匹配。
解决此问题的一种方法是将应用程序的连接字符串更改为 localhost(或 ::1/128,甚至 127.0.0.1)。这将导致 pg_hba.conf 中的环回条目被选择。
如果您使用的平台支持 UNIX 域套接字,并且当您连接到同一主机上的服务器时,最好从连接字符串中完全删除主机参数。在这种情况下,libpq 将使用本地 UNIX 域套接字连接到服务器,这比通过 IP 地址本地连接更有效。但是,由于您使用的是 .NET,该解决方案可能不适用。
| 归档时间: |
|
| 查看次数: |
2994 次 |
| 最近记录: |