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错误主要与后端服务器的响应超时有关。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/95815.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JMeter接口自动化测试(数据驱动)

之前我们的用例数据都是配置在HTTP请求中,每次需要增加,修改用例都需要打开JMeter重新编辑,当用例越来越多的时候,用例维护起来就越来越麻烦,有没有好的方法来解决这种情况呢?我们可以将用例的数据存放在cs…

MyBatis过时了吗?

点击下方“JavaEdge”,选择“设为星标” 第一时间关注技术干货! 免责声明~ 任何文章不要过度深思! 万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案…

3263页学习资料,一本在手,python不愁!

Python3.11已经发布,新的版本速度提升2倍,以弥补与其他编程语言在速度上的缺陷。可以预见Python语言在未来的应用范围会越来越广。 python学习方向建议: 如果你是本科及以下学历,建议你学习以下两个方向 爬虫。简单的爬虫库&am…

手机图片合成gif怎么操作?用这个网站试试

制作gif动图的工具越来越多,但是很多时候使用电脑并不方便,想要在手机上制作gif动图的时候应该怎么办呢?很简单,给大家分享一款无需下载手机浏览器就能操作的gif制作(https://www.gif.cn/)工具-GIF中文网&a…

朋友圈怎么定点发朋友圈?

微信朋友圈是我们日常生活中常用的社交媒体之一。但有时我们忙碌而可能会忘记发布朋友圈,或是因时间不合适而无法发布。那么,有没有一种方法可以在规定的时间内自动发布朋友圈呢? 当然有啦! 定时发朋友圈可以帮助我们在特定时间点…

使用ebpf 监控linux内核中的nat转换

1.简介 Linux NAT(Network Address Translation)转换是一种网络技术,用于将一个或多个私有网络内的IP地址转换为一个公共的IP地址,以便与互联网通信。 在k8s业务场景中,业务组件之间的关系十分复杂. 由于 Kubernete…

tortoiseSVN树冲突解决方案

方案一: 手动导出 trunk 上的文件(夹),把本地目录文件(夹)删了并替换成 trunk上的,再点击测试合并方案二: 如果执行了方案一还是冲突,确认本地和trunk文件一致后,可以跳过冲突的revision

【数据结构】初探时间与空间复杂度:算法评估与优化的基础

🚩纸上得来终觉浅, 绝知此事要躬行。 🌟主页:June-Frost 🚀专栏:数据结构 🔥该文章主要了解算法的时间复杂度与空间复杂度等相关知识。 目录: 🌏 时间复杂度&#x1f52d…

目标检测算法改进系列之Backbone替换为FocalNet

FocalNet 近些年,Transformers在自然语言处理、图像分类、目标检测和图像分割上均取得了较大的成功,归根结底是自注意力(SA :self-attention)起到了关键性的作用,因此能够支持输入信息的全局交互。但是由于…

计算机网络——计算机网络的性能指标(上)-速率、带宽、吞吐量、时延

目录 速率 比特 速率 例1 带宽 带宽在模拟信号系统中的意义 带宽在计算机网络中的意义 吞吐量 时延 发送时延 传播时延 处理时延 例2 例3 速率 了解速率之前,先详细了解一下比特: 比特 计算机中数据量的单位,也是信息论中信…

剑指offer——JZ26 树的子结构 解题思路与具体代码【C++】

一、题目描述与要求 树的子结构_牛客题霸_牛客网 (nowcoder.com) 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构) 假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2}&…

cad图纸如何防止盗图(一个的制造设计型企业如何保护设计图纸文件)

在现代企业中,设计图纸是公司的重要知识产权,关系到公司的核心竞争力。然而,随着技术的发展,员工获取和传播设计图纸的途径越来越多样化,如何有效地防止员工复制设计图纸成为了企业管理的一大挑战。本文将从技术、管理…

计算机竞赛 题目:基于python的验证码识别 - 机器视觉 验证码识别

文章目录 0 前言1 项目简介2 验证码识别步骤2.1 灰度处理&二值化2.2 去除边框2.3 图像降噪2.4 字符切割2.5 识别 3 基于tensorflow的验证码识别3.1 数据集3.2 基于tf的神经网络训练代码 4 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于pyt…

NEFU数字图像处理(1)绪论

一、简介 1.1什么是数字图像 图像是三维场景在二维平面上的影像。根据其存储方式和表现形式,可以将图像分为模拟图像和数字图像两大类 图像处理方法:光学方法、电子学方法 模拟图像:连续的图像数字图像:通过对时间上和数值上连续…

阿里云ECS和轻量服务器有什么区别?

阿里云服务器ECS和轻量应用服务器有什么区别?轻量和ECS优缺点对比,云服务器ECS是明星级云产品,适合企业专业级的使用场景,轻量应用服务器是在ECS的基础上推出的轻量级云服务器,适合个人开发者单机应用访问量不高的网站…

二叉树的初步认识

二叉树是这么一种树状结构:每个节点最多有两个孩子,左孩子和右孩子 重要的二叉树结构 完全二叉树(complete binary tree)是一种二叉树结构,除最后一层以外,每一层都必须填满,填充时要遵从先左后…

[Spring] @Bean 修饰方法时如何注入参数

目录 一、Bean 的简单使用 1、正常情况 2、问题提出 二、解决方案 1、Qualifier 2、直接写方法名 三、特殊情况 1、DataSource 一、Bean 的简单使用 在开发中,基于 XML 文件配置 Bean 对象的做法非常繁琐且不好维护,因此绝大部分情况下都是使用…

【新的小主机】向日葵远程控制ubuntu

向日葵远程控制ubuntu 一、简介二、问题及解决方法2.1 向日葵远程连接Ubuntu22主机黑屏?2.2 Ubuntu如何向日葵开机自启?2.3 无显示器情况下,windows远程桌面连接Ubuntu? 三、美化桌面3.1 安装/解压3.2 设置3.3 右上角显示实时网速 四、安装d…

运营人必备这个微信运营工具

微信管理系统CRM在各行各业都有应用的场景---IT互联网、制造业、商业服务、金融投资、教育培训、房产家装、电商、政务等20行业领域均得到广泛应用。 微信CRM管理系统的主要功能: 多个微信号聚合聊天:解决多个微信来回切换,换着手着手机的麻烦…

Spring MVC程序开发(JavaEE进阶系列3)

目录 前言: 1.什么是Spring MVC 1.1MVC的定义 1.2MVC和Spring MVC的关系 1.3为什么要学习Spring MVC 2.Spring MVC项目的创建 3.Spring MVC框架的使用 3.1连接的功能 3.1.1RequestMapping 3.1.2GetMapping 3.1.3PostMapping 3.2获取参数的功能 3.2.1获…