502 zuordnen: Proxy Manager selbst oder ein HTTP-Proxy davor

Ein 502 hat zwei moegliche Absender, und sie sehen gleich aus:

  - Der Proxy Manager selbst. Sein nginx steht, der Dienst dahinter
    nicht. Nachgemessen: nach einem Neustart antwortet die Schnittstelle
    erst nach rund zehn Sekunden mit 200 - davor kommen 000, dann 502.
  - Ein HTTP-Proxy davor, der localhost:81 von SEINEM Rechner aus zu
    erreichen versucht und scheitert.

Unterscheiden laesst sich das an der Server-Kopfzeile: der Proxy Manager
nennt sich "openresty", ein Proxy traegt sich zusaetzlich mit "Via:"
ein. Beide Faelle nachgestellt und die Kopfzeilen abgenommen.

Die Meldung wertet das jetzt aus und sagt im ersten Fall "kurz warten,
er startet noch", im zweiten "das war nicht der Proxy Manager, pruefe
noproxy". Vorher stand dort pauschal "Serverfehler" mit einem Verweis
auf noproxy - der im haeufigeren Fall in die falsche Richtung zeigte.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-21 00:03:32 +02:00
co-authored by Claude Opus 5
parent 62ccafbbd1
commit 20c773c9c4
3 changed files with 80 additions and 8 deletions
+41 -8
View File
@@ -3772,9 +3772,9 @@ EOF
# Antwort, HTTP-Code und curls eigene Fehlermeldung getrennt
# einsammeln - ohne die drei laesst sich hinterher nicht sagen, WORAN
# es lag, und genau das ist hier der haeufigste Zeitfresser.
local body code cerr rc=0
cerr="$(mktemp)"
body="$(curl -sS --max-time 20 --noproxy '*' -w '\n%{http_code}' \
local body code cerr hdrf rc=0
cerr="$(mktemp)"; hdrf="$(mktemp)"
body="$(curl -sS --max-time 20 --noproxy '*' -w '\n%{http_code}' -D "$hdrf" \
-X POST "$base/api/tokens" \
-H 'Content-Type: application/json' \
-d "{\"identity\":\"$NPM_ADMIN_EMAIL\",\"secret\":\"$NPM_ADMIN_PASSWORD\"}" \
@@ -3784,7 +3784,7 @@ EOF
local tok; tok="$(json_str "$body" token)"
if [ -n "$tok" ]; then
rm -f "$cerr"
rm -f "$cerr" "$hdrf"
printf '%s' "$tok"
return 0
fi
@@ -3796,6 +3796,15 @@ EOF
local cmsg; cmsg="$(sed -n '1p' "$cerr" 2>/dev/null)"
if [ -n "$cmsg" ]; then printf ' curl sagt : %s\n' "$cmsg" >&2; fi
rm -f "$cerr"
# Wer hat geantwortet? Der Proxy Manager nennt sich "openresty", ein
# HTTP-Proxy traegt sich ueblicherweise mit "Via:" ein. Daran laesst
# sich ein 502 eindeutig zuordnen - sonst raet man zwischen
# "Dienst startet noch" und "Proxy dazwischen".
local srv via
srv="$(sed -n 's/^[Ss]erver:[[:space:]]*//p' "$hdrf" 2>/dev/null | tr -d '\r' | head -1)"
via="$(sed -n 's/^[Vv]ia:[[:space:]]*//p' "$hdrf" 2>/dev/null | tr -d '\r' | head -1)"
rm -f "$hdrf"
if [ -n "$srv" ]; then printf ' Antwortete : %s%s\n' "$srv" "${via:+ (ueber $via)}" >&2; fi
# Der Proxy Manager verpackt seine Meldung in "error" - sie ist die
# nuetzlichste Zeile ueberhaupt und gehoert nach oben, nicht ans Ende.
local m; m="$(json_str "$body" message)"
@@ -3858,11 +3867,35 @@ EOF
printf ' -> curl nennt einen Proxy. Pruefen: %s noproxy\n' "$SELF" >&2 ;;
esac
;;
5??)
printf ' Es hat etwas geantwortet, aber mit einem Serverfehler.
Kommt die Antwort ueberhaupt vom Proxy Manager? Ein
502|503|504)
case "$srv" in
openresty*|nginx*)
if [ -z "$via" ]; then
printf ' Der Proxy Manager selbst hat geantwortet (%s) - aber der
Dienst DAHINTER ist nicht erreichbar. Das ist normal, solange er
noch startet: nach einem Neustart dauert es rund zehn Sekunden,
bis die Schnittstelle antwortet.
Kurz warten und noch einmal, sonst ins Protokoll sehen:
%s logs
%s proxy restart\n' "$srv" "$SELF" "$SELF" >&2
else
printf ' Die Antwort kam ueber einen Proxy (Via: %s), nicht direkt.
Pruefen: %s noproxy\n' "$via" "$SELF" >&2
fi ;;
'')
printf ' Es hat etwas geantwortet, nennt sich aber nicht. Ein
HTTP-Proxy im Netz antwortet an dieser Stelle gern selbst:
%s noproxy\n' "$SELF" >&2
%s noproxy\n' "$SELF" >&2 ;;
*)
printf ' Geantwortet hat "%s" - das ist nicht der Proxy Manager
(der nennt sich "openresty"). Vermutlich ein HTTP-Proxy oder ein
anderer Dienst auf dem Port:
%s noproxy\n' "$srv" "$SELF" >&2 ;;
esac
;;
5??)
printf ' Es hat etwas geantwortet, aber mit einem Serverfehler.\n' >&2
;;
*)
printf ' Unerwartete Antwort - erwartet wurde ein Feld "token".\n' >&2