Servizio 503 non disponibile - Creazione del tunnel proxy non riuscita con 403

Stai visualizzando la documentazione di Apigee Edge.
Vai alla documentazione di Apigee X.
informazioni

Sintomo

L'applicazione client riceve un codice di stato HTTP 503 Service Unavailable con il codice di errore protocol.http.ProxyTunnelCreationFailed come risposta per le chiamate API.

Messaggio di errore

L'applicazione client riceve il seguente codice di risposta:

HTTP/1.1 503 Service Unavailable

Inoltre, potresti visualizzare il seguente messaggio di errore:

{
   "fault":{
      "faultstring":"Proxy refused to create tunnel with response status 403",
      "detail":{
         "errorcode":"protocol.http.ProxyTunnelCreationFailed"
      }
   }
}

Proxy di forwarding e tunnelling

Apigee Edge consente ai proxy API di comunicare con il server di backend attraverso un server proxy, come spiegato in Configurare il proxy di forwarding. Il server proxy apre una connessione sicura (HTTPS) o non sicura (HTTP) al server di backend a seconda del tipo di proxy (indicato dalla proprietà HTTPClient.proxy.type) utilizzato e trasferisce i dati in entrambe le direzioni. Questo sistema è noto come tunneling.

Per impostazione predefinita, Apigee Edge utilizza il tunneling per tutto il traffico. Per disabilitare il tunneling, la proprietà HTTPClient.use.tunneling deve essere impostata su false.

Codice di errore: Protocol.http.ProxyTunnelCreationFailed

Apigee Edge restituisce il codice di errore protocol.http.ProxyTunnelCreationFailed se il server proxy non è in grado di creare un tunnel tra Apigee Edge e il server di backend a causa di problemi quali firewall, limitazioni dell'elenco di controllo di accesso (ACL), problemi DNS, mancata disponibilità del server di backend, timeout e così via.

Il codice di stato in faultstring della risposta da Apigee Edge in genere indica una possibile causa di alto livello che ha portato a questo errore.

Modello di stringa di errore:

Proxy refused to create tunnel with response status STATUS_CODE

Possibili cause per alcuni dei codici di stato osservati in faultstring:

La seguente tabella descrive le possibili cause in base al codice di stato indicato in faultstring:

Stringa di errore Descrizione
Il proxy ha rifiutato di creare il tunnel con stato di risposta 403

403 - Forbidden

Ciò può accadere probabilmente a causa di restrizioni del firewall o dell'ACL configurate sul server di backend che impediscono la creazione del tunnel.

Il proxy ha rifiutato di creare il tunnel con stato di risposta 503

503 - Service Unavailable

Ciò può accadere a causa di problemi DNS, limitazioni del firewall, indisponibilità del server di backend che impedisce la creazione del tunnel.

Il proxy ha rifiutato di creare il tunnel con stato di risposta 504

504 - Gateway Timeout

Questo può accadere in caso di timeout durante la creazione del tunnel.

A seconda del codice di stato osservato in faultstring, devi utilizzare tecniche appropriate per risolvere il problema. Questo playbook spiega come risolvere il problema se noti il codice di stato 403 nel campo faultstring per il codice di errore protocol.http.ProxyTunnelCreationFailed.

Possibili cause

Questo errore (codice di stato 403) si verifica se sul server di backend sono configurate restrizioni del firewall o dell'elenco di controllo di accesso (ACL) che impediscono la creazione del tunnel tra Apigee Edge e il server di backend da parte del server proxy.

Causa Descrizione Istruzioni per la risoluzione dei problemi applicabili a
Il proxy ha rifiutato di creare il tunnel con stato di risposta 403 Il server proxy si rifiuta di creare il tunnel poiché riceve il nome host del server proxy invece del nome host del server di backend nell'intestazione Host. Solo utenti Edge Private Cloud

Passaggi di diagnosi più comuni

Utilizza uno dei seguenti strumenti/tecniche per diagnosticare questo errore:

Strumento Traccia

Per diagnosticare l'errore utilizzando lo strumento Trace:

  1. Abilita la sessione di traccia e:
    • Attendi che si verifichi l'errore oppure
    • Se riesci a riprodurre il problema, esegui la chiamata API per riprodurre il problema 503 Service Unavailable con Proxy refused to create tunnel with response status 403.
  2. Assicurati che l'opzione Mostra tutte le FlowInfos sia abilitata:

  3. Seleziona una delle richieste non riuscite ed esamina la traccia.
  4. Naviga tra le diverse fasi della traccia e individua il punto in cui si è verificato l'errore.
  5. Di solito, l'errore viene visualizzato dopo la fase Inizio del flusso di richiesta target, come mostrato di seguito:

    Prendi nota delle seguenti informazioni:

    errore: Proxy refused to create tunnel with response status 403

  6. Vai alla fase AX (Analytics Data Recorded) della traccia e fai clic.
  7. Scorri verso il basso fino alla sezione Intestazioni della risposta Dettagli fase e determina i valori di X-Apigee-fault-code e X-Apigee-fault-source come mostrato di seguito:

    ( visualizza immagine ingrandita)

    ( visualizza immagine ingrandita)

  8. Vedrai i valori di X-Apigee-fault-code e X-Apigee-fault-source rispettivamente come protocol.http.ProxyTunnelCreationFailed e target , indicando rispettivamente che questo errore è dovuto al fatto che la creazione del tunnel proxy non è riuscita perché l'intestazione host prevista non è stata ricevuta.

    Intestazioni della risposta Valore
    X-Apigee-fault-code protocol.http.ProxyTunnelCreationFailed
    X-Apigee-fault-source target

NGINX

Per diagnosticare l'errore utilizzando i log degli accessi di NGINX:

  1. Se sei un utente Private Cloud, puoi utilizzare i log degli accessi di NGINX per determinare le informazioni chiave sugli errori HTTP 503 Service Unavailable.
  2. Controlla i log degli accessi di NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_log

    Dove: ORG, ORG e PORT# vengono sostituiti con i valori effettivi.

  3. Cerca per vedere se si sono verificati errori 503 con il codice di errore protocol.http.ProxyTunnelCreationFailed durante un periodo di tempo specifico (se il problema si è verificato in passato) o se ci sono ancora richieste che continuano a non funzionare con 503.
  4. Se riscontri eventuali 503 errori con X-Apigee-fault-code corrispondenti al valore di protocol.http.ProxyTunnelCreationFailed, determina il valore di X-Apigee-fault-source.

    Esempio di errore 503 dal log degli accessi di NGINX:

    La voce di esempio sopra riportata dal log degli accessi NGINX ha i seguenti valori per X- Apigee-fault-code e X-Apigee-fault-source:

    Intestazioni della risposta Valore
    X-Apigee-fault-code protocol.http.ProxyTunnelCreationFailed
    X-Apigee-fault-source target

Causa: il proxy ha rifiutato di creare il tunnel con stato di risposta 403

Diagnostica

  1. Determina il codice di errore e l'origine dell'errore per 503 Service Unavailable utilizzando lo strumento Trace o i log di accesso di NGINX, come spiegato nella sezione Passaggi comuni della diagnostica.
  2. Esamina il messaggio di errore e determina il codice di stato indicato in faultstring per l'errore durante la creazione del tunnel.
  3. In questo scenario, il codice di stato è 403, che significa Vietato.
  4. Ciò significa che non ci sono diritti o privilegi sufficienti per creare il tunnel. In genere questo problema si verifica in caso di limitazioni del firewall o dell'elenco di controllo di accesso (ACL, Access Control List) che impediscono la creazione del tunnel.
  5. Esamina eventuali restrizioni firewall e/o ACL configurate sul server di backend che possono impedire la creazione del tunnel.
  6. A seconda del tipo di firewall e/o di restrizioni ACL, devi risolvere il problema in modo appropriato.
  7. Facciamo un esempio di limitazione firewall per spiegare come risolvere questo problema:

    Scenario: una limitazione del firewall sul server di backend prevede che l'intestazione dell'host contenga sempre il nome host del server di backend

    Puoi utilizzare uno dei seguenti modi per determinare l'intestazione dell'host trasmessa da Apigee Edge:

    Traccia

    Per determinare l'intestazione dell'host utilizzando Trace:

    1. Verifica che faultstring contenga Proxy refused to create tunnel with response status 403 utilizzando la traccia come spiegato nella sezione Passaggi comuni della diagnostica.
    2. Vai alla fase Flusso di richieste target iniziato ed esamina le Intestazioni delle richieste.
    3. Verifica il valore del nome host specificato nell'intestazione Host nella sezione Intestazioni della richiesta.
    4. Se l'intestazione Host contiene il nome host proxy, è questa la causa dell'errore.
    5. Questo perché il firewall è configurato sul server di backend in modo da accettare le richieste solo se l'intestazione dell'host contiene il nome del server di backend.
    6. Di conseguenza, quando il server proxy tenta di creare il tunnel con il server di backend, l'errore restituisce un errore

      Proxy refused to create tunnel with response status 403.

      Traccia di esempio che mostra l'intestazione dell'host con il nome host del proxy

      ( visualizza immagine ingrandita)

      Nella traccia di esempio mostrata sopra, mostra che l'intestazione dell'host contiene il nome dell'host proxy www.proxyserver.com. Poiché sul server di backend è configurata una limitazione del firewall che prevede che solo il nome host del server di backend sia contenuto nell'intestazione dell'host, viene visualizzato l'errore Proxy refused to create tunnel with response status 403.

    tcpdump

    Per determinare l'intestazione host utilizzando tcpdump

    1. Acquisisci un tcpdump sul server proxy per le richieste provenienti dal componente Message Processor di Apigee Edge con il seguente comando:

      tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
      

      Per maggiori informazioni sull'utilizzo del comando tcpdump, consulta tcpdump.

    2. Analizza i dati di tcpdump usando lo strumento Wireshark o uno strumento simile.
    3. Ecco un esempio di analisi di tcpdump mediante Wireshark:

      ( visualizza immagine ingrandita)

    4. I numeri di pacchetto 13, 14 e 15 indicano che il processore di messaggi sta stabilendo una connessione al server proxy tramite un processo di handshake TCP a tre vie.
    5. Nel pacchetto 16, il processore di messaggi si è connesso all'host proxy httpbin.org (mostrato nell'esempio precedente).
    6. Seleziona il pacchetto 16 ed esaminane il contenuto in dettaglio e, in particolare, l'intestazione host trasmessa al server proxy dal processore di messaggi.

    7. L'esempio riportato sopra mostra l'intestazione dell'host httpin.org, che è il nome host del server proxy. Di conseguenza, quando il server proxy tenta di creare il tunnel con il server di backend passando l'intestazione host httpin.org riportata sopra, l'errore genera l'errore Proxy refused to create tunnel with response status 403.

Risoluzione

Scenario: una limitazione del firewall sul server proxy prevede che l'intestazione dell'host contenga sempre il nome host del server di backend

Se hai verificato che questo errore è causato dal fatto che il firewall sul server di backend è configurato in modo tale che l'intestazione dell'host contenga sempre il nome host del server backend, mentre il processore di messaggi invia il nome host del server proxy, esegui i passaggi seguenti per risolvere il problema:

  1. Imposta la proprietà use.proxy.host.header.with.target.uri su true in TargetEndpoint, come mostrato nell'esempio seguente:

    Esempio di configurazione di TargetEndpoint:

    <TargetEndpoint name="default">
      <HTTPTargetConnection>
        <URL>https://mocktarget.apigee.net/json</URL>
        <Properties>
          <Property name="use.proxy.host.header.with.target.uri">true</Property>
        </Properties>
      </HTTPTargetConnection>
    </TargetEndpoint>
    
  2. Assicurati che le altre proprietà relative al proxy di inoltro siano configurate sul processore di messaggi come segue:

    1. Esamina il file /opt/apigee/customer/application/message-processor.properties su ciascuno dei processori di messaggi.
    2. Assicurati che le seguenti proprietà siano impostate in base al tuo caso d'uso o ai tuoi requisiti:

      Valori di esempio per le proprietà:

      conf_http_HTTPClient.use.proxy=true
      conf/http.properties+HTTPClient.proxy.type=HTTP
      conf/http.properties+HTTPClient.proxy.host=PROXY_SERVER_HOST_NAME
      conf/http.properties+HTTPClient.proxy.port=PORT_#
      conf/http.properties+HTTPClient.proxy.user=USERNAME
      conf/http.properties+HTTPClient.proxy.password=PASSWORD
      

Devi raccogliere dati diagnostici

Se il problema persiste anche dopo aver seguito le istruzioni riportate sopra, raccogli le seguenti informazioni diagnostiche e contatta l'assistenza Apigee Edge:

Se sei un utente Private Cloud, fornisci le seguenti informazioni:

  • Messaggio di errore completo osservato per le richieste non riuscite
  • Nome ambiente
  • Bundle di proxy API
  • File di traccia per le richieste API
  • Log degli accessi NGINX

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Dove: ORG, ENV e PORT# vengono sostituiti con i valori effettivi.

  • Log di sistema del processore di messaggi

    /opt/apigee/var/log/edge-message-processor/logs/system.log
    

Riferimenti