Mantenere attiva la connessione SSL tra proxy inverso e server backend

Aug 19 2020

Ho un server back-end (Apache) che è troppo lontano dalla maggior parte dei nostri utenti, quindi la nostra idea è di implementare un proxy inverso più vicino che funga da cache.

A prima vista ha funzionato come un fascino. I file statici memorizzati nella cache vengono serviti in modo estremamente veloce, ma per qualsiasi altra cosa, il proxy inverso (NGINX) deve connettersi al server back-end, che richiede un po 'di tempo per l'handshaking SSL, rendendo lente queste prime richieste.

Stavo cercando informazioni su questo ma non sono riuscito a trovare un modo per mantenere questa connessione. C'è un modo per farlo?

Ho anche provato a saperne di più sui websocket, ma tutte le implementazioni che ho trovato erano per rispondere a una richiesta specifica, non per mantenere la connessione che fa da intermediario ai due web server (NGINX al proxy inverso e Apache al back-end).

Qualcuno di voi ha qualche idea o suggerimento su cosa studiare / usare / cercare per ottenere ciò?

Grazie mille in anticipo!

Risposte

MichaelHampton Aug 19 2020 at 07:54

In nginx è possibile specificare solo keepaliveper una connessione a monte se la connessione è definita in un upstreamblocco. Per esempio:

upstream backend {
    server private-api.example.com:443;

    keepalive 32;
}

Qui, keepalivespecifica il numero massimo di connessioni aperte simultanee ai server upstream per processo di lavoro .

Per utilizzare l'upstream, specificane il nome nel tuo indirizzo proxy_passinvece che nel backend.

Ad esempio, se in precedenza hai utilizzato:

     proxy_pass https://private-api.example.com:443;

Lo cambierai in:

     proxy_pass https://backend;

Sostituisci letteralmente il nome dell'upstream per il definito server.

È inoltre necessario impostare la versione HTTP su 1.1 (perché è piuttosto assurdamente predefinito su 1.0) e cancellare l'intestazione Connection:

    proxy_http_version 1.1;
    proxy_set_header Connection "";

Tieni presente che c'è anche un keepalive_timeoutche puoi definire in upstreamcui potresti dover sintonizzare. Per impostazione predefinita è di 60 secondi, quindi se una connessione è inattiva per così tanto tempo verrà chiusa, anche se sono presenti meno keepaliveconnessioni aperte. Il server di backend avrà il proprio timeout keepalive che dovresti anche regolare separatamente.