HTTP 502

HTTP 502

🔍遇到问题

测试同学反馈APP中一个接口测试的时候偶发性有502出现,网络稳定,服务也没有新的变更,从Nginx accesslog日志中能看到upstream_response_time:0.000,upstream_status:502(如下图)。

从Nginx error日志中可以看到 error_message:upstream prematurely closed connection while reading response header from upstream,在读取上游服务器响应头时,上游服务器提前关闭了连接。

✅ 排查问题

upstream_response_time,upstream_status的 Nginx HTTP502 官方解释

根据 "upstream_status": "502",一般是下面三种情况:

  1. 后端服务不可用
    • 后端服务进程挂掉、端口未监听、服务重启中等
  2. 后端返回了 502 状态码
    • 服务逻辑中有异常抛出但未处理好,直接返回了 502,比如框架层或业务逻辑处理失败
  3. 上游服务负载过高,直接拒绝连接或立即响应 502
    • 比如连接池满、资源耗尽、数据库连接失败等导致无法处理请求

把这三种情况都复现一下,加深理解。

🚨后端服务不可用

Nginx error日志中显示 connect() failed (111: Connection refused) while connecting to upstream 这样的字符

🚨后端返回了 502 状态码

import random
import time
from http.server import BaseHTTPRequestHandler, HTTPServer

class UnstableUpstreamHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        # 40% 概率模拟上游服务器提前关闭连接
        if random.random() < 0.4:
            # 开始发送响应头
            self.send_response(200)
            self.send_header("Content-type", "text/plain")
            self.end_headers()
            
            # 模拟处理延迟(可选)
            #time.sleep(0.5)
            
            # 主动中断连接(不发送响应体)
            self.connection.close()
            return
        
        # 30% 概率返回 502 错误
        if random.random() < 0.3:
            self.send_error(502, "Bad Gateway")
        else:
            # 正常响应
            self.send_response(200)
            self.send_header("Content-type", "text/plain")
            self.end_headers()
            self.wfile.write(b"OK - Request Successful")

if __name__ == "__main__":
    server_address = ("", 28080)
    httpd = HTTPServer(server_address, UnstableUpstreamHandler)
    print("Server running at http://localhost:8000")
    print("Behavior patterns:")
    print(" - 40% chance: Upstream prematurely closes connection (simulates Nginx error)")
    print(" - 30% chance: Returns 502 Bad Gateway")
    print(" - 30% chance: Normal 200 OK response")
    httpd.serve_forever()

Nginx access日志中upstream_status返回了502,error日志中没有错误记录。

🚨上游服务负载过高,直接拒绝连接或立即响应 502

# backend.py

import socket

def start_backend_server(host='0.0.0.0', port=28080):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket:
        server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        server_socket.bind((host, port))
        server_socket.listen(5)
        print(f"🚀 模拟后端服务启动:http://{host}:{port}")
        print("💡 收到请求后会立即断开连接,模拟 'upstream prematurely closed connection'")

        while True:
            client_socket, addr = server_socket.accept()
            print(f"🔌 收到请求来自:{addr}")
            try:
                # 读取请求内容(可选)
                data = client_socket.recv(1024)
                print(f"📩 请求头内容(前1024字节):\n{data.decode('utf-8', errors='ignore')}")

                # 不返回任何数据
                # 只是关闭连接
                client_socket.close()
            except Exception as e:
                print(f"❌ 处理请求时出错:{e}")

if __name__ == "__main__":
    start_backend_server()

Nginx access日志中upstream_status返回了502,Nginx error日志中 upstream prematurely closed connection while reading response header from upstream

📌 小结

这个错误的本质是:

Nginx 转发请求给后端服务(Upstream)后,在等待后端返回 HTTP 响应头时,后端服务“提前关闭了连接”,Nginx 没有收到完整的响应头,于是记录了此错误。

留下回复

error: Content is protected !!