我有一个运行几个Web应用程序的Debian wheezy服务器,一个MongoDB数据库和一个位于NGinx服务器后面的Redis服务器。 只有NGinx服务器是面向公众的,而其他服务则在其后面反向代理。 直到两天前,我的服务器所在的数据中心发生了暂时的停电,这种设置一直运行良好。 在重新启动并定期进行故障后维护(删除locking文件,修复数据库等)之后,我注意到NGinx在其所代理的所有服务上都超时。 以下是我尝试解决问题的步骤:
检查日志
我已经检查了每个服务的日志,一切都干净没有错误(其他NGinx报告上游连接超时)。
检查服务正在运行
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 *
检查回送接口并ping 127.0.0.1
loopback接口在/etc/network/interfaces正确设置, ifconfig报告并运行。 我也可以ping 127.0.0.1和本地没有问题。
禁用防火墙
禁用防火墙并没有改变这种情况。 连接仍然超时。
尝试通过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连接相关的文件可能导致这种types的行为? 有没有办法解决这个问题,而不必重新映像服务器?
在阅读SYN的答案后,我尝试连接到相同的服务(见上文),但使用我的服务器的公共IP(但仍然从服务器内部),它立即连接。 我的理解是,它可以工作,因为它监听0.0.0.0,它接受任何接口上的连接。 但是从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 PtP: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* PtP:*public ip* Bcast:*public ip* Mask:255.255.255.255 UP BROADCAST POINTOPOINT RUNNING NOARP MTU:1500 Metric:1
有没有什么可以解释回送接口的故障? 是否有另一个日志或configuration文件,我已经忽略了,可以解释或可能解决我与这个接口的问题?
快速更新,添加我的服务器是OpenVZ下的VPS。 从我的(继续)Googlesearch中,我发现OpenVZ的networking连接方式与其他平台有所不同,所以我将这些信息包括在内,以便我们朝着正确的方向发展。 从我所看到的,没有人有类似于我的问题似乎已经find了解决scheme…(例如从Unix和Linux的StackExchange 这篇文章 )。
我敢打赌你可以在你的IPv4上连接redis。 除非redis在127.0.0.1:6379监听,否则不能连接(也不是telnet)到本地主机。
对IPv6不够熟悉,可以解释为什么它能够工作。
然后再次,我怀疑nginx代理到redis的stream量。 你能告诉我们你的虚拟主机是否被启用? 你的python进程在0.0.0.0监听是否正常? 如果是这样,您应该可以启用您禁用的防火墙规则。
更新,阅读OP的更新:
很高兴看到你find了一些东西。 同时,关于连接本地主机的第一句话是错的,道歉。