Http状态码502常见原因及排错思路

502表示Bad Gateway。当Nginx返回502错误时,通常表示Nginx作为代理服务器无法从上游服务器(如:我们的后端服务器地址)获取有效的响应。导致这种情况的原因有很多:

1、后端服务器故障

2、nginx配置问题

3、高负载或者资源耗尽

4、nginx与后端服务器通信问题

必出现502:应用挂了(服务端返回RST,nginx或者其他发出502报错)

偶尔出现502:CPU使用率高 / QPS增加 / nginx read超时时间设置问题

504 Gateway timeout 网关超时

1、一般指nginx做反向代理服务器时,所连接的服务器tomcat无响应导致的。

2、为了完成您的 HTTP 请求,该服务器访问一个上游服务器,但没得到及时的响应

3、nginx超过了自己设置的超时时间

502常见原因及排错思路

1. 后端服务器故障

检查后端服务器是否正常运行,网络连接是否正常。
可以通过 ping 命令检查网络连接:ping your_backend_server_ip
通过 telnet 命令检查后端服务器的端口是否开启:telnet your_backend_server_ip your_backend_server_port
通过 curl 命令测试后端服务器的响应:curl -I http://your_backend_server_url

2. 网关配置问题:代理地址、请求超时时间

以Nginx作为网关为例:

检查 Nginx 配置文件中的代理设置,确保代理到后端服务器的配置正确。
检查超时时间配置:proxy_read_timeout 2s; #vim /opt/nginx/nginx.conf
检查 Nginx 错误日志,查看是否有相关的错误信息:tail -f /var/log/nginx/error.log

3. 后端服务器高负载或者资源耗尽:某一时刻qps过高

# 可能是某一瞬间,服务器的qps过高导致502
可以使用 top 命令查看系统资源(CPU、MEM)使用情况

4. 网关与服务器通信问题(网络连接、端口开放等)

检查 Nginx 与后端服务器之间的防火墙设置,确保端口开放。
检查 Nginx 与后端服务器之间的网络连接是否正常,可以通过抓包工具(如 tcpdump)检查网络通信情况。

实战

今天测试反馈前端页面访问出错,因为我们前端是通过nginx请求到后端的,所以查看浏览器上查看网络请求,发现报502Bad Gateway。

:本文ip与端口等信息均以加密

1. 查看nginx.conf:观察是否是代理配置错误

首先想到是不是nginx的代理配置出了问题,结果发现nginx.conf配置文件是没有问题的,配置的代理也是正确指向我们后端服务的地址。

    server {
listen 80;
location / {
proxy_pass http://localhost:6020;
}
location /backend-api {
rewrite ^/backend-api(.*)$ $1 break;
proxy_pass http://192.168.64.145;
}
}

查看能否ping通后端服务器,发现也是通的

ping 192.168.64.145

2. 查看/var/log/nginx/error.log:查看nginx报错信息

然后准备查看nginx的报错日志信息

tail -f /var/log/nginx/error.log

发现错误信息如下:

2023/11/12 11:07:26 [error] 49448#49448: *1998 connect() failed (111: Connection refused) while connecting to upstream, client: 10.3.0.52, server: , request: "GET /backend-api/list HTTP/1.1", upstream: "http://192.168.64.145:80/list", host: "10.16.13.137", referrer: "http://192.168.64.120/page/xx"

可以看出是nginx请求我们后端的服务器没有请求成功。

3. 检查后端服务是否正常运行

查看nginx请求的后端服务器是否正常工作

因为我们使用的是k8s部署服务,所以直接观察每个pod运行状态即可

# 查看服务pod是否是running状态
kubectl get pods -n xxx

运行命令后,发现处理服务的pod状态都是正常的。

然后想到nginx请求我们的是80端口,于是通过检查端口是否处于Listen状态即可

netstat -ano | grep 80

结果发现服务器上的80端口没有被过滤出来,马上联想到是不是80端口没有开放出来

firewall-cmd --zone=public --list-ports | grep 80
# 执行命令后发现FirewallD is not running
# 查看防火墙状态
systemctl status firewalld
# 发现防火墙已经是关闭状态(为了方便测试,暂时关闭),因此防火墙不会阻拦80端口的请求

这个时候突然想到是不是ingress问题,执行命令查看k8s event信息

# 发现是有报磁盘资源不足
kubectl get event
# 查看pod详细信息,包括event
# kubectl describe pod podName

# 查看所有节点状态
kubectl get pod -n kube-system -o wide
# kubectl get pods -A -o wide

发现配置的ingress pod被驱逐。

# 查看磁盘使用情况,清理对应磁盘之后发现ingress正常工作
df -h

转载:https://blog.csdn.net/weixin_45565886/article/details/134359080

Http状态码502常见原因及排错思路的更多相关文章

  1. Http状态码502问题复盘

    问题原因分析:502 bade gateway 一般都是upstream出错,对于PHP,造成502的原因常见的就是脚本执行超过timeout设置时间,或者timeout设置过大,导致PHP进程长时间 ...

  2. HTTP 状态码(常见及分析)

    首先得明白状态码的几个大类: 状态码 响应类别 出现原因 1XX 信息性状态码(Informational) 服务器正在处理请求 2XX 成功状态码(Success) 请求已正常处理完毕 3XX 重定 ...

  3. 深入分析HTTP状态码502(nginx+php-fpm)

    我们的一个web项目,由于新上城市增多,导致访问量增大,DB压力增大,作为提供接口的业务方,最近被下游反馈大量请求"502". 502,bad gateway,一般都是upstre ...

  4. 那些代表性的HTTP状态码,你还只知道404吗?快来看看吧【转】

    前言 在网络上发送请求后,经常会根据请求的状态码去判断请求的成功失败与否,常见的状态码有200,404,500. 不过你以为HTTP请求的状态码就只有这么几个么?其实是远远比这个多的. 今天这篇文章我 ...

  5. 服务器返回的14种常见HTTP状态码

    当我们从客户端向服务器发送请求时 服务器向我们返回状态码 状态码就是告诉我们服务器响应的状态 通过它,我们就可以知道当前请求是成功了还是出现了什么问题 状态码是由3位数字和原因短语组成的(比如最常见的 ...

  6. (转)生产环境常见的HTTP状态码列表(老男孩整理)

    生产环境常见的HTTP状态码列表(老男孩整理) 原文:http://blog.51cto.com/oldboy/716294 ##################################### ...

  7. JavaWeb前置知识 : 动态和静态的区别、两种架构、常见状态码

    JavaWeb程序设计(一) : 前置知识 1.动态网页与静态网页的区别: a.不要和是否有"动感"混为一谈. b.是否随着时间.地点.用户操作的改变而改变 (例如 : 在百度上搜 ...

  8. HTTP协议 (六) 状态码详解

    HTTP协议 (六) 状态码详解 HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了.  如果 ...

  9. HTTP协议状态码详解

    HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了.  如果是做AJAX,REST,网络爬虫, ...

  10. HTTP状态码作用

    文章目录 状态码分类 常见的状态码 1xx消息 2xx成功 3xx重定向 4xx客户端错误 5xx服务器错误 HTTP状态码的作用是:web服务器用来告诉客户端,发生了什么事. 状态码位于HTTP R ...

随机推荐

  1. Ubuntu 安装 libwebkitgtk-1.0-0

    在 Ubuntu 上安装完 PDI 后启动 spoon.sh 时提示安装 libwebkitgtk-1.0-0.由于 apt 官方源中不包含此软件包,因此要添加该软件包的源,以及源对应的 gpg 公钥 ...

  2. Mongodb入门2

    $push 修饰符:用于往数组中追加元素  db.workmates.update({name:'xiaowang'},{$push:{interseta:"PHP"}})    ...

  3. ZEGO 最后一公里网络传输的容灾及优化方案

    作为运维,你是否遇到过一些用户域名解析异常,你是否又遇到过某些区域云商加速节点异常导致业务不可用,此时的你一脸茫然,不知所措?作为运维,你是否被最后一公里问题搞得焦头烂额? 那么今天我们就来探讨一下最 ...

  4. Angular Material 18+ 高级教程 – CDK Accessibility の ListKeyManager

    介绍 ListKeyManager 的作用是让我们通过 keyboard 去操作 List Items. 一个典型的例子:Menu 有 4 个步骤: tab to menu enter 打开 menu ...

  5. BOOST库array使用 类似std库的vector

    BOOST库的array,  类似std库的vector. 下图所示书籍的下载地址,我的另一篇博客内有记载: https://www.cnblogs.com/happybirthdaytoyou/p/ ...

  6. Android Qcom USB Driver学习(三)

    usb hub区分端口 USB 子系统拓扑浅析 USB ID Database VendorID and ProductID usb usb1: New USB device found, idVen ...

  7. Android复习(四)-->权限汇总

    官方地址: https://developer.android.google.cn/reference/android/Manifest.permission#public-constructors ...

  8. node.js安装及环境配置基于Windows系统

    node.js安装及环境配置-Windows系统 1. 下载安装包 https://nodejs.org/zh-cn/download/ 根据自己电脑系统及位数选择,我的电脑是Windows系统.64 ...

  9. 容器部署DNS你会吗?

    docker快速部署DNS,实现快速上线 概念 环境介绍 部署DNS 下载相关镜像 创建并启动DNS容器 简单介绍三种创建方式 容器启动停止 创建dns交互式容器 配置DNS容器相关配置 测试 修改客 ...

  10. javap和字节码

    javap 字节码的基本信息 public class Test { private int age = 10; public int getAge() { return age; } } 在 cla ...