我有一台 Debian wheezy 服务器,运行着几个 Web 应用程序、一个 MongoDB 数据库和一个 Redis 服务器,它们都位于 NGinx 服务器后面。只有 NGinx 服务器是面向公众的,其他服务都位于其后面进行反向代理。此设置一直运行良好,直到两天前我的服务器所在的数据中心发生临时断电。在重新启动并进行常规故障后维护(删除锁定文件、修复数据库等)后,我注意到 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
环回接口已正确设置/etc/network/interfaces
并ifconfig
报告其已启动并正在运行。我还可以毫无问题地 ping 127.0.0.1 和 localhost。禁用防火墙
禁用防火墙并没有改变这种情况。连接仍然超时。尝试通过 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 的更新:
很高兴看到您找到了一些东西。同时,我关于连接到本地主机的第一句话完全是错误的,抱歉。