当前位置: 首页 > news >正文

Nginx与Spring Boot的错误模拟实践:探索502和504错误的原因

文章目录

    • 前言
    • 502和504区别---都是Nginx返回的
    • access.log和error.log介绍
    • SpringBoot结合Nginx实战502 and 504
      • 准备工作
        • Nginx配置
        • host配置
        • SpringBoot
      • 502模拟
        • access.log
        • error.log
      • 504模拟
        • access.log
        • error.log
      • 500模拟
        • access.log
        • error.log
    • 总结

前言

刚工作那会,最常见的报错是500 Internal Server Error ,曾经也碰到过前端反馈502 Bad Gateway 或者 504 Gateway Time-out,那时候傻傻的搞不懂,以为这种都是外部服务或者网络运维部那边的问题。

当时那个服务里正好有个调用日志,平时会记录各种200,4xx状态码的信息。于是我跑到服务日志里去搜索了一下502这个数字,毫无发现。于是跟反映错误的前端说,“服务日志里并没有502的记录,你是不是搞错啦?”

现在想想,果然那时候还是个小白。。。

502和504区别—都是Nginx返回的

我们实际企业级应用,访问肯定是有nginx这层代理的,如下图所示:

有了nginx这一中间层后,客户端从直连服务端,变成客户端直连nginx,再由nginx直连服务端。从一个TCP连接变成两个TCP连接。

于是,当服务器发生异常时,nginx发送给服务器的那条TCP连接就不能正常响应,nginx在得到这一信息后,就会返回5xx错误码给客户端,也就是说5xx的报错,其实是由nginx识别出来,并返回给客户端的,服务端本身,并不会有5xx的日志信息。所以上面说到的,前端收到了我服务的502报错,但我在自己的服务日志里却搜索不到这一信息。

image-20230910114454105

502错误和504错误都表示前端访问后端服务器时出现了问题,但它们之间有以下区别:

502错误(Bad Gateway):

  • 502错误是指反向代理服务器(如Nginx)作为中间代理,在请求转发过程中从后端服务器接收到了无效的响应。
  • 502错误通常与后端服务器的故障、崩溃、无响应或错误配置等问题有关。
  • 反向代理服务器无法获取有效的响应,因此返回502错误给前端客户端。
  • 502错误表示中间代理服务器与后端服务器之间的通信存在问题。

504错误(Gateway Timeout):

  • 504错误是指反向代理服务器在规定的时间内无法从后端服务器获取到有效的响应。
  • 504错误通常与后端服务器的响应超时有关,即后端服务器处理请求的时间超过了反向代理服务器设置的超时时间。
  • 反向代理服务器在规定时间内未收到有效的响应,因此返回504错误给前端客户端。
  • 504错误表示反向代理服务器在等待后端服务器响应时超时。

access.log和error.log介绍

在Nginx中,access.log和error.log是两个重要的日志文件,用于记录服务器的访问和错误信息。下面是关于这两个日志文件的介绍:

  1. access.log:
    • access.log是Nginx服务器记录所有访问请求的日志文件。
    • 它包含了每个请求的详细信息,如访问时间、客户端IP地址、请求方法、请求的URL、HTTP协议版本、返回的状态码、传输字节数等。
    • access.log对于分析和监视服务器的访问模式、流量分析、性能调优和安全审计非常有用。
    • 默认情况下,access.log文件位于Nginx的安装目录下的logs文件夹中,可以通过在配置文件中进行配置来更改日志文件的位置和格式。
  2. error.log:
    • error.log是Nginx服务器记录所有错误和警告信息的日志文件。
    • 它包含了服务器处理请求时发生的错误、异常、警告和其他问题的详细信息。
    • error.log对于故障排除、错误诊断和监视服务器的健康状态非常有用。
    • 默认情况下,error.log文件也位于Nginx的安装目录下的logs文件夹中,可以通过在配置文件中进行配置来更改日志文件的位置和格式。

所以当我们配置了nginx代理以后,每次访问都会在access.log里面有访问记录,报错时,会在error.log记录对应信息

SpringBoot结合Nginx实战502 and 504

实际运用中,我碰到的502正常都是服务挂了,504一般都是服务超时了,现在我就模拟这两种情况

准备工作

Nginx配置

首先将nginx进行配置,当我们访问www.testnginx.com//test502Or504 会自动代理访问到http://localhost:8080/test502Or504

 server{listen 80;server_name www.testnginx.com; #请求的域名proxy_send_timeout 2s;     # 设置发送超时时间,proxy_read_timeout 2s;	 # 设置读取超时时间。location /test502Or504{proxy_pass http://localhost:8080/test502Or504;}}
host配置
127.0.0.1  www.testnginx.com
SpringBoot
@Slf4j
@RestController
public class TestControllerForThis {@RequestMapping("/test502Or504")public String test502Or504() {ThreadUtil.sleep(3000L);return "test502Or504";}
}	

直接访问:localhost:8080/test502Or504

image-20231004225401386

502模拟

502很好模拟,由于我们上面进行了配置:www.testnginx.com//test502Or504会自动代理到http://localhost:8080/test502Or504 ,可以直接将我们的SpringBoot工程直接关闭,此时即可模拟出502报错:

直接访问:http://localhost:8080/test502Or504

image-20231004230814832

访问:http://www.testnginx.com/test502Or504

image-20231004230832673

access.log

127.0.0.1 - - [04/Oct/2023:23:06:16 +0800] “GET /test502Or504 HTTP/1.1” 502559 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36”

error.log
2023/10/04 23:06:14 [error] 15220#11328: *63 connect() failed (10061: No connection could be made because the target machine actively refused it) while connecting to upstream, client: 127.0.0.1, server: www.testnginx.com, request: "GET /test502Or504 HTTP/1.1", upstream: "http://[::1]:8080/test502Or504", host: "www.testnginx.com"
2023/10/04 23:06:16 [error] 15220#11328: *63 connect() failed (10061: No connection could be made because the target machine actively refused it) while connecting to upstream, client: 127.0.0.1, server: www.testnginx.com, request: "GET /test502Or504 HTTP/1.1", upstream: "http://127.0.0.1:8080/test502Or504", host: "www.testnginx.com"

504模拟

我们在Nginx配置了超时时间为2s,所以当我们请求的接口耗时超过2s时,就会出现504 Gateway Time-out

我们在接口里面睡眠了3s超过了配置的2s:

@RequestMapping("/test502Or504")public String test502Or504() {ThreadUtil.sleep(3000L);return "test502Or504";}

当然,直接访问http://localhost:8080/test502Or504是正常的,

image-20231004225401386

访问http://www.testnginx.com/test502Or504报错504 Gateway Time-out

image-20231004225559524

access.log

127.0.0.1 - - [04/Oct/2023:23:02:26 +0800] “GET /test502Or504 HTTP/1.1” 504 569 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36”

error.log
2023/10/04 23:02:24 [error] 15220#11328: *59 upstream timed out (10060: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond) while reading response header from upstream, client: 127.0.0.1, server: www.testnginx.com, request: "GET /test502Or504 HTTP/1.1", upstream: "http://[::1]:8080/test502Or504", host: "www.testnginx.com"
2023/10/04 23:02:26 [error] 15220#11328: *59 upstream timed out (10060: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond) while reading response header from upstream, client: 127.0.0.1, server: www.testnginx.com, request: "GET /test502Or504 HTTP/1.1", upstream: "http://127.0.0.1:8080/test502Or504", host: "www.testnginx.com"

500模拟

修改程序

@RequestMapping("/test502Or504")public String test502Or504() {if (true){throw new NullPointerException("test502Or504");}ThreadUtil.sleep(3000L);return "test502Or504";}

直接访问http://localhost:8080/test502Or504

image-20231004231328767

访问:http://www.testnginx.com/test502Or504

image-20231004231347057

access.log

127.0.0.1 - - [04/Oct/2023:23:11:07 +0800] “GET /test502Or504 HTTP/1.1” 500 310 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36”

error.log

此时不会记录500错误

总结

  • 502错误表示反向代理服务器接收到了无效的响应或与后端服务器之间通信出现问题。
  • 504错误表示反向代理服务器在规定时间内未能从后端服务器获取到有效的响应,即后端服务器响应超时。
  • 502错误主要与后端服务器的故障、崩溃或配置错误有关,而504错误主要与后端服务器的响应超时有关。

相关文章:

Nginx与Spring Boot的错误模拟实践:探索502和504错误的原因

文章目录 前言502和504区别---都是Nginx返回的access.log和error.log介绍SpringBoot结合Nginx实战502 and 504准备工作Nginx配置host配置SpringBoot 502模拟access.logerror.log 504模拟access.logerror.log 500模拟access.logerror.log 总结 前言 刚工作那会,最常…...

全志ARM926 Melis2.0系统的开发指引①

全志ARM926 Melis2.0系统的开发指引① 1. 编写目的2. Melis2.0 系统概述3. Melis2.0 快速开发3.1. Melis2.0 SDK 目录结构3.2. Melis2.0 编译环境3.3. Melis2.0 固件打包3.4. Melis2.0 固件烧录3.5.串口打印信息3.6. Melis2.0 添加和调用一个模块3.6.1. 为什么划分模块&#xf…...

2024级199管理类联考之数学基础(下篇)

平面几何(平均2题) 三角形(性质、特殊三角形、全等与相似) 性质 由不在同一直线的三条线段首尾依次连接所组成的图形三条边、三个内角、三个定点三角形内角和为180度,外角和为360度,多边形的外角和为360度,n多边形的内角和为(n-2)*180度一个外角等于不相邻的两个内角之和任意…...

HTML之如何下载网页中的音频(二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…...

【现代机器人学】学习笔记十四:中文版印刷/翻译勘误

首先声明,这个印刷/勘误并非经过官方的认可,只是我个人的粗浅的理解。如果内容有误,恳请大家谅解指正。 其实有的并不算错,只是我个人认为不太准确,在我学习过程中产生了一些小疑惑和误解。 都是一些小毛病&#xff…...

[架构之路-229]:计算机体硬件与系结构 - 计算机系统的矩阵知识体系结构

目录 一、纵向:目标系统的分层结构 1.1 目标系统的架构 1.2 网络协议栈 1.3 计算机程序语言分层 二、横向(构建目标系统的时间、开发阶段):软件工程 三、二维矩阵知识体系结构 一、纵向:目标系统的分层结构 1.1…...

第一章 visual studio下载安装

一、官网下载 地址:https://visualstudio.microsoft.com/zh-hans/ 点击免费visual studio 二、安装 运行下载好的exe文件,自定义安装目录 三、选择需要的组件安装 只需要选择标记组件,然后点击安装 等待安装完成就行 四、重启电脑 安装完之后…...

【服务器】在 Linux CLI 下安装 Anaconda

【服务器】在 Linux CLI 下安装 Anaconda 1 系统环境2 下载安装包3 安装 1 系统环境 查看系统信息 cat /etc/os-release2. 查看架构 uname -a # output # Linux localhost.localdomain 4.18.0-193.28.1.el8_2.x86_64 #1 SMP Thu Oct 22 00:20:22 UTC 2020 x86_64 x86_64 x86…...

Python中Lambda用法

在Python中,lambda函数是一种形式较短的函数,又称为匿名函数。与正常的函数不同,lambda函数没有名称,因此只能在定义时直接传递给其他函数或变量使用,而不能单独调用。 lambda函数的语法非常简单,格式如下…...

nodejs+vue养老人员活体鉴权服务系统elementui

系统 统计数据:统计报表、人员台账、机构数据、上报数据、核验报表等,养老人员活体鉴权服务是目前国家养老人员管理的重要环节,主要为以养老机构中养老人员信息为基础,每月进行活体鉴权识别并统计数据为养老补助等管理。前端功能&…...

解决caffe中的python环境安装的问题(补充)

上一篇(解决caffe中的python环境安装的问题_qiuchangyong的博客-CSDN博客)说到了安装过程中遇到的常见问题,其实还有一个忘了补充,就是在执行命令"sudo python -m pip install -r requirements.txt"后,出现p…...

面试常用排序查找算法

文章目录 1 二分查找2 冒泡排序3 堆排序4 插入排序5 快速排序6 选择排序7 希尔排序 1 二分查找 定义两个变量left和right,分别表示数组的左边界和右边界,初始值分别为0和len - 1,其中len是数组的长度。计算数组的中间位置mid,公式…...

CUDA C编程权威指南:1.1-CUDA基础知识点梳理

主要整理了N多年前(2013年)学习CUDA的时候开始总结的知识点,好长时间不写CUDA代码了,现在LLM推理需要重新学习CUDA编程,看来出来混迟早要还的。 1.CUDA 解析:2007年,NVIDIA推出CUDA&#xff08…...

讲讲项目里的仪表盘编辑器(四)分页卡和布局容器组件

讲讲两个经典布局组件的实现 ① 布局容器组件 配置面板是给用户配置布局容器背景颜色等属性。这里我们不需要关注 定义文件 规定了组件类的类型、标签、图标、默认布局属性、主文件等等。 // index.js import Container from ./container.vue; class ContainerControl extends…...

Qt模块、Qt开发应用程序类型、Qt未来主要市场、Qt6功能普及

Qt模块、Qt开发应用程序类型、Qt未来主要市场、Qt6功能普及 文章目录 1.Qt核心模块2.Qt的功能拓展3.Qt未来主要市场4.Qt6功能普及5.弃用的功能: Qt是一个跨平台的应用程序开发框架,提供了丰富的模块和工具来开发各种类型的应用程序。以下是Qt目前已有的…...

nodejs+vue高校校图书馆elementui

管理员输入书籍所在的书架位置,借阅提醒系统:可以查看个人借阅信息和图书到期提醒、挂失、检索、虚拟借书证不仅为群众提供了服务,而且也推广了自己,让更多的群众了解自己。 管理员页面: 第三章 系统分析 10 3.1需求分…...

CUDA C编程权威指南:1.2-CUDA基础知识点梳理

主要整理了N多年前(2013年)学习CUDA的时候开始总结的知识点,好长时间不写CUDA代码了,现在LLM推理需要重新学习CUDA编程,看来出来混迟早要还的。 1.闭扫描和开扫描   对于一个二元运算符 ⊕ \oplus ⊕和一个 n n n元…...

C语言—位运算符

目录 &&#xff08;位与&#xff0c;AND&#xff09;&#xff1a; |&#xff08;位或&#xff0c;OR&#xff09;&#xff1a; 位取反(~)&#xff1a; 左移(<<)&#xff1a; 右移(>>)&#xff1a; &&#xff08;位与&#xff0c;AND&#xff09;&…...

怎么才能实现一个链接自动识别安卓.apk苹果.ipa手机和win电脑wac电脑

您想要实现的功能是通过检测用户代理&#xff08;User Agent&#xff09;来识别访问设备类型并根据设备类型展示相应的页面。您可以根据以下步骤进行实现&#xff1a; 选择后端语言和框架&#xff0c;例如&#xff1a;Node.js、Express。 创建一个新的Express项目。 编写一个…...

zookeeper选举机制

全新集群选举 zookeeper 全新集群选举机制网上资料很多说法很模糊&#xff0c;仔细思考了一下&#xff0c;应该是这样 得到票数最多的机器>机器总数半数 具体启动过程中的哪个节点成为 leader 与 zoo.cfg 中配置的节点数有关&#xff0c;下面以3个举例 选举过程如下 server…...

零基础玩转CTFShow Web1-7:手把手教你用Burp Suite和蚁剑拿flag

零基础玩转CTFShow Web1-7&#xff1a;从工具配置到实战渗透全指南 第一次接触CTF比赛时&#xff0c;看着其他选手在终端里敲出神秘代码就能拿到flag&#xff0c;总觉得这是黑客才能掌握的"黑魔法"。直到自己动手尝试才发现&#xff0c;只要掌握正确的工具和方法&…...

TurboDiffusion应用场景探索:电商、教育、社交,AI视频如何赋能各行各业

TurboDiffusion应用场景探索&#xff1a;电商、教育、社交&#xff0c;AI视频如何赋能各行各业 1. 引言&#xff1a;AI视频生成的新纪元 想象一下这样的场景&#xff1a;早上9点&#xff0c;电商运营团队需要为100款新产品制作展示视频&#xff1b;下午2点&#xff0c;在线教…...

跨境电商多语种支持:SenseVoice-Small ONNX语音识别模型部署与本地化适配

跨境电商多语种支持&#xff1a;SenseVoice-Small ONNX语音识别模型部署与本地化适配 1. 环境准备与快速部署 SenseVoice-Small ONNX模型是一个经过量化处理的高效语音识别解决方案&#xff0c;特别适合跨境电商场景中的多语言语音处理需求。这个模型支持超过50种语言&#x…...

LiuJuan Z-Image Generator参数详解:CFG Scale=2.0与12步生成高质量人像

LiuJuan Z-Image Generator参数详解&#xff1a;CFG Scale2.0与12步生成高质量人像 想用AI生成一张惊艳的人像照片&#xff0c;却发现要么细节模糊&#xff0c;要么风格怪异&#xff0c;怎么调参数都达不到理想效果&#xff1f;如果你也遇到过类似问题&#xff0c;那今天这篇文…...

从Windows命令行小白到Scoop社区贡献者:我的完整成长指南

从Windows命令行小白到Scoop社区贡献者&#xff1a;我的完整成长指南 【免费下载链接】Scoop A command-line installer for Windows. 项目地址: https://gitcode.com/gh_mirrors/sc/Scoop 想要在Windows系统上快速安装和管理软件&#xff1f;厌倦了繁琐的图形界面安装过…...

viem ABI工具使用教程:编码、解码和类型推断全攻略

viem ABI工具使用教程&#xff1a;编码、解码和类型推断全攻略 【免费下载链接】viem TypeScript Interface for Ethereum 项目地址: https://gitcode.com/gh_mirrors/vi/viem viem是一个轻量级、可组合且类型安全的TypeScript以太坊接口工具库&#xff0c;其强大的ABI工…...

OpenClaw技能市场指南:Qwen3.5-4B-Claude适配的20个实用模块

OpenClaw技能市场指南&#xff1a;Qwen3.5-4B-Claude适配的20个实用模块 1. 为什么需要关注技能市场&#xff1f; 第一次接触OpenClaw时&#xff0c;我以为它只是个能执行简单命令的自动化工具。直到在ClawHub技能市场里发现"会议纪要生成器"模块&#xff0c;才意识…...

LSTM电池SOC估计最基本方法及全包代码:包含两个数据集、预处理代码、模型代码与估计结果

LSTM做电池SOC估计&#xff0c;最基本的方法&#xff0c;入门必学&#xff0c;包括两个数据集&#xff0c;及其介绍、预处理代码、模型代码、估计结果等&#xff0c;这是我见过最全的一个SOC估计代码包&#xff0c;总共文件大概有70个左右最近在折腾电池SOC估计&#xff0c;发现…...

**Modbus协议深度解析:基于Python的TCP通信实战与发散创新应用**在工业自动化领域,**Modbus协议

Modbus协议深度解析&#xff1a;基于Python的TCP通信实战与发散创新应用 在工业自动化领域&#xff0c;Modbus协议因其简单、稳定和开放性成为最广泛使用的串行通信标准之一。本文将从底层原理出发&#xff0c;深入剖析 Modbus TCP 的数据帧结构&#xff0c;并结合 Python 实现…...

双模型灾备方案:OpenClaw同时配置百川2-13B-4bits与Llama3应对服务中断

双模型灾备方案&#xff1a;OpenClaw同时配置百川2-13B-4bits与Llama3应对服务中断 1. 为什么需要双模型灾备 去年冬天的一个深夜&#xff0c;我正在用OpenClaw自动处理一批技术文档的翻译任务。突然收到一连串报警通知——原本稳定运行的Qwen模型服务因为网络波动彻底失联。…...