今天线上出了一个问题,有业务发现部分接口今天开始返回了500。
由于这几天都没有变更,一下子不知道问题出在哪个地方。
由于我们这个项目比较特殊,中间有一层nginx的反向代理。因此第一步就是判断请求到底在哪一层出现了问题。
首先,在应用侧,能很明显的看到请求下游返回了500的状态码。
但是在Nginx这一层没有看到有接口打进来的access log。
在nginx的下游,也没有接口打进来的日志。
这个问题就很奇怪了,如果nginx没有收到请求,那么500是谁返回的呢?
不过,自己想了一下一个很不对劲的点,nginx的日志停留在了半个小时之前!!
即使是现在正常的请求,能打到nginx的下游的请求,在nginx侧也无法留下日志了。
此时,我基本已经判定,nginx的日志打满了机器。
清理日志后,一切恢复正常。
不过还有一个问题没有搞懂,为什么还有一部分请求是可以的?
由于nginx存在buffer机制,如果请求体的大小超过buffer的大小,nginx就会用零时文件的方案来缓存请求体,但是由于磁盘打满,此时机器处于可读不可写,因此请求体过大的这部分请求就500了。