草庐IT

Nginx Proxy timeout排错

Mr_陈 2023-03-28 原文
一、环境

  当前的环境为nginx作为前端反向代理,upstream为两台tomcat。


二、原因

  由于最近项目属于初期阶段,平日加班也比较多,刚好碰到一天没有什么问题的时间,我早早的收拾装备开心的坐上了地铁奔向家里。

  此时,听着音乐的我快乐的坐在地铁上,突然音乐戛然而止,响起了来电的铃音。一种不好的预感油然而生,看来是有问题了。于是乎我拿出电话看到了我们老大的名字闪现在手机屏幕上,深呼一口气,接起电话。就听见我们老大说现在客户端那边报错等什么什么的。由于地铁里杂音很大,信号又不是太好,就没细问。反正就是服务器端有问题,我就先应答下来。此时的我还没有到家,于是就说到家了再看。于是老大就挂了电话。我就在心里回想到底说的是什么问题,可惜回忆了半天终还是没有听清说了什么。


三、排错

  到家打开电脑,登上QQ,就看到了群里client那边再反映的问题,截图显示部分请求服务端的资源出现了request timed out的现象。于是我就登陆到服务器端。首先查看各个进程是否正常。在确定正常之后,访问页面测试下也是正常的。由于客户端调用的是接口文件,浏览器没有办法直接测试访问,只能通过nginx的日志查看问题。

  客户端那边测试的是https的协议,此时就查看https的部分日志:

2015/08/06 19:15:29 [error] 17709#0: *1380648 upstream timed out (110: Connection timed out) while sending request to upstream, client: xxx, server: www.xxxx.com, request: "POST /xxx/pub/xxx.do HTTP/1.1", upstream: "http://xxxx:8082/xxx.do", host: "www.xxxx.com:443" 2015/08/06 19:16:11 [error] 17709#0: *1380648 upstream timed out (110: Connection timed out) while sending request to upstream, client: xxx, server: www.xxxx.com, request: "POST /xxx/pub/xxx.do HTTP/1.1", upstream: "http://xxxx:8082/xxx.do", host: "www.xxxx.com:443"  2015/08/06 19:17:29 [error] 17709#0: *1380648 upstream timed out (110: Connection timed out) while sending request to upstream, client: xxx, server: www.xxxx.com, request: "POST /xxx/pub/xxx.do HTTP/1.1", upstream: "http://xxxx:8082/xxx.do", host: "www.xxxx.com:443" 2015/08/06 19:29:29 [error] 17709#0: *1380648 upstream timed out (110: Connection timed out) while sending request to upstream, client: xxx, server: www.xxxx.com, request: "POST /xxx/pub/xxx.do HTTP/1.1", upstream: "http://xxxx:8082/xxx.do", host: "www.xxxx.com:443"  日志格式就类似上面的这些类容,看到这些,我就想到可能是nginx的proxy的一些超时时间的问题,于是就修改了time out的时间设置。

  再次测试还是有此问题,我仔细想了一下,突然发现这边测试的是https,而我修改的好像只是http的超时时间,于是再次修改,心里暗自激动的认为这下该OK了吧。没想到修改完之后,客户端那边测试还是一样的问题。此时就有些郁闷了。

  由于我实时的再监控着后台日志,再次发现虽然报错,但是有些区别:

2015/08/06 19:47:31 [error] 17708#0: *1381368 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: xxx.xxx.xxx.xxx, server: www.xxx.com, request: "POST /xxx/xxx/xxxx.do HTTP/1.1", upstream: "http://xxx.xxx.xxx:8082/xxx/home/xxx.do", host: " 2015/08/06 19:50:11 [error] 12300#0: *1381368 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: xxx.xxx.xxx.xxx, server: www.xxx.com, request: "POST /xxx/xxx/xxxx.do HTTP/1.1", upstream: "http://xxx.xxx.xxx:8082/xxx/home/xxx.do", host: "www.xxx.com:443"  2015/08/06 19:55:04 [error] 132648#0: *1381368 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: xxx.xxx.xxx.xxx, server: www.xxx.com, request: "POST /xxx/xxx/xxxx.do HTTP/1.1", upstream: "http://xxx.xxx.xxx:8082/xxx/home/xxx.do", host: "www.xxx.com:443"  可以看到日志里面的错误码和报错信息发生了改变。按照这个提示,应该是upstream向nginx发送了重置的请求,这是为什么呢?

  网上搜索了一下,发现大部分说的都还是time out的问题,有个别说是客户端get的头过大,但是明显这里用的是POST方法。那还是按照time out去查找问题看看,于是又想客户端那边咨询下是否设置了超时时长,客户端那边给的是设置了10s的超时时长。这样看来应该也不会有问题呀。10s的情况下应该是足够服务器处理和响应了。


  此时还没有想到问题在什么地方,只能多监控写日志看看,于是把http的访问日志和错误日志以及https的访问日志和错误日志都以tail的方式实时的监控着。就在这些日志监控当中,突然发现了几点奇怪的现象:

  3.1、http的错误日志也有connection time out的现象

2015/08/06 19:29:44 [error] 17708#0: *1380926 upstream timed out (110: Connection timed out) while reading response header from upstream, client: xxx.xxx.xxx.xxx, server: www.xxxx.com, request: "GET /xxx/xxx/xxx.png HTTP/1.1", upstream: "http://xxx.xxx.xxx:8082/xxx/p_w_picpath/xxx.png", host: "www.xxx.com", referrer: "http://www.xxx.com/xxx/xxx/xxx.do?user_id=57&from=singlemessage&isappinstalled=1" 2015/08/06 19:29:44 [error] 17708#0: *1380930 upstream timed out (110: Connection timed out) while reading response header from upstream, client: xxx.xxx.xxx.xxx, server: www.xxx.com, request: "GET /xxx/xxx/xxx.png HTTP/1.1", upstream: "http://xx.xxx.xxx.xxx:8082/xxx/xxx/xxx.png", host: "www.xxx.com", referrer: "http://www.xxx.com/xxx/xxx/xxx.do?user_id=57&from=singlemessage&isappinstalled=1"  3.2、https访问日志和错误日志在同一时间点会出现两个请求

# 错误日志 2015/08/06 21:58:59 [error] 22498#0: *527 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: xxx.xxx.xxx.xxx, server: www.xxx.com, request: "POST /xxx/xxx/xxx.do HTTP/1.1", upstream: "http://xxx.xxx.xxx.xxx:8082/xxx/xxx/xxx.do", host: "www.xxx.com:443"# 访问日志 xxx.xxx.xxx.xxx - - [06/Aug/2015:21:58:59 +0800] "POST /xxx/xxx/xxx.do HTTP/1.1" 200 1100 "-" "xxx/1.1.0 (iPhone Simulator; iOS 8.1; Scale/2.00)" "-"  上述可以看到在同一个时间点出现了两个请求,并且一个成功,一个失败,并且访问日志有很多499响应码的请求。而499响应码是说/* 499, client has closed connection */.就是说客户端主动关闭了连接,或者nginx两次提交post间隔过快也会出现此问题。

  1、客户端主动关闭连接,是因为过了设置的超时时长就会关闭连接。这个又回到了10s的超时时长和频繁的发生time out现象的问题上了。

  2、提交POST请求过快,nginx会认为属于不安全的请求,便主动拒绝连接。这个有可能是客户端那边不间断的测试数据导致,对于这种情况,可以对nginx的配置文件进行配置以下参数来进行不主动关闭。

proxy_ignore_client_abort on;  但是这样配置是不安全的。此时为了解决问题,就怀着激动的心先配置测试下。

  可悲的是配置了该参数,发现还是不能解决问题。心里落差再一次发生。不过没有关系,终究还是通过日志能发现各种问题的。


  在确定排除了第二点的疑问后,回到第一点(也就是3.1的问题上),为什么客户端那边测试的https的协议,在http协议里同样会出现该问题。这里的疑点重重呀。于是着重从这里下手。

  客户端测试的接口文件是放在某个应用的目录下,虽然不能直接访问接口文件,但是可以访问其应用web目录。

  通过访问web目录和结合日志发现了问题的所在:

  1、nginx proxy使用的是默认的轮询,所以每一次可能会调度到不同的后端服务器上。而此刻访问刷新页面时,其中一次会有些卡顿,看后台日志发现每次卡顿时都会出现一个报错。

  2、出现报错的同时,正常的日志也会出现一次成功的请求。在看页面又出现了一次刷新。这就解释了之前同一个时间点出现两次请求的现象了。

  3、此时在回头去看报错日志就很容易的看出问题所在了,发现所有的error都属于upstream中的同一台tomcat。就说明是这台tomcat有问题。


  在nginx中down掉这台tomcat,客户端那边测试一切OK。问题到此解决。至于为什么这台有问题,是白天开发直接动过tomcat的代码。问题只能白天上班来配合查找代码的问题。



四、总结

  经过此次的排错,总结一下:

  1、遇到问题要冷静处理,从最基础的开始排查。

  2、善于利用各应用程序的日志进行错误跟踪。

  3、还是要对各应用做到了然于心,对于各类报错尽量知道大概是什么问题。从哪里排查。

  

搞完问题,记录下来发现时间已经不早了,是该休息休息,为明天有更好的战斗状态!


有关Nginx Proxy timeout排错的更多相关文章

  1. Pod异常状态排错 - 2

    一、常用命令首先列出Pod排查过程中我这边的常用命令:查看Pod状态:kubectlgetpodpodname-owide查看Pod的yaml配置:kubectlgetpodspodname-oyaml查看pod事件:kubectldescribepodspodname查看容器日志:kubectllogspodsname-ccontainer-name二、Pod状态Error:Pod启动过程中发生错误NodeLost:Pod所在节点失联Unkown:Pod所在节点失联或其它未知异常Waiting:Pod等待启动Pending:Pod等待被调度ContainerCreating:Pod容器正在被

  2. Error排错:The node was low on resource: ephemeral-storage. - 2

    问题摘要Thenodewaslowonresource:ephemeral-storage.错误的排除与解决步骤因为我在一个1master3nodes的K8S集群内部署了Argo+Jenkins+mysql+spark+postsql等等一系列软件服务,导致计算机运行极度缓慢。我将有关的namespace进行强制删除,降低资源的使用。在测试的名称空间重新创建简单pod的时候发生以上报错,现记录相应的排除工作思路。核心原因是磁盘被占用,存储空间不足。产生存储空间不足的原因是我近期想学大数据课程,转移了大量资料,导致系统无法调度正确操作:进入根目录查看什么文件夹占用磁盘存储过大,处理掉相应的文件夹

  3. 【排错】ubuntu系统不能被ssh的解决方案(其一) - 2

    今天新装了一款ubuntu最新的操作系统22.04LTS,界面真的是相当美观。在图形界面上配置好网卡之后,能通百度。但是不能被mobaxterm进行ssh连接。接着照着网上的说明,进行了配置。(1)删除openssh-client包,在安装openssh-client和openssh-server包,发现不行(2)用aptupdate命令更新后,发现可以装包,但是还是不能ssh(3)重启sshd服务,也没有用(4)配置/etc/ssh/sshd_config文件,permitrootloginyes,修改后重启,还是没有用(5)reboot重启系统,没有用。(6)最后,我看了下ubuntu的i

  4. 【排错】error: error parsing recommended.yaml: error converting YAML to JSON: yaml: line 14:的解决方式 - 2

    在部署k8s的时候,编写k8s的dashboard文件,遇到以下错误,error:errorparsingrecommended.yaml:errorconvertingYAMLtoJSON:yaml:line14:couldnotfindexpected':'一查说是缩进的问题,我看了下指南 又看看我的yaml文件缩进也没问题重新运行了一次[root@k8s-master~]#kubectlapply-frecommended.yamlnamespace/kubernetes-dashboardunchangedserviceaccount/kubernetes-dashboarduncha

  5. Error排错:container runtime network not ready - 2

    概述(问题)在对K8S集群进行格式化,重新部署后,所有节点都处于NotReady状态。针对K8S状态进行查询,发现问题是:containerruntimenetworknotready。现将相关的报错和解决记录如下。因为重装集群的时候,将/etc/cni目录彻底删除,所以需要重装组件kubernetes-cni。报错KubeletNotReady  containerruntimenetworknotready:NetworkReady=falsereason:NetworkPluginNotReadymessage:docker:networkpluginisnotready:cniconf

  6. Error排错:container runtime network not ready - 2

    概述(问题)在对K8S集群进行格式化,重新部署后,所有节点都处于NotReady状态。针对K8S状态进行查询,发现问题是:containerruntimenetworknotready。现将相关的报错和解决记录如下。因为重装集群的时候,将/etc/cni目录彻底删除,所以需要重装组件kubernetes-cni。报错KubeletNotReady  containerruntimenetworknotready:NetworkReady=falsereason:NetworkPluginNotReadymessage:docker:networkpluginisnotready:cniconf

  7. [Android Studio]开发APP应用出现软件程序打开闪退的排错 - 2

         🟧🟨🟩🟦🟪AndroidDebug🟧🟨🟩🟦🟪Topic 发布安卓学习过程中遇到问题解决过程,希望我的解决方案可以对小伙伴们有帮助。 📋笔记目录  💻问题描述👀原因分析🎯解决方法🚩结尾💻问题描述在AndroidStudio中开发应用程序在尝试调试开发的APP时,会出现项目在AndroidStudio上显示软件发布成功,但是在虚拟机上点击运行软件时会一直闪退,没有办法显示页面以及页面内容的情况。 👀原因分析这种问题主要为软件的运行界面指定出现了问题,因为项目本身在AndroidStudio上是成功装载上的,也就是说,项目本身不存在资源类依赖导入失败而造成的闪退问题的。项目本身是成功载入的

  8. [Android Studio]开发APP应用出现软件程序打开闪退的排错 - 2

         🟧🟨🟩🟦🟪AndroidDebug🟧🟨🟩🟦🟪Topic 发布安卓学习过程中遇到问题解决过程,希望我的解决方案可以对小伙伴们有帮助。 📋笔记目录  💻问题描述👀原因分析🎯解决方法🚩结尾💻问题描述在AndroidStudio中开发应用程序在尝试调试开发的APP时,会出现项目在AndroidStudio上显示软件发布成功,但是在虚拟机上点击运行软件时会一直闪退,没有办法显示页面以及页面内容的情况。 👀原因分析这种问题主要为软件的运行界面指定出现了问题,因为项目本身在AndroidStudio上是成功装载上的,也就是说,项目本身不存在资源类依赖导入失败而造成的闪退问题的。项目本身是成功载入的

  9. IDEA搭建vue-cli | vue-router | 排错思路、Webpack、Axios、周期、路由、异步、重定向 - 2

    💗wei_shuo的个人主页💫wei_shuo的学习社区🌐HelloWorld!Vue.js概述Vue是一套用于构建用户界面的渐进式JavaScript框架。与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue也完全能够为复杂的单页应用(SPA)提供驱动MVVM模型Model:模型层,表示JavaScript对象View:视图层,表示DOM(HTML操作的元素)ViewModel:连接视图层和数据的中间件,Vue.js就是MVVM中的ViewModel

  10. IDEA搭建vue-cli | vue-router | 排错思路、Webpack、Axios、周期、路由、异步、重定向 - 2

    💗wei_shuo的个人主页💫wei_shuo的学习社区🌐HelloWorld!Vue.js概述Vue是一套用于构建用户界面的渐进式JavaScript框架。与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue也完全能够为复杂的单页应用(SPA)提供驱动MVVM模型Model:模型层,表示JavaScript对象View:视图层,表示DOM(HTML操作的元素)ViewModel:连接视图层和数据的中间件,Vue.js就是MVVM中的ViewModel

随机推荐