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报错,但我在自己的服务日志里却搜索不到这一信息。
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是两个重要的日志文件,用于记录服务器的访问和错误信息。下面是关于这两个日志文件的介绍:
- access.log:
- access.log是Nginx服务器记录所有访问请求的日志文件。
- 它包含了每个请求的详细信息,如访问时间、客户端IP地址、请求方法、请求的URL、HTTP协议版本、返回的状态码、传输字节数等。
- access.log对于分析和监视服务器的访问模式、流量分析、性能调优和安全审计非常有用。
- 默认情况下,access.log文件位于Nginx的安装目录下的
logs
文件夹中,可以通过在配置文件中进行配置来更改日志文件的位置和格式。
- 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
502模拟
502很好模拟,由于我们上面进行了配置:www.testnginx.com//test502Or504会自动代理到http://localhost:8080/test502Or504 ,可以直接将我们的SpringBoot工程直接关闭,此时即可模拟出502报错:
直接访问:http://localhost:8080/test502Or504
访问:http://www.testnginx.com/test502Or504
access.log
127.0.0.1 - - [04/Oct/2023:23:06:16 +0800] “GET /test502Or504 HTTP/1.1” 502
559 “-” “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是正常的,
访问http://www.testnginx.com/test502Or504报错504 Gateway Time-out
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
访问:http://www.testnginx.com/test502Or504
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. 为什么划分模块…...
2024级199管理类联考之数学基础(下篇)
平面几何(平均2题) 三角形(性质、特殊三角形、全等与相似) 性质 由不在同一直线的三条线段首尾依次连接所组成的图形三条边、三个内角、三个定点三角形内角和为180度,外角和为360度,多边形的外角和为360度,n多边形的内角和为(n-2)*180度一个外角等于不相邻的两个内角之和任意…...
HTML之如何下载网页中的音频(二)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…...
【现代机器人学】学习笔记十四:中文版印刷/翻译勘误
首先声明,这个印刷/勘误并非经过官方的认可,只是我个人的粗浅的理解。如果内容有误,恳请大家谅解指正。 其实有的并不算错,只是我个人认为不太准确,在我学习过程中产生了一些小疑惑和误解。 都是一些小毛病ÿ…...
[架构之路-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(…...
讲讲项目里的仪表盘编辑器(四)分页卡和布局容器组件
讲讲两个经典布局组件的实现 ① 布局容器组件 配置面板是给用户配置布局容器背景颜色等属性。这里我们不需要关注 定义文件 规定了组件类的类型、标签、图标、默认布局属性、主文件等等。 // 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语言—位运算符
目录 &(位与,AND): |(位或,OR): 位取反(~): 左移(<<): 右移(>>): &(位与,AND)&…...
怎么才能实现一个链接自动识别安卓.apk苹果.ipa手机和win电脑wac电脑
您想要实现的功能是通过检测用户代理(User Agent)来识别访问设备类型并根据设备类型展示相应的页面。您可以根据以下步骤进行实现: 选择后端语言和框架,例如:Node.js、Express。 创建一个新的Express项目。 编写一个…...
zookeeper选举机制
全新集群选举 zookeeper 全新集群选举机制网上资料很多说法很模糊,仔细思考了一下,应该是这样 得到票数最多的机器>机器总数半数 具体启动过程中的哪个节点成为 leader 与 zoo.cfg 中配置的节点数有关,下面以3个举例 选举过程如下 server…...
vcpkg切换 Visual Studio 版本
vcpkg切换 Visual Studio 版本 在使用vcpkg作为项目的包管理工具时,可能会遇到需要切换Visual Studio版本的情况。下面是一种简单的方法来实现这个目标,通过修改triplet文件来指定使用的Visual Studio版本。 步骤1: 创建或修改Triplet文件 首先&#…...
运算符重载
#include <iostream> using namespace std; class Num { private:int num1; //实部int num2; //虚部 public:Num(){}; //无参构造Num(int n1,int n2):num1(n1),num2(n2){}; //有参构造~Num(){}; //析构函数const Num operator(const Num &other)const //加号重载{Nu…...
Llama2-Chinese项目:7-外延能力LangChain集成
本文介绍了Llama2模型集成LangChain框架的具体实现,这样可更方便地基于Llama2开发文档检索、问答机器人和智能体应用等。 1.调用Llama2类 针对LangChain[1]框架封装的Llama2 LLM类见examples/llama2_for_langchain.py,调用代码如下所示:…...
ES6中数组的扩展
1. 扩展运算符 用三个点(...)表示,它如同rest参数的逆运算,将数组转为用逗号分隔的参数序列。扩展就是将一个集合分成一个个的。 console.log(...[1, 2, 3]); // 1, 2, 3可以用于函数调用 扩展运算符后还可以放置表达式 ...(x > 0 ? [a] : [])如…...
计算机考研 | 2016年 | 计算机组成原理真题
文章目录 【计算机组成原理2016年真题44题-9分】【第一步:信息提取】【第二步:具体解答】 【计算机组成原理2016年真题45题-14分】【第一步:信息提取】【第二步:具体解答】 【计算机组成原理2016年真题44题-9分】 假定CPU主频为5…...
Web版Photoshop来了,用到了哪些前端技术?
经过 Adobe 工程师多年来的努力,并与 Chrome 等浏览器供应商密切合作,通过 WebAssembly Emscripten、Web Components Lit、Service Workers Workbox 和新的 Web API 的支持,终于在近期推出了 Web 版 Photoshop(photoshop.adobe…...
FL Studio21.1.0水果中文官方网站
FL Studio 21.1.0官方中文版重磅发布纯正简体中文支持,更快捷的音频剪辑及素材管理器,多样主题随心换!Mac版新增对苹果M2/1家族芯片原生支持。DAW界萌神!极富二次元造型的水果娘FL chan通过FL插件Fruity Dance登场,为其…...
[BJDCTF2020]Mark loves cat
先用dirsearch扫一下,访问一下没有什么 需要设置线程 dirsearch -u http://8996e81f-a75c-4180-b0ad-226d97ba61b2.node4.buuoj.cn:81/ --timeout2 -t 1 -x 400,403,404,500,503,429使用githack python2 GitHack.py http://8996e81f-a75c-4180-b0ad-226d97ba61b2.…...
@SpringBootApplication注解的理解——如何排除自动装配 分布式情况下如何自动加载 nacos是怎么被发现的
前言 spring作为主流的 Java Web 开发的开源框架,是Java 世界最为成功的框架,持续不断深入认识spring框架是Java程序员不变的追求。 本篇博客介绍SpringBootApplicant注解的自动加载相关内容 其他相关的Spring博客文章列表如下: Spring基…...
HTTP的前世今生
史前时期 20 世纪 60 年代,美国国防部高等研究计划署(ARPA)建立了 ARPA 网,它有四个分布在各地的节点,被认为是如今互联网的“始祖”。 然后在 70 年代,基于对 ARPA 网的实践和思考,研究人员发…...
床上做受网站/网站设计方案
MUI: http://dev.dcloud.net.cn/mui/snippet/ html5plus: http://www.html5plus.org/doc/h5p.html转载于:https://www.cnblogs.com/haitaoli/p/10520749.html...
湖南网站建设熊掌号/企业seo关键词优化
SpringBoo编写测试用例出现异常:java.lang.Exception: No tests found matching异常可能的原因: 没加 @Test注解;可能是spring-test版本和Junit4不兼容;<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-…...
怎么自己制作个网站/seo入门培训
1 点击创建虚拟机 2 选择安装程序光盘映像文件 3 选择配置 4 选择Install CentOs7进行安装操作系统 5 选择中文(倒数第二个)点击确定 6 等待内容加载完毕 7 软件选择 最小安装 调试工具 系统管理 开发工具 完成 8 选择安装位置 9 KDUMP 选择禁用…...
江苏省交通建设质监网站/餐饮营销策划方案
PAGE最新电大复习资料统考《计算机应用基础》选择题复习第一章 计算机基础知识【例题与解析】1、一般认为,世界上第一台电子计算机诞生于( A )。A 1946年 B 1952年 C 1959年 D 1962年 【解析一般认为,世界上第一台数字计算机于1946年在美国宾夕法尼亚大学…...
手机wap网站建设多少钱/综合查询
vue购物车案例 目标:实现一个购物车如下。 html如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>书籍购物车</title><link rel"stylesheet" href"style.css…...
织梦怎么做网站/seog
非常感谢先生!看图吧班级表 建立及添加数据 在此省略...建立student表create table student(sid int not null auto_increment primary key,sname varchar(30),gender enum(男,女))engine innodb default charset utf8添加外键:alter table student ad…...