Problembehandlung bei 502 Fehlern in ARR
Dieser Artikel hilft Ihnen, die Probleme im Zusammenhang mit 502 Fehlern im Application Request Routing (ARR) zu beheben.
Gilt für: Internetinformationsdienste
HTTP 502 – Übersicht
Wenn Sie mit BEREITSTELLUNGen für IIS-Anwendungsanforderungsrouting (ARR) arbeiten, ist einer der Fehler, die Möglicherweise angezeigt wird, "HTTP 502 – Ungültiges Gateway". Der Fehler 502.3 bedeutet, dass ARR beim Handeln als Proxy nicht die Anforderung an den Upstreamserver abschließen und eine Antwort an den Client senden konnte. Dieses Problem kann aus mehreren Gründen auftreten. Ein Fehler beim Herstellen einer Verbindung mit dem Server, keine Antwort vom Server oder der Server hat zu lange gedauert, um zu reagieren (Timeout). Wenn Sie den Fehler reproduzieren können, indem Sie die Webfarm vom Controller durchsuchen und detaillierte Fehler auf dem Server aktiviert sind, wird möglicherweise ein Fehler angezeigt, der der folgenden Fehlermeldung ähnelt:
Die Ursache des Fehlers bestimmt, was Sie tun sollten, um das Problem zu beheben.
502.3 Timeoutfehler
ARR verwendet den Fehlercode im vorherigen Screenshot, um die Anforderung zu proxyn und die Quelle des Fehlers zu ermitteln, da er den Rückgabecode von WinHTTP enthält.
Sie können den Fehlercode mit dem Tool err.exe decodieren. In diesem Beispiel gehört der Fehlercode zu ERROR_WINHTTP_TIMEOUT. Sie finden diese Informationen auch in den IIS-Protokollen für die betreffende Website auf dem ARR-Controller. Im Folgenden finden Sie einen Auszug aus dem IIS-Protokolleintrag für den Fehler 502.3, wobei die meisten Felder der besseren Lesbarkeit halber gekürzt wurden:
sc-status | sc-substatus | sc-win32-status | Zeit genommen |
---|---|---|---|
502 | 3 | 12002 | 29889 |
Der win32-Status 12002 entspricht dem auf der Fehlerseite gemeldeten Fehler ERROR_WINHTTP_TIMEOUT.
Was genau ist ein Timeout?
Sie können dieses Timeout überprüfen, indem Sie die Ablaufverfolgung fehlgeschlagener Anforderungen auf dem IIS-Server aktivieren. Der erste Punkt, den Sie sehen können, im Protokoll der fehlgeschlagenen Anforderungsablaufverfolgung und hier wurde die Anforderung im ARR_SERVER_ROUTED-Ereignis gesendet. Der zweite Punkt ist die X-ARR-LOG-ID, mit der Sie die Anforderung auf dem Zielserver nachverfolgen können. Dadurch können Sie das Ziel oder ziel der HTTP-Anforderung nachverfolgen:
77. ARR_SERVER_ROUTED RoutingReason="LoadBalancing", Server="192.168.0.216", State="Active", TotalRequests="3", FailedRequests="2", CurrentRequests="1", BytesSent="648", BytesReceived="0", ResponseTime="15225" 16:50:21.033
78. GENERAL_SET_REQUEST_HEADER HeaderName="Max-Forwards", HeaderValue="10", Replace="true" 16:50:21.033
79. GENERAL_SET_REQUEST_HEADER HeaderName="X-Forwarded-For", HeaderValue="192.168.0.204:49247", Replace="true" 16:50:21.033
80. GENERAL_SET_REQUEST_HEADER HeaderName="X-ARR-SSL", HeaderValue="", Replace="true" 16:50:21.033
81. GENERAL_SET_REQUEST_HEADER HeaderName="X-ARR-ClientCert", HeaderValue="", Replace="true" 16:50:21.033
82. GENERAL_SET_REQUEST_HEADER HeaderName="X-ARR-LOG-ID", HeaderValue="dbf06c50-adb0-4141-8c04-20bc2f193a61", Replace="true" 16:50:21.033
83. GENERAL_SET_REQUEST_HEADER HeaderName="Connection", HeaderValue="", Replace="true" 16:50:21.033
Das folgende Beispiel zeigt, wie dies in den Protokollen der Fehleranforderungsprotokollierung des Zielservers aussehen kann. Sie können überprüfen, ob Sie die richtige Anforderung gefunden haben, indem Sie die Werte "X-ARR-LOG-ID" in beiden Ablaufverfolgungen abgleichen.
185. GENERAL_REQUEST_HEADERS Headers="Connection: Keep-Alive Content-Length: 0 Accept: */* Accept-Encoding: gzip, deflate Accept-Language: en-US Host: test Max-Forwards: 10 User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0) X-Original-URL: /time/ X-Forwarded-For: 192.168.0.204:49247 X-ARR-LOG-ID: dbf06c50-adb0-4141-8c04-20bc2f193a61
<multiple entries skipped for brevity>
345. GENERAL_FLUSH_RESPONSE_END BytesSent="0", ErrorCode="An operation was attempted on a nonexistent network connection. (0x800704cd)" 16:51:06.240
Im vorherigen Beispiel können Sie sehen, dass der ARR-Server vor dem Senden der HTTP-Antwort getrennt wurde. Der Zeitstempel für GENERAL_FLUSH_RESPONSE_END kann als grober Anhaltspunkt verwendet werden, um den entsprechenden Eintrag in den IIS-Protokollen auf dem Zielserver zu finden.
date | time | s-ip | cs-method | cs-uri-stem | cs-uri-query | s-port | cs-username | sc-status | sc-substatus | sc-win32-status | Zeit genommen |
---|---|---|---|---|---|---|---|---|---|---|---|
2011-07-18 | 16:51:06 | 192.168.0.216 | GET | /Zeit/ | - | 80 | - | 200 | 0 | 64 | 45208 |
IIS auf dem Zielserver protokollierte einen HTTP 200-Statuscode, der angibt, dass die Anforderung erfolgreich abgeschlossen wurde. Außerdem hat sich der Win32-Status in 64 geändert, der ERROR_NETNAME_DELETED zugeordnet ist. Dieser Statuscode weist im Allgemeinen darauf hin, dass der Client (ARR in diesem Fall der 'Kunde' ist), der vor Abschluss der Anforderung getrennt wurde.
Ursache
Der ARR-Server hat ein Timeout gemeldet, in dem Sie zuerst nachschauen sollten.
Obwohl das Memberserverprotokoll angibt, dass die Antwort in 45 Sekunden (45208 ms) gesendet wurde, gibt der IIS-Protokolleintrag vom ARR-Server an, dass die benötigte Zeit sehr nahe bei 30 Sekunden liegt. Dies weist darauf hin, dass ARR die Anforderung ausgibt, und Sie können dies bestätigen, indem Sie das Proxytimeout in den Proxyeinstellungen der Serverfarm anzeigen. Standardmäßig ist sie auf 30 Sekunden festgelegt.
In diesem Fall können Sie also deutlich sehen, dass das ARR-Timeout kürzer war als die Ausführung der Anforderung. Daher sollten Sie überprüfen, ob diese Ausführungszeit typisch war, oder wenn Sie prüfen müssen, warum die Anforderung länger als erwartet dauerte. Wenn diese Ausführungszeit erwartet und normal war, sollte das Erhöhen des ARR-Timeouts den Fehler beheben.
Weitere mögliche Gründe für ERROR_WINHTTP_TIMEOUT sind:
ResolveTimeout
: Tritt auf, wenn die Namensauflösung länger als der angegebene Timeoutzeitraum dauert.ConnectTimeout
: Tritt auf, wenn es länger dauert als der angegebene Timeoutzeitraum, um eine Verbindung mit dem Server herzustellen, nachdem der Name aufgelöst wurde.SendTimeout
: Tritt auf, wenn das Senden einer Anforderung länger dauert als dieser Timeoutwert. Der Sendevorgang wird abgebrochen.ReceiveTimeout
: Tritt auf, wenn eine Antwort länger als dieser Timeoutwert dauert. Die Anforderung wird abgebrochen.
Wenn Sie die ersten beiden Gründe beobachten und ResolveTimeout
ConnectTimeout
die zuvor beschriebene Problembehandlungsmethode nicht funktionierte. Dies liegt daran, dass sie keinen Datenverkehr auf dem Zielserver sehen würden und daher den Fehlercode nicht kennen würden. In diesem Fall oder ConnectTimeout
in diesem Fall ResolveTimeout
möchten Sie möglicherweise eine WinHTTP-Ablaufverfolgung für zusätzliche Einblicke erfassen. Weitere Beispiele zur Problembehandlung und Ablaufverfolgung finden Sie im Abschnitt "WinHTTP- oder WEBIO-Ablaufverfolgung" und in den folgenden Blogs:
- 502.3 Bad Gateway „Timeout des Vorgangs“ mit IIS Application Request Routing (ARR)
- Winhttp-Ablaufverfolgungsoptionen für die Problembehandlung mit Application Request Routing
502.3 Verbindungsfehler
502.3 Fehler werden auch zurückgegeben, wenn die Verbindung zwischen ARR und dem Mitgliedsserver mitten im Datenstrom unterbrochen wird. Um diese Art von Problem zu testen, erstellen Sie eine .aspx Seite, die aufgerufen wird Response.Close()
. Im folgenden Beispiel gibt es ein Verzeichnis namens "time", das mit einer .aspx Seite als Standarddokument in diesem Verzeichnis konfiguriert ist. Wenn Sie versuchen, zum Verzeichnis zu navigieren, zeigt ARR die folgende Fehlermeldung an:
Der Fehler 0x80072efe entspricht ERROR_INTERNET_CONNECTION_ABORTED. Die Anforderung kann auf den Server zurückverfolgt werden, der sie tatsächlich verarbeitet hat, indem die gleichen Schritte verwendet werden, die weiter oben in dieser Problembehandlung verwendet wurden, mit einer Ausnahme. Während die Anforderungsablaufverfolgung auf dem Zielserver die auf dem Server verarbeitete Anforderung anzeigt, wird der zugeordnete Protokolleintrag nicht in den IIS-Protokollen angezeigt. Stattdessen wird diese Anforderung im HTTPERR-Protokoll wie folgt protokolliert:
HTTP/1.1 GET /time/ - 1 Connection_Dropped DefaultAppPool
Die integrierten Protokolle auf dem Zielserver enthalten keine zusätzlichen Informationen zum Problem, daher wäre der nächste Schritt das Sammeln einer Netzwerkablaufverfolgung vom ARR-Server. Im vorherigen Beispiel wird die .aspx Seite aufgerufen Response.Close()
, ohne Daten zurückzugeben. Wenn Sie dies in einer Netzwerkablaufverfolgung anzeigen, wird angezeigt, dass ein Connection: close
HTTP-Header vom Zielserver stammt. Mit diesen Informationen können Sie mit einer Untersuchung beginnen, warum die Connection: close
Kopfzeile gesendet wurde.
Der folgende Fehler ist ein weiteres Beispiel für eine ungültige Antwort vom Memberserver:
In diesem Beispiel hat ARR damit begonnen, Daten vom Client zu empfangen, aber beim Lesen des Entity Body ist etwas schief gelaufen. Dies führte dazu, dass der 0x80072f78 Fehlercode zurückgegeben wurde. Verwenden Sie zum weiteren Untersuchen den Netzwerkmonitor auf dem Memberserver, um eine Netzwerkablaufverfolgung des Problems zu erhalten. Dieses spezielle Fehlerbeispiel wurde durch Aufrufen Response.Close()
der ASP.net-Seite nach dem Senden eines Teils der Antwort und anschließenden Aufrufen Response.Flush()
erstellt. Wenn der Datenverkehr zwischen dem ARR-Server und den Mitgliedsservern über SSL läuft, kann die WinHTTP-Ablaufverfolgung unter Windows Server 2008 oder die WebIO-Ablaufverfolgung unter Windows Server 2008 R2 zusätzliche Informationen liefern. Die WebIO-Ablaufverfolgung wird weiter unten in dieser Problembehandlung beschrieben.
502.4 Es konnte kein geeigneter Server gefunden werden, um die Anforderung weiterzuleiten
Der HTTP 502.4-Fehler mit einem zugeordneten Fehlercode von 0x00000000 weist im Allgemeinen darauf hin, dass alle Member der Farm offline oder anderweitig nicht erreichbar sind.
Der erste Schritt besteht darin, zu überprüfen, ob die Mitgliedsserver online sind. Um dies zu überprüfen, wechseln Sie zum Knoten "Server " unter der Farm im IIS-Manager.
Um die Offlineserver zurückzugeben, klicken Sie mit der rechten Maustaste auf den Servernamen, und wählen Sie "Zum Lastenausgleich hinzufügen" aus. Wenn Sie die Server nicht wieder online schalten können, überprüfen Sie, ob die Mitgliedsserver vom ARR-Server erreichbar sind. Überprüfen Sie den Bereich "Ablaufverfolgungsnachrichten " auf der Seite "Server ", um nach Hinweisen zum Problem zu suchen. Wenn Sie Web Farm Framework (WFF) 2.0 verwenden, wird diese Fehlermeldung möglicherweise angezeigt, wenn der Anwendungspool neu gestartet wird. Sie müssen den Webdienst neu starten, um wiederherzustellen.
WinHTTP- oder WebIO-Ablaufverfolgung
In der Regel liefern Paketerfassungstools wie WireShark Ihnen die Informationen, die Sie benötigen, um genau zu identifizieren, was zeitüberschreitung ist. Es gibt jedoch Zeiten (z. B. wenn der Datenverkehr SSL verschlüsselt ist), die Sie für einen anderen Ansatz verwenden müssen. Ab Windows 7 und Windows Server 2008 R2 können Sie die WinHTTP-Ablaufverfolgung mithilfe des Netsh-Tools aktivieren, indem Sie den folgenden Befehl an einer Administrator-Eingabeaufforderung ausführen:
netsh trace start scenario=internetclient capture=yes persistent=no level=verbose tracefile=c:\temp\net.etl
Reproduzieren Sie dann das Problem. Nachdem das Problem reproduziert wurde, beenden Sie die Ablaufverfolgung, indem Sie den folgenden Befehl ausführen:
netsh trace stop
Der stop
Befehl dauert ein paar Sekunden, bis er abgeschlossen ist. Wenn sie fertig ist, finden Sie eine net.etl-Datei und eine net.cab Datei in C:\temp
. Sie müssen sicherstellen, dass der C:\temp
Ordner vorhanden ist, bevor Sie die obigen Befehle ausführen. Die .cab Datei enthält Ereignisprotokolle und andere Daten, die bei der Analyse der ETL-Datei hilfreich sein können.
So analysieren Sie das Protokoll
Öffnen Sie es in Netmon 3.4 oder höher.
Stellen Sie sicher, dass Sie Ihr Parserprofil eingerichtet haben. Um dies zu erreichen, öffnen Sie das Menü "Extras>", wählen Sie die Registerkarte "Parserprofile" >aus, und wählen Sie dann die Schaltfläche "Als aktiv festlegen" aus, um die Änderungen anzuwenden.
Scrollen Sie durch die Ablaufverfolgung, bis Sie die w3wp.exe Instanz finden, in der ARR ausgeführt wird, indem Sie mit der Spalte mit dem UT-Prozessnamen korrelieren.
Klicken Sie mit der rechten Maustaste auf w3wp, und wählen Sie "Namen des UT-Prozesses hinzufügen" aus, um den Filter anzuzeigen. Dadurch wird der Anzeigefilter ähnlich wie folgt festgelegt:
UTProcessName == "w3wp.exe (1432)"
Sie können die Ergebnisse weiter filtern, indem Sie folgende Änderung vornehmen:
UTProcessName == "w3wp.exe (<pid>)" AND ProtocolName == "WINHTTP_MicrosoftWindowsWinHttp"
Sie müssen durch die Ausgabe scrollen, bis Sie den Timeoutfehler gefunden haben. Im folgenden Beispiel wurde ein Timeout für eine Anforderung ausgeführt, da es mehr als 30 Sekunden (Standardtimeout von ARR) dauerte.
336 2:32:22 PM 7/22/2011 32.6380453 w3wp.exe (1432) WINHTTP_MicrosoftWindowsWinHttp WINHTTP_MicrosoftWindowsWinHttp:12:32:23.123 ::sys-recver starts in _INIT state
337 2:32:22 PM 7/22/2011 32.6380489 w3wp.exe (1432) WINHTTP_MicrosoftWindowsWinHttp WINHTTP_MicrosoftWindowsWinHttp:12:32:23.123 ::current thread is not impersonating
340 2:32:22 PM 7/22/2011 32.6380584 w3wp.exe (1432) WINHTTP_MicrosoftWindowsWinHttp WINHTTP_MicrosoftWindowsWinHttp:12:32:23.123 ::sys-recver processing WebReceiveHttpResponse completion (error-cdoe = ? (0x5b4), overlapped = 003728F0)
341 2:32:22 PM 7/22/2011 32.6380606 w3wp.exe (1432) WINHTTP_MicrosoftWindowsWinHttp WINHTTP_MicrosoftWindowsWinHttp:12:32:23.123 ::sys-recver failed to receive headers; error = ? (1460)
342 2:32:22 PM 7/22/2011 32.6380800 w3wp.exe (1432) WINHTTP_MicrosoftWindowsWinHttp WINHTTP_MicrosoftWindowsWinHttp:12:32:23.123 ::ERROR_WINHTTP_FROM_WIN32 mapped (?) 1460 to (ERROR_WINHTTP_TIMEOUT) 12002
343 2:32:22 PM 7/22/2011 32.6380829 w3wp.exe (1432) WINHTTP_MicrosoftWindowsWinHttp WINHTTP_MicrosoftWindowsWinHttp:12:32:23.123 ::sys-recver returning ERROR_WINHTTP_TIMEOUT (12002) from RecvResponse()
344 2:32:22 PM 7/22/2011 32.6380862 w3wp.exe (1432) WINHTTP_MicrosoftWindowsWinHttp WINHTTP_MicrosoftWindowsWinHttp:12:32:23.123 ::sys-req completes recv-headers inline (sync); error = ERROR_WINHTTP_TIMEOUT (12002)
Im folgenden Beispiel war der Inhaltsserver vollständig offline:
42 2:26:39 PM 7/22/2011 18.9279133 WINHTTP_MicrosoftWindowsWinHttp WINHTTP_MicrosoftWindowsWinHttp:12:26:39.704 ::WinHttpReceiveResponse(0x11d23d0, 0x0) {WINHTTP_MicrosoftWindowsWinHttp:4, NetEvent:3}
43 2:26:39 PM 7/22/2011 18.9279633 WINHTTP_MicrosoftWindowsWinHttp WINHTTP_MicrosoftWindowsWinHttp:12:26:39.704 ::sys-recver starts in _INIT state {WINHTTP_MicrosoftWindowsWinHttp:4, NetEvent:3}
44 2:26:39 PM 7/22/2011 18.9280469 WINHTTP_MicrosoftWindowsWinHttp WINHTTP_MicrosoftWindowsWinHttp:12:26:39.704 ::current thread is not impersonating {WINHTTP_MicrosoftWindowsWinHttp:4, NetEvent:3}
45 2:26:39 PM 7/22/2011 18.9280776 WINHTTP_MicrosoftWindowsWinHttp WINHTTP_MicrosoftWindowsWinHttp:12:26:39.704 ::sys-recver processing WebReceiveHttpResponse completion (error-cdoe = WSAETIMEDOUT (0x274c), overlapped = 003728F0) {WINHTTP_MicrosoftWindowsWinHttp:4, NetEvent:3}
46 2:26:39 PM 7/22/2011 18.9280802 WINHTTP_MicrosoftWindowsWinHttp WINHTTP_MicrosoftWindowsWinHttp:12:26:39.704 ::sys-recver failed to receive headers; error = WSAETIMEDOUT (10060) {WINHTTP_MicrosoftWindowsWinHttp:4, NetEvent:3}
47 2:26:39 PM 7/22/2011 18.9280926 WINHTTP_MicrosoftWindowsWinHttp WINHTTP_MicrosoftWindowsWinHttp:12:26:39.704 ::ERROR_WINHTTP_FROM_WIN32 mapped (WSAETIMEDOUT) 10060 to (ERROR_WINHTTP_TIMEOUT) 12002 {WINHTTP_MicrosoftWindowsWinHttp:4, NetEvent:3}
48 2:26:39 PM 7/22/2011 18.9280955 WINHTTP_MicrosoftWindowsWinHttp WINHTTP_MicrosoftWindowsWinHttp:12:26:39.704 ::sys-recver returning ERROR_WINHTTP_TIMEOUT (12002) from RecvResponse() {WINHTTP_MicrosoftWindowsWinHttp:4, NetEvent:3}
Weitere Ressourcen
- Fehlersuche-Tool
- Winhttp-Fehlercodes
- Ablaufverfolgung von Anforderungsfehlern
- Winhttp-Ablaufverfolgung
- Netzwerkmonitor
Informationen zum Haftungsausschluss von Drittanbietern
Die in diesem Artikel genannten Drittanbieterprodukte stammen von Herstellern, die von Microsoft unabhängig sind. Microsoft gewährt keine implizite oder sonstige Garantie in Bezug auf die Leistung oder Zuverlässigkeit dieser Produkte.