我上班时遇到了一个以前从未遇到过的问题,并且很好奇这里是否有人知道是什么原因导致了这个问题。
我们从 Slicehost 运行 VPS,昨天某个时候,我们托管的网站瘫痪了(自从我对服务器做了任何操作后,几个月来一直运行正常),但只有那些通过 HTTP(使用端口 8080)的网站瘫痪了。HTTPS 网站(标准端口)仍可运行,如果他们使用以下方式进行访问https://site.com(而不是输入 site.com 并让重定向完成工作),以及直接与服务器的 SSH 连接。
直到今天早上,情况一直如此。我重启了服务器,但没用。我通过 SSH 进入服务器,确保一切正常运行。我检查的 Nginx 日志或其他日志中没有异常的错误消息。但什么也没变。然后,大约半小时后,当我正在查找原因时,网站突然又开始工作了。
我从未找到任何可能导致该问题的原因(我发现的所有问题都是客户端问题),所以我很好奇是什么可能导致了该问题。这样,如果再次发生类似的事情,我就可以更好地诊断和修复它。
答案1
几乎任何事情都可能导致问题。除非有人碰巧遇到过同样的问题,且原因相同,否则您可能无法得到所提问题的答案。
不过,为了帮助您下次找到问题的根源,这里有一些诊断技巧:
- 首先,网络流量是否真的到达服务器?
tcpdump -i ethN -n port 8080
然后尝试发出请求。如果tcpdump
没有显示任何内容,则说明是网络问题。麻烦 Softlayer。 - 如果流量确实通过,请运行
iptables -L INPUT -v >/tmp/before
,访问网站,运行iptables -L INPUT -v >/tmp/after
,然后diff /tmp/before /tmp/after
。数据包/字节数的任何差异都表明可能的防火墙规则阻止了流量。您需要验证每条规则,以确定它是否是导致问题的原因。(这就是为什么记录防火墙阻止是个好主意;这会使这类事情变得容易得多)。 - 运行
netstat -ltnp |grep :8080
以验证 nginx 确实在监听感兴趣的端口,并且正在监听正确的 IP。在这个阶段,不要想当然。 - 如果没有防火墙规则阻止流量,并且您认为应该监听的进程正在监听,那么
strace
nginx 进程(strace -p <pid> -p <pid>
对于所有与 nginx 关联的进程)将确保它们是否获取了流量,并查看它们是否(以及什么)正在对此执行操作。