记一次线上Nginx响应超时问题

项目背景

线上有两个项目,分别为tomcat 项目A,以及一个SpringBoot项目B,项目A,使用Nginx代理转发。

问题描述

从A项目中上传一个30秒的视频,通过HTTP上传到B项目中使用FFmpeg对其进行一系列解析等动作,然后返回视频的CDN地址。 由于此操作过程一般会耗时5-6分钟,在本地和测试环境将http请求的超时时间sockettimeout设置为10分钟,可以正常使用。 但是在生成环境下却发现有时能上传成功,有时却不行。

解决

经过多次测试发现,每次上传失败的处理时长大概都是5分钟,由于HttpClient代码里面默认设置的是5分钟,所以一直导致我认为是修改的配置没有生效。最后修改源码,将超时时间默认值改成20分钟,发现还是在5分钟左右就报错。 这个时候就可以确定肯定是有其他地方有个5分钟设置超时时间导致的。然后跟运维的同事一起分析了下nginx配置,发现有个proxy_read_timeout=300s的设置,这个时候基本上就已经定位问题原因了。 为了确定问题先在没改配置的时候使用ip地址访问上传视频,最后正常处理。然后修改配置为10分钟,通过域名访问,结果跟预想的一样,解决问题。

扩展

  • proxy_connect_timeout:后端服务器连接的超时时间,发起握手等候响应超时时间
  • proxy_read_timeout:连接成功后等候后端服务器响应时间,其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)
  • proxy_send_timeout:后端服务器数据回传时间,就是在规定时间之内后端服务器必须传完所有的数据

总结

  1. 相信自己写的代码,一开始一直认为自己的代码写的有问题,导致配置没有生效;
  2. 了解各个环境的项目架构,测试环境没有域名直接通过ip+port访问,生产有nginx代理;
  3. 遇事不要慌张,这个问题往小的说就是超时而已,往大了说视频处理不了,客户的单就完成不了,就会损失。庆幸自己遇事没有紧张以及老大的信任,让我独立解决。

One more thing