今天线上出了一个问题,有业务发现部分接口今天开始返回了500。

由于这几天都没有变更,一下子不知道问题出在哪个地方。

由于我们这个项目比较特殊,中间有一层nginx的反向代理。因此第一步就是判断请求到底在哪一层出现了问题。

首先,在应用侧,能很明显的看到请求下游返回了500的状态码。

但是在Nginx这一层没有看到有接口打进来的access log。

在nginx的下游,也没有接口打进来的日志。

这个问题就很奇怪了,如果nginx没有收到请求,那么500是谁返回的呢?

不过,自己想了一下一个很不对劲的点,nginx的日志停留在了半个小时之前!!

即使是现在正常的请求,能打到nginx的下游的请求,在nginx侧也无法留下日志了。

此时,我基本已经判定,nginx的日志打满了机器。

清理日志后,一切恢复正常。


不过还有一个问题没有搞懂,为什么还有一部分请求是可以的?

由于nginx存在buffer机制,如果请求体的大小超过buffer的大小,nginx就会用零时文件的方案来缓存请求体,但是由于磁盘打满,此时机器处于可读不可写,因此请求体过大的这部分请求就500了。