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 安装 Docker Desktop

    介绍 Docker 有两种版本:Docker Desktop 和 Docker Engine (也称作 Docker CE).Docker Desktop 是带图形界面的版本,非常适合需要在桌面环境中 ...

  2. 新手入门 | 搭建 AI 模型开发环境

    目录 安装显卡驱动和开发库 对于 Tesla 系列显卡 对于 N 卡 安装 CUDA 和 cuDNN 安装 Miniconda 安装 PyTorch 和 Transformers 使用 Modelsc ...

  3. Python 版本管理工具选择与 Pyenv 使用说明

    Python 版本管理工具的主要作用是帮助开发者在同一台机器上管理多个 Python 版本和环境.这对于开发和部署不同项目非常有用,因为不同项目可能依赖不同的 Python 版本或者不同的包版本. 具 ...

  4. Redis 入门 - 安装最全讲解(Windows、Linux、Docker)

    经过上一章节的介绍,相信大家对Redis已经有了大致的认知,今天主要给大家详细讲解Redis在Windows.Linux.Docker下的安装过程. 01.Windows 下面给大家介绍三种在Wind ...

  5. Python存储与读写二进制文件

    技术背景 一般情况下我们会选择使用明文形式来存储数据,如json.txt.csv等等.如果是需要压缩率较高的存储格式,还可以选择使用hdf5或者npz等格式.还有一种比较紧凑的数据存储格式,就是直接按 ...

  6. Java SE 23 新增特性

    Java SE 23 新增特性 作者:Grey 原文地址: 博客园:Java SE 23 新增特性 CSDN:Java SE 23 新增特性 源码 源仓库: Github:java_new_featu ...

  7. 普元中间件Primeton AppServer6.5部署SuperMap iServer

    本文使用Windows环境普元中间件Primeton AppServer6.5(以下简称PAS)部署SuperMap iServer 一.部署前准备 本文使用SuperMap iServer 11.0 ...

  8. 信创环境经典版SuerMap iManager ARM版部署流程

    一.环境 操作系统:银河麒麟kylin V10 CPU:鲲鹏920 SuperMap iManager 10.2.1 硬件:4H32G机器 磁盘分区格式建议如下(请严格按照如下,减少后期有用/目录资源 ...

  9. Autodesk 3d Max2020 初始化闪退

    事件起因:给同事安装完 Autodesk 3d Max2020 版本之后,软件初始化就闪退,后来在网上查了资料后解决. 解决办法如下:services.msc --> Autodesk 开头的服 ...

  10. MYSQL存储过程-练习3 repeat循环

    MYSQL存储过程-练习3 repeat循环 1 DELIMITER $$ 2 3 CREATE PROCEDURE `sp_repeat`() 4 BEGIN 5 DECLARE i INT; 6 ...