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

这篇具有很好参考价值的文章主要介绍了Nginx与Spring Boot的错误模拟实践:探索502和504错误的原因。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

刚工作那会,最常见的报错是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报错,但我在自己的服务日志里却搜索不到这一信息。

nginx 504,Nginx,分布式专题,SpringBoot,nginx,spring boot,状态模式

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

nginx 504,Nginx,分布式专题,SpringBoot,nginx,spring boot,状态模式

502模拟

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

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

nginx 504,Nginx,分布式专题,SpringBoot,nginx,spring boot,状态模式

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

nginx 504,Nginx,分布式专题,SpringBoot,nginx,spring boot,状态模式

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是正常的,

nginx 504,Nginx,分布式专题,SpringBoot,nginx,spring boot,状态模式

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

nginx 504,Nginx,分布式专题,SpringBoot,nginx,spring boot,状态模式

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

nginx 504,Nginx,分布式专题,SpringBoot,nginx,spring boot,状态模式

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

nginx 504,Nginx,分布式专题,SpringBoot,nginx,spring boot,状态模式

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错误文章来源地址https://www.toymoban.com/news/detail-766440.html

总结

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

到了这里,关于Nginx与Spring Boot的错误模拟实践:探索502和504错误的原因的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Nginx错误502 Bad Gateway

    使用Nginx配置的反向代理,浏览器访问的时候出现 “502 Bad Gateway” 错误,检查了一下后台error文件,发现有类似下面的错误 其中 “upstream sent too big header while reading response header from upstream” 说明可能是nginx代理的缓冲区不够,因此需要调整一下缓冲区的配置,主要包括下面几

    2024年02月19日
    浏览(41)
  • nginx服务器报错502 Bad Gateway的原因以及解决办法

    服务器报错nginx 502 Bad Gateway的原因以及解决办法_502 bad gateway nginx_主题模板站的博客-CSDN博客

    2024年02月13日
    浏览(50)
  • 服务器报错nginx 502 Bad Gateway的原因以及解决办法

    网站页面出现502badgateway怎么办?今天我们来分析一下原因和解决办法。 nginx出现502多数是属于后端的问题,后期就是PHP的问题,在php服务当中,有两个参数非常的重要:max_requestst 和max_children;具体的原因必须要查看日志才可以弄明白! 1:FastCGI进程是否已经启动 ps aux|grep

    2023年04月20日
    浏览(66)
  • 解锁Spring Boot中的设计模式—04.桥接模式:探索【桥接模式】的奥秘与应用实践!

    桥接模式也称为桥梁模式、接口模式或者柄体(Handle and Body)模式,是将 抽象部分 与他的 具体实现部分 分离 ,使它们都可以独立地变化,通过 组合 的方式 建立 两个类之间的 联系 ,而不是继承。 桥接模式是一种结构型设计模式,旨在将抽象部分与实现部分分离,使它们

    2024年02月21日
    浏览(55)
  • 解锁Spring Boot中的设计模式—03.委派模式:探索【委派模式】的奥秘与应用实践!

    委派模式 是一种负责任务的调度和分配模式,类似于代理模式但更注重结果而非过程。它可以被视为一种特殊情况下的静态代理的全权代理,但并不属于GOF 23种设计模式之一,而是归类为行为型模式。 委派模式在Spring框架中广泛应用,其中最常见的例子是 DispatcherServlet ,它

    2024年02月19日
    浏览(56)
  • http常用状态码(204,304, 404, 504,502)含义

    网络状态码含义,常用(204,304, 404, 504,502) 200 – 服务器成功返回网页  404 – 请求的网页不存在  503 – 服务不可用  常见HTTP状态码大全  1xx(临时响应)  表示临时响应并需要请求者继续执行操作的状态代码。  代码 说明  http状态码 100 (继续) 请求者应当继续提出

    2023年04月22日
    浏览(47)
  • Nginx反向代理出现错误 502 bad gateway 案例解析

    Nginx + uwsgi + flask Flask框架写的程序,使用uwsgi启动,Nginx作为反向代理调用Flask应用。 Flask应用有些操作时间比较长,会超过1分钟,在网页端访问会出现错误: 502 bad gateway。 Nginx的错误日志中会出现错误:upstream prematurely closed connection while reading response header from upstream 经过网上

    2024年02月08日
    浏览(45)
  • 解锁Spring Boot中的设计模式—02.解释器模式:探索【解释器模式】的奥秘与应用实践!

    解释器模式(Interpreter Pattern)是一种行为设计模式,它用于定义语言的文法,并且解释语言中的表达式。在Java中,解释器模式可以用于构建解释器以解析特定的语言或表达式,如数学表达式、查询语言等。 优点: 灵活性: 解释器模式可以 灵活地添加新的表达式和规则 ,因

    2024年02月19日
    浏览(72)
  • 常见的浏览器报错[400, 401,403,404, 405, 408; 500,502,503, 504 ,505]

    在使用浏览器加载一些网站时,偶尔会遇到加载不出来并带数字的错误提示的情况。那么这些web错误的访问代码具体到底是什么意思呢? 这些状态代码表示请求可能出错,妨碍了服务器的处理。 (1) 404报错- - -无法找到文件 这应该是最常见的错误代码了,其含义是找不到要查

    2024年02月14日
    浏览(41)
  • 解决docker nginx 502错误 connect() failed (111: Connection refused) while connecting to upstream

    docker里启动了nginx容器,然后配置好了前端页面,后端服务在宿主机里启动运行,页面能正常预览,但是反向代理请求后端的时候报502,宿主机的wlan ip是192.168.1.106,宿主机docker网桥ip是172.17.0.1 若服务器是网线连接的则服务器的ip在eth0看,因为我用的是wifi所以在wlan有ip   使用

    2024年02月05日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包