无法连接到绑定到 127.0.0.1 的服务

无法连接到绑定到 127.0.0.1 的服务

我有一台 Debian wheezy 服务器,运行着几个 Web 应用程序、一个 MongoDB 数据库和一个 Redis 服务器,它们都位于 NGinx 服务器后面。只有 NGinx 服务器是面向公众的,其他服务都位于其后面进行反向代理。此设置一直运行良好,直到两天前我的服务器所在的数据中心发生临时断电。在重新启动并进行常规故障后维护(删除锁定文件、修复数据库等)后,我注意到 NGinx 在其代理的每个服务上都超时了。以下是我为尝试解决该问题所采取的步骤:

  1. 检查日志
    我检查了每个服务的日志,一切都很干净,没有错误(除了 NGinx 报告上游连接超时)。

  2. 检查服务是否正在运行
    WSGI 应用程序、MongoDB 等的所有进程都在运行,我也检查了 netstat:

    # netstat -ntple
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode       PID/Program name
    tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      0          21730537    1469/nginx      
    tcp        0      0 0.0.0.0:2525            0.0.0.0:*               LISTEN      1000       21730714    1511/python     
    tcp        0      0 0.0.0.0:9090            0.0.0.0:*               LISTEN      1000       21730931    1627/python     
    tcp        0      0 0.0.0.0:2022            0.0.0.0:*               LISTEN      0          21730651    1553/sshd       
    tcp        0      0 0.0.0.0:9000            0.0.0.0:*               LISTEN      1000       21730885    1624/python     
    tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      104        21730531    1376/mongod     
    tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      105        21730621    1532/redis-server *
    tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      1000       21730731    1500/python     
    tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      0          21730536    1469/nginx      
    tcp6       0      0 :::2022                 :::*                    LISTEN      0          21730654    1553/sshd       
    tcp6       0      0 :::6379                 :::*                    LISTEN      105        21730619    1532/redis-server *
    
  3. 检查环回接口并 ping 127.0.0.1
    环回接口已正确设置/etc/network/interfacesifconfig报告其已启动并正在运行。我还可以毫无问题地 ping 127.0.0.1 和 localhost。

  4. 禁用防火墙
    禁用防火墙并没有改变这种情况。连接仍然超时。

  5. 尝试通过 telnet 连接
    我尝试通过 telnet 连接到其中一项服务,然后我注意到一个奇怪的模式:

    # telnet 127.0.0.1 6379
    Trying 127.0.0.1...
    telnet: Unable to connect to remote host: Connection timed out
    
    # telnet ::1 6379
    Trying ::1...
    Connected to ::1.
    Escape character is '^]'.
    

当我尝试通过 IPv4 连接到服务(该示例中为 Redis)时,它会超时,但如果我尝试通过 IPv6 连接,它会立即连接。是否有与 IPv4 连接相关的某些文件可能导致此类行为?有没有办法在不重新映像服务器的情况下修复此问题?

更新

在阅读 SYN 的回答后,我尝试连接到相同的服务(见上文),但使用的是我服务器的公共 IP(但仍在服务器内部),并且它立即连接。我的理解是它之所以有效是因为它监听 0.0.0.0,该 IP 接受任何接口上的连接。但从 127.0.0.1 连接仍然不起作用,连接到专门监听 127.0.0.1 的服务也不起作用。我的结论是,我的环回接口(在 IPv4 上)确实存在问题。以下是 的输出ifconfig

# ifconfig
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:7984 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7984 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:711801 (695.1 KiB)  TX bytes:711801 (695.1 KiB)

venet0    Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:127.0.0.2  P-t-P:127.0.0.2  Bcast:0.0.0.0  Mask:255.255.255.255
          UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1
          RX packets:35812 errors:0 dropped:0 overruns:0 frame:0
          TX packets:47530 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:2568793 (2.4 MiB)  TX bytes:34332070 (32.7 MiB)

venet0:0  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:*public ip*  P-t-P:*public ip*  Bcast:*public ip*  Mask:255.255.255.255
          UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1

那里有什么东西可以解释环回接口的故障吗?是否有其他我忽略的日志或配置文件可以解释或潜在地修复我在此接口上遇到的问题?

更新 2

快速更新一下,我的服务器是 OpenVZ 下的 VPS。通过(持续的)谷歌搜索,我发现 OpenVZ 的网络与其他平台略有不同,因此我在此提供该信息,以便引导我们朝着正确的方向前进。但据我所知,遇到与我类似的问题的人似乎都没有找到解决方案……(例如这个帖子来自 Unix 和 Linux StackExchange)。

答案1

我敢打赌,您可以在 IPv4 上连接 redis。除非 redis 监听127.0.0.1:6379,否则您无法连接(也无法 telnet)到 localhost。

但对 IPv6 不够熟悉,无法解释它为什么会起作用。

再次,我怀疑 nginx 代理 redis 的流量。您能告诉我们您启用了哪些虚拟主机吗?您的 python 进程监听是否正常0.0.0.0?如果是,您可能应该重新启用您已禁用的任何防火墙规则。


更新,阅读 OP 的更新:

很高兴看到您找到了一些东西。同时,我关于连接到本地主机的第一句话完全是错误的,抱歉。

相关内容