Поделиться через


Устранение ошибок 502 в ARR

Эта статья поможет устранить проблемы, связанные с ошибками 502 в маршрутизации запросов приложений (ARR).

Применимо к: службы IIS

HTTP 502 — обзор

При работе с развертываниями маршрутизации запросов приложений IIS (ARR) одна из ошибок, которые могут возникнуть, — "HTTP 502 — недопустимый шлюз". Ошибка 502.3 означает, что при выполнении роли прокси-сервера ARR не удалось завершить запрос на вышестоящий сервер и отправить ответ клиенту. Эта проблема может возникнуть по нескольким причинам. Например, не удается подключиться к серверу, не отвечать с сервера или серверу потребовалось слишком много времени для ответа (время ожидания). Если вы можете воспроизвести ошибку, просматривая веб-ферму с контроллера, и подробные ошибки включены на сервере, может появиться сообщение об ошибке, аналогичное следующему сообщению об ошибке:

Снимок экрана: подробные ошибки 502, которые отображаются при включении подробных ошибок на сервере.

Основная причина ошибки определяет, что необходимо сделать для устранения проблемы.

Ошибки времени ожидания 502.3

ARR использует код ошибки на предыдущем снимке экрана для прокси запроса и определения источника сбоя, так как он содержит код возврата из WinHTTP.

Код ошибки можно декодировать с помощью средства err.exe. В этом примере код ошибки сопоставляется с ERROR_WINHTTP_TIMEOUT. Эти сведения также можно найти в журналах IIS для связанного веб-сайта на контроллере ARR. Ниже приведен фрагмент из записи журнала IIS для ошибки 502.3, причем большинство полей обрезаны для удобства чтения:

sc-status sc-substatus sc-win32-status время, затраченное
502 3 12002 29889

Состояние win32 12002 сопоставляется с той же ошибкой ERROR_WINHTTP_TIMEOUT, сообщаемой на странице ошибки.

Какое время ожидания истекло?

Вы можете проверить это время ожидания, включив трассировку неудачных запросов на сервере IIS. Первая точка, которую можно увидеть в журнале трассировки неудачных запросов, и именно здесь запрос был отправлен в событие ARR_SERVER_ROUTED. Второй точкой является идентификатор X-ARR-LOG-ID, который можно использовать для отслеживания запроса на целевом сервере. Это помогает отслеживать целевой объект или назначение HTTP-запроса:

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

В следующем примере показано, как это может выглядеть в журналах трассировки неудачных запросов целевого сервера. Вы можете проверить правильность запроса, сопоставив значения X-ARR-LOG-ID в обоих трассировках.

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

В предыдущем примере видно, что сервер ARR отключен до отправки HTTP-ответа. Метка времени для GENERAL_FLUSH_RESPONSE_END может использоваться в качестве грубого руководства для поиска соответствующей записи в журналах IIS на целевом сервере.

Дата Время s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username sc-status sc-substatus sc-win32-status время, затраченное
2011-07-18 16:51:06 192.168.0.216 GET /Время/ - 80 - 200 0 64 45208

СЛУЖБЫ IIS на целевом сервере зарегистрировали код состояния HTTP 200, указывающий на успешное завершение запроса. Кроме того, состояние win32 изменилось на 64, которое сопоставляется с ERROR_NETNAME_DELETED. Этот код состояния обычно указывает, что клиент (ARR является клиентом в данном случае) отключен до завершения запроса.

Причина

Сервер ARR сообщил о времени ожидания, который должен выглядеть сначала.

Хотя журнал сервера-члена указывает, что ответ был отправлен в течение 45 секунд (45208 мс), запись журнала IIS с сервера ARR указывает, что время выполнения очень близко к 30 секундам. Это означает, что ARR истекает время ожидания запроса, и вы можете подтвердить это, просмотрев время ожидания прокси-сервера в параметрах прокси-сервера фермы серверов. По умолчанию для него задано значение 30 секунд.

Таким образом, в этом случае можно четко увидеть, что время ожидания ARR было короче выполнения запроса. Таким образом, может потребоваться проверить, было ли это время выполнения типичным или если необходимо проверить, почему запрос занимает больше времени, чем ожидалось. Если это время выполнения ожидалось и нормально, увеличение времени ожидания ARR должно устранить ошибку.

Ниже перечислены другие возможные причины ERROR_WINHTTP_TIMEOUT:

  • ResolveTimeout: происходит, если разрешение имен занимает больше указанного периода времени ожидания.
  • ConnectTimeout: происходит, если требуется больше указанного периода времени ожидания для подключения к серверу после разрешения имени.
  • SendTimeout: происходит, если отправка запроса занимает больше времени ожидания, чем это значение времени ожидания. Операция отправки отменена.
  • ReceiveTimeout: происходит, если ответ занимает больше времени ожидания, чем это значение времени ожидания. Запрос отменен.

При наблюдении за первыми двумя причинами и ConnectTimeoutметодологией устранения неполадок, ResolveTimeout описанной ранее, не будет работать. Это связано с тем, что трафик на целевом сервере не отображается и поэтому не будет знать код ошибки. Таким образом, в этом случае может потребоваться записать трассировку WinHTTP для получения дополнительных ResolveTimeout ConnectTimeout сведений. См. раздел трассировки WinHTTP или WEBIO, а также в следующих блогах по устранению неполадок и трассировке:

Ошибки завершения подключения 502.3

Ошибки 502.3 также возвращаются при отключении подключения между ARR и сервером-членом. Чтобы проверить этот тип проблемы, создайте страницу .aspx, которая вызывается Response.Close(). В следующем примере есть каталог с именем time, настроенный на .aspx страницу в качестве документа по умолчанию в этом каталоге. При попытке перейти к каталогу ARR отображает следующее сообщение об ошибке:

Снимок экрана: ошибки завершения подключения.

Ошибка 0x80072efe соответствует ERROR_INTERNET_CONNECTION_ABORTED. Запрос можно отследить на сервере, который фактически обработал его, используя те же шаги, которые использовались ранее в этом средстве устранения неполадок, за исключением одного исключения. Хотя трассировка неудачных запросов на целевом сервере отображает запрос, обработанный на сервере, связанная запись журнала не отображается в журналах IIS. Вместо этого этот запрос регистрируется в журнале HTTPERR следующим образом:

HTTP/1.1 GET /time/ - 1 Connection_Dropped DefaultAppPool

Встроенные журналы на целевом сервере не предоставляют никаких дополнительных сведений о проблеме, поэтому следующим шагом будет сбор сетевой трассировки с сервера ARR. В предыдущем примере страница .aspx вызывается Response.Close() без возврата данных. При просмотре этого в трассировке сети показано, что Connection: close заголовок HTTP поступает с целевого сервера. С помощью этой информации можно начать расследование причин отправки заголовка Connection: close .

Следующая ошибка является еще одним примером недопустимого ответа с сервера-члена:

Снимок экрана: недопустимый ответ с сервера-члена.

В этом примере ARR начал получать данные от клиента, но что-то пошло не так при чтении текста сущности запроса. Это привело к возврату кода ошибки 0x80072f78. Для дальнейшего изучения используйте сетевой монитор на сервере-члене, чтобы получить сетевую трассировку проблемы. Этот конкретный пример ошибки был создан путем вызова Response.Close() на странице ASP.net после отправки части ответа и вызоваResponse.Flush(). Если трафик между сервером ARR и серверами-членами выполняется через ПРОТОКОЛ SSL, то трассировка WinHTTP в Windows Server 2008 или WebIO трассировки в Windows Server 2008 R2 может предоставить дополнительные сведения. Трассировка WebIO описана далее в этом средстве устранения неполадок.

502.4 Не удалось найти соответствующий сервер для маршрутизации запроса.

Ошибка HTTP 502.4 со связанным кодом ошибки 0x00000000 обычно указывает, что все члены фермы находятся в автономном режиме или в противном случае недоступны.

Снимок экрана: сообщение о том, что соответствующий сервер не найден для маршрутизации запроса.

Первым шагом является проверка того, что серверы-члены находятся в сети. Чтобы проверить это, перейдите на узел "Серверы" в ферме в диспетчере IIS.

Снимок экрана, на котором показано, как перейти к узлу

Чтобы вернуть автономные серверы, щелкните правой кнопкой мыши имя сервера и выберите "Добавить в балансировку нагрузки". Если вы не можете вернуть серверы обратно в сеть, проверьте, доступны ли серверы-члены с сервера ARR. Проверьте область "Сообщения трассировки" на странице "Серверы", чтобы найти некоторые подсказки о проблеме. Если вы используете web Farm Framework (WFF) 2.0, при перезапуске пула приложений может возникнуть эта ошибка. Для восстановления необходимо перезапустить службу веб-фермы.

Трассировка WinHTTP или WebIO

Как правило, средства отслеживания пакетов, такие как WireShark , предоставляют сведения, необходимые для точного определения времени ожидания. Однако существует несколько раз (например, когда трафик зашифрован SSL) и вам потребуется попробовать другой подход. Начиная с Windows 7 и Windows Server 2008 R2, можно включить трассировку WinHTTP с помощью средства netsh, выполнив следующую команду из административной командной строки:

netsh trace start scenario=internetclient capture=yes persistent=no level=verbose tracefile=c:\temp\net.etl

Затем воспроизвести проблему. После воспроизведения проблемы остановите трассировку, выполнив следующую команду:

netsh trace stop

Для stop завершения команды потребуется несколько секунд. По завершении вы найдете файл net.etl и файл net.cab в C:\temp. Перед выполнением приведенных выше команд необходимо убедиться, что C:\temp папка существует. Файл .cab содержит журналы событий и другие данные, которые могут оказаться полезными при анализе ETL-файла.

Чтобы проанализировать журнал, выполните следующие действия.

  1. Откройте его в Netmon 3.4 или более поздней версии.

  2. Убедитесь, что вы настроили профиль средства синтаксического анализа. Чтобы добиться этого, откройте меню "Параметры инструментов>", выберите профиль Windows ">Профили синтаксического анализа" и нажмите кнопку "Задать как активный", чтобы применить изменения.

  3. Прокрутите трассировку, пока не найдете экземпляр w3wp.exe , в котором выполняется ARR, соотнося с столбцом имени процесса UT.

  4. Щелкните правой кнопкой мыши w3wp и выберите "Добавить имя процесса UT" для отображения фильтра. Это задает фильтр отображения, аналогичный следующему:

    UTProcessName == "w3wp.exe (1432)"
    

Вы можете дополнительно отфильтровать результаты, изменив его следующим образом:

UTProcessName == "w3wp.exe (<pid>)" AND ProtocolName == "WINHTTP_MicrosoftWindowsWinHttp"

Прокрутите выходные данные, пока не найдете ошибку времени ожидания. В следующем примере время ожидания запроса истекло, так как для выполнения потребовалось более 30 секунд (время ожидания по умолчанию ARR).

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) 

В следующем примере сервер содержимого был полностью автономным:

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} 

Другие ресурсы

Заявление об отказе от ответственности за сведения о продуктах сторонних производителей

В этой статье упомянуты программные продукты независимых производителей. Корпорация Майкрософт не дает никаких гарантий, подразумеваемых и прочих, относительно производительности и надежности этих продуктов.