Compartilhar via


Solução de problemas de erros 502 no ARR

Este artigo ajuda você a resolver os problemas relacionados a erros 502 no ARR (Roteamento de Solicitação de Aplicativo).

Aplica-se a: Serviços de Informações da Internet

HTTP 502 – Visão geral

Quando você trabalha com implantações de ARR (Roteamento de Solicitação de Aplicativo) do IIS, um dos erros que você pode ver é "HTTP 502 - Gateway Incorreto". O erro 502.3 significa que, ao atuar como proxy, o ARR não conseguiu concluir a solicitação ao servidor upstream e enviar uma resposta de volta ao cliente. Esse problema pode acontecer por vários motivos. Por exemplo, falha ao se conectar ao servidor, nenhuma resposta do servidor ou o servidor demorou muito para responder (tempo limite). Se você conseguir reproduzir o erro navegando no web farm do controlador e erros detalhados estiverem habilitados no servidor, você poderá ver um erro semelhante à seguinte mensagem de erro:

Captura de tela que mostra erros 502 detalhados que aparecem quando erros detalhados são habilitados no servidor.

A causa raiz do erro determina o que você deve fazer para resolver o problema.

502.3 Erros de tempo limite

O ARR usa o código de erro na captura de tela anterior para fazer proxy da solicitação e determinar a origem da falha porque ele contém o código de retorno do WinHTTP.

Você pode decodificar o código de erro com a ferramenta err.exe. Neste exemplo, o código de erro é corresponde a ERROR_WINHTTP_TIMEOUT. Você também pode encontrar essas informações nos logs do IIS para o site associado no controlador ARR. Veja a seguir um trecho da entrada de log do IIS para o erro 502.3, com a maioria dos campos removidos para facilitar a compreensão:

status sc substatus sc sc-win32-status time-taken
502 3 12002 29889

O status win32 12002 é equivalente ao erro ERROR_WINHTTP_TIMEOUT mencionado na página de erro.

O que especificamente atingiu o tempo limite?

Você pode verificar esse tempo limite habilitando o Rastreamento de Solicitação com Falha no servidor IIS. O primeiro ponto que você pode ver, no log de rastreamento de solicitação com falha e é para onde a solicitação foi enviada no ARR_SERVER_ROUTED evento. O segundo ponto é o X-ARR-LOG-ID, que você pode usar para rastrear a solicitação no servidor de destino. Isso ajuda a rastrear o destino ou destino da solicitação 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

O exemplo a seguir mostra como isso pode parecer nos logs de Rastreamento de Solicitação com Falha do servidor de destino. Você pode validar se encontrou a solicitação correta correspondendo os valores "X-ARR-LOG-ID" em ambos os rastreamentos.

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

No exemplo anterior, você pode ver que o servidor ARR se desconectou antes que a resposta HTTP fosse enviada. O carimbo de data/hora para GENERAL_FLUSH_RESPONSE_END pode ser usado como uma referência para localizar a entrada correspondente nos logs do IIS no servidor de destino.

date time s-ip cs-method cs-uri-stem cs-uri-query porta s cs-nome de usuário status sc substatus sc sc-win32-status time-taken
2011-07-18 16:51:06 192.168.0.216 GET /Hora/ - 80 - 200 0 64 45208

O IIS no servidor de destino registrou um código de status HTTP 200, indicando que a solicitação foi concluída com êxito. Além disso, o status do win32 foi alterado para 64, que mapeia para ERROR_NETNAME_DELETED. Esse código de status geralmente indica que o cliente (ARR sendo o 'cliente' neste caso) se desconectou antes da conclusão da solicitação.

Causa

O servidor ARR relatou um tempo limite, que é onde você deve procurar primeiro.

Embora o log do servidor membro indique que a resposta foi enviada em 45 segundos (45208 ms), a entrada de log do IIS do servidor ARR indica que o tempo gasto é muito próximo de 30 segundos. Isso indica que o ARR está atingindo o tempo limite da solicitação e você pode confirmar isso observando o tempo limite do proxy nas configurações de proxy do farm de servidores. Por padrão, é definido como 30 segundos.

Portanto, nesse caso, você pode ver claramente que o tempo limite do ARR foi menor do que a execução da solicitação. Portanto, talvez você queira verificar se esse tempo de execução era típico ou se precisava verificar por que a solicitação estava demorando mais do que o esperado. Se esse tempo de execução for esperado e normal, aumentar o tempo limite do ARR deve resolver o erro.

Outras possíveis causas para ERROR_WINHTTP_TIMEOUT incluem:

  • ResolveTimeout: ocorre se a resolução de nomes demorar mais do que o período de tempo limite especificado.
  • ConnectTimeout: Ocorre se demorar mais do que o período de tempo limite especificado para se conectar ao servidor após a resolução do nome.
  • SendTimeout: Ocorre se o envio de uma solicitação demorar mais do que esse valor de tempo limite. A operação de envio é cancelada.
  • ReceiveTimeout: Ocorre se uma resposta demorar mais do que esse valor de tempo limite. A solicitação é cancelada.

Quando você observa os dois primeiros motivos, ResolveTimeout e ConnectTimeout, a metodologia de solução de problemas descrita anteriormente não funcionaria. Isso ocorre porque você não veria nenhum tráfego no servidor de destino e, portanto, não saberia o código de erro. Portanto, nesse caso de ResolveTimeout ou ConnectTimeout talvez você queira capturar um rastreamento WinHTTP para obter informações adicionais. Consulte a seção de rastreamento WinHTTP ou WEBIO e nos blogs a seguir para obter outros exemplos de solução de problemas e rastreamento:

502.3 Erros de encerramento de conexão

Os erros 502.3 também ocorrem quando a conexão entre o ARR e o servidor associado é interrompida durante a transmissão de dados. Para testar esse tipo de problema, crie uma página .aspx que chame Response.Close(). No exemplo a seguir, há um diretório chamado "time", que é configurado com uma página .aspx como o documento padrão nesse diretório. Quando você tenta navegar até o diretório, o ARR mostra a seguinte mensagem de erro:

Captura de tela que mostra erros de encerramento de conexão.

O erro 0x80072efe corresponde a ERROR_INTERNET_CONNECTION_ABORTED. A solicitação pode ser rastreada até o servidor que realmente a processou usando as mesmas etapas usadas anteriormente nesta solução de problemas, com uma exceção. Embora o Rastreamento de Solicitação com Falha no servidor de destino mostre a solicitação processada no servidor, a entrada de log associada não aparece nos logs do IIS. Em vez disso, essa solicitação é registrada no log HTTPERR da seguinte maneira:

HTTP/1.1 GET /time/ - 1 Connection_Dropped DefaultAppPool

Os logs internos no servidor de destino não fornecem informações adicionais sobre o problema, portanto, a próxima etapa seria coletar um rastreamento de rede do servidor ARR. No exemplo anterior, a página .aspx chamada Response.Close() sem retornar nenhum dado. Exibir isso em um rastreamento de rede mostraria que um Connection: close cabeçalho HTTP estava vindo do servidor de destino. Com essas informações, você pode iniciar uma investigação sobre por que o Connection: close cabeçalho foi enviado.

O erro a seguir é outro exemplo de uma resposta inválida do servidor membro:

Captura de tela que mostra uma resposta inválida do servidor membro.

Neste exemplo, a ARR começou a receber dados do cliente, mas ocorreu um problema durante a leitura do corpo da entidade da solicitação. Isso resultou no retorno do código de erro 0x80072f78. Para investigar mais, use o Monitor de Rede no servidor membro para obter um rastreamento de rede do problema. Este exemplo de erro específico foi criado chamando Response.Close() a página ASP.net depois de enviar parte da resposta e, em seguida, Response.Flush()chamando . Se o tráfego entre o servidor ARR e os servidores membros estiver usando o protocolo SSL, o rastreamento WinHTTP no Windows Server 2008 ou o rastreamento WebIO no Windows Server 2008 R2 poderá fornecer mais informações. O rastreamento WebIO será explicado mais adiante neste guia de solução de problemas.

502.4 Não foi possível encontrar um servidor adequado para rotear a solicitação

O erro HTTP 502.4 com um código de erro associado de 0x00000000 geralmente indica que todos os membros do farm estão offline ou inacessíveis.

Captura de tela que mostra uma mensagem de nenhum servidor apropriado foi encontrado para rotear a solicitação.

A primeira etapa é verificar se os servidores membros estão online. Para verificar isso, vá para o nó Servidores no farm no Gerenciador do IIS.

Captura de tela que mostra como navegar até o nó Servidores no farm de servidores no Gerenciador do IIS.

Para trazer de volta os servidores offline, clique com o botão direito do mouse no nome do servidor e selecione Adicionar ao balanceamento de carga. Se você não conseguir colocar os servidores online novamente, verifique se os servidores membros podem ser acessados pelo servidor ARR. Verifique o painel Mensagens de rastreamento na página Servidores para procurar algumas pistas sobre o problema. Se você estiver usando o WFF (Web Farm Framework) 2.0, poderá receber esse erro quando o pool de aplicativos for reiniciado. Você precisa reiniciar o serviço Web Farm para recuperar.

Rastreamento WinHTTP ou WebIO

Normalmente, ferramentas de captura de pacotes como o WireShark fornecem as informações necessárias para identificar exatamente o que está expirando. No entanto, há momentos (como quando o tráfego é criptografado por SSL) em que você precisará tentar uma abordagem diferente. A partir do Windows 7 e do Windows Server 2008 R2, você pode habilitar o rastreamento WinHTTP usando a ferramenta netsh executando o seguinte comando em um prompt de comando administrativo:

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

Em seguida, reproduza o problema. Depois que o problema for reproduzido, interrompa o rastreamento executando o seguinte comando:

netsh trace stop

O stop comando leva alguns segundos para ser concluído. Quando terminar, você encontrará um arquivo net.etl e um arquivo net.cab em C:\temp. Você precisará garantir que a pasta exista C:\temp antes de executar os comandos acima. O arquivo .cab contém logs de eventos e outros dados que podem ser úteis na análise do arquivo .etl.

Para analisar o log,

  1. Abra-o no Netmon 3.4 ou posterior.

  2. Certifique-se de ter configurado seu perfil de analisador. Para fazer isso, abra o menu Opções de Ferramentas>, selecione a guia> Perfis do Analisador perfil do Windows e, em seguida, selecione o botão Definir como Ativo para aplicar as alterações.

  3. Percorra o rastreamento até encontrar a instância w3wp.exe em que o ARR está sendo executado, correlacionando-se com a coluna de nome do processo UT.

  4. Clique com o botão direito do mouse em w3wp e selecione Adicionar nome do processo UT para exibir o filtro. Isso define o filtro de exibição semelhante a:

    UTProcessName == "w3wp.exe (1432)"
    

Você pode filtrar ainda mais os resultados alterando-os para o seguinte:

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

Você precisará rolar pela saída até encontrar o erro de tempo limite. No exemplo a seguir, uma solicitação atingiu o tempo limite porque levou mais de 30 segundos (tempo limite padrão do ARR) para ser executada.

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) 

No exemplo a seguir, o servidor de conteúdo estava completamente 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} 

Outros recursos

Aviso de isenção de responsabilidade para informações de terceiros

Os produtos de terceiros mencionados neste artigo são produzidos por empresas independentes da Microsoft. A Microsoft não oferece nenhuma garantia, implícita ou não, do desempenho ou da confiabilidade desses produtos.