一. 问题

今天同事遇到一个问题同一个保存接口操作,第一个可以保存成功(请求体很小),第二个提示“500 Internal Server Error”(请求体比较大)。

二. 初步排查

刚开始以为是接口本身的问题,如是去接口所在服务器查看日志,但惊奇的是接口请求时服务日志没有任何日志输出。如是猜测可能是统一网关(gateway)的问题,遂打开统一网关的日志(记录了所有接口请求日志,接口路径,入参,出参),出乎意料的是统一网关也没有任何日志输出。继续往上层定位,查看nginx的error.log和access.log日志,但是还是没有任何错误日志输出,连正常日志都没有。

三. 深入分析

到这里已经超出我的正常理解范围了,但是通过问题现象分析应该是和请求体大小有关,且通过初步排查可以确定与nginx有关,如是通过"nginx"、“post”、"请求体过大"等关键词进行百度。通过百度了解到nginx在处理请求时,当请求体小于client_body_buffer_size时会直接在内存中处理,当请求体大于client_body_buffer_size(默认16kb)时会将请求体写入临时文件。鬼使神差的执行了一个df -h命令,发现nginx所在目录使用率已经达到100%,如是推断由于目录已经满了,导致nginx无法写入临时文件导致500错误。

四. 解决问题

通过du -h --max-depth=1命令逐步排查,发现是nacos日志过大,导致磁盘被占满。主要是access_log日志文件太多,且每个文件达到百兆以上。删除nacos日志文件后,接口请求全部正常。

五. nacos日志配置

1. conf/application.properties

# nacos检查升级日志,该配置默认为true, 可将它改为false
server.tomcat.accesslog.enabled=false

2. conf/nacos-logback.xml

可将logback中的一些日志级别调成error或warn减少不必要的日志打印
在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐