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"
,一般是下面三种情况:
- 后端服务不可用
- 后端服务进程挂掉、端口未监听、服务重启中等
- 后端返回了 502 状态码
- 服务逻辑中有异常抛出但未处理好,直接返回了 502,比如框架层或业务逻辑处理失败
- 上游服务负载过高,直接拒绝连接或立即响应 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 没有收到完整的响应头,于是记录了此错误。