Ospitare ASP.NET Core in una Web farm

Di Chris Ross

Una Web farm è un gruppo di due o più server Web (o nodi) che ospita più istanze di un'app. Quando arrivano richieste dagli utenti per una Web farm, un servizio di bilanciamento del carico distribuisce le richieste ai nodi della Web farm. Le Web farm consentono di migliorare:

  • Affidabilità/disponibilità: quando uno o più nodi hanno esito negativo, il servizio di bilanciamento del carico può instradare le richieste ad altri nodi funzionanti per continuare l'elaborazione delle richieste.
  • Capacità/prestazioni: più nodi possono elaborare più richieste rispetto a un singolo server. Il servizio di bilanciamento del carico consente di bilanciare il carico di lavoro distribuendo le richieste ai nodi.
  • Scalabilità: quando è necessaria una capacità maggiore o minore, il numero di nodi attivi può essere aumentato o ridotto in base al carico di lavoro. Le tecnologie della piattaforma per le Web farm, ad esempio Servizio app di Azure, possono aggiungere o rimuovere automaticamente nodi su richiesta dell'amministratore di sistema o automaticamente senza intervento umano.
  • Manutenibilità: i nodi di una Web farm possono basarsi su un set di servizi condivisi, che comporta una gestione più semplice del sistema. Ad esempio, i nodi di una Web farm possono basarsi su un singolo server di database e un percorso di rete comune per le risorse statiche, ad esempio immagini e file scaricabili.

Questo argomento descrive la configurazione e le dipendenze per le app ASP.NET Core ospitate in una Web farm che si basano su risorse condivise.

Configurazione generale

Ospitare e distribuire ASP.NET Core
Informazioni sulla configurazione degli ambienti host e sulla distribuzione delle app ASP.NET Core. Configurare un gestore di processi in ogni nodo della Web farm per automatizzare avvii e riavvii dell'app. Ogni nodo richiede il runtime di ASP.NET Core. Per altre informazioni, vedere gli argomenti nell'area Ospitare e distribuire della documentazione.

Configurare ASP.NET Core per l'utilizzo di server proxy e servizi di bilanciamento del carico
Informazioni sulla configurazione per le app ospitate dietro server proxy e servizi di bilanciamento del carico, che spesso nascondono informazioni importanti sulle richieste.

Distribuire le app ASP.NET Core in Servizio app di Azure
Il servizio app di Azure è un servizio di piattaforma di cloud computing Microsoft per l'hosting di app Web, inclusa ASP.NET Core. Servizio app è una piattaforma completamente gestita che offre scalabilità automatica, bilanciamento del carico, applicazione di patch e distribuzione continua.

Dati dell'app

Quando un'app viene distribuita su più istanze, potrebbe essere necessario condividere informazioni sullo stato dell'app tra i nodi. Se lo stato è temporaneo, prendere in considerazione la condivisione di un oggetto IDistributedCache. Se lo stato condiviso deve essere persistente, valutare la possibilità di archiviare lo stato condiviso in un database.

Configurazione richiesta

Occorre configurare la protezione dei dati e la memorizzazione nella cache per le app distribuite in una Web farm.

Protezione dei dati

Il sistema di protezione dei dati di ASP.NET Core viene usato dalle app per proteggere i dati. La protezione dei dati si basa su un set di chiavi di crittografia archiviate in un KeyRing. Quando il sistema di protezione dei dati viene inizializzato, vengono applicate le impostazioni predefinite che archiviano il KeyRing in locale. In base alla configurazione predefinita, viene archiviato un unico KeyRing in ogni nodo della Web farm. Di conseguenza, ogni nodo della Web farm non può decrittografare i dati crittografati da un'app su qualsiasi altro nodo. La configurazione predefinita non è in genere adatta per l'hosting di app in una Web farm. In alternativa all'implementazione di un KeyRing condiviso, è sempre possibile indirizzare le richieste utente allo stesso nodo. Per altre informazioni sulla configurazione del sistema di protezione dei dati per le distribuzioni di Web farm, vedere Configurare ASP.NET Protezione dati di base.

Memorizzazione nella cache

In un ambiente Web farm, il meccanismo di memorizzazione nella cache deve condividere gli elementi memorizzati nella cache tra i nodi della Web farm. La memorizzazione nella cache deve basarsi su una cache Redis comune, un database di SQL Server condiviso o un'implementazione personalizzata di memorizzazione nella cache che condivide gli elementi memorizzati nella cache nella Web farm. Per altre informazioni, vedere Memorizzazione nella cache distribuita in ASP.NET Core.

Componenti dipendenti

Gli scenari seguenti non richiedono configurazioni aggiuntive, ma dipendono da tecnologie che devono essere configurate per le Web farm.

Scenario Dipende da
Authentication Protezione dei dati (vedere Configurare ASP.NET Protezione dati di base).

Per altre informazioni, vedere Usare cookie l'autenticazione senza ASP.NET Core Identity e Condividere l'autenticazione cookietra ASP.NET app.
Identity Configurazione di autenticazione e database.

Per altre informazioni, vedere Introduzione a Identity in ASP.NET Core.
Sessione Protezione dei dati (crittografaticookie) (vedere Configurare ASP.NET Core Data Protection) e memorizzazione nella cache (vedere Memorizzazione nella cache distribuita in ASP.NET Core).

Per altre informazioni, vedere Gestione delle sessioni e dello stato: Stato sessione.
TempData Protezione dei dati (crittografati cookie) (vedere Configurare ASP.NET Protezione dati di base) o Sessione (vedere Sessione e gestione dello stato: stato sessione).

Per altre informazioni, vedere Gestione delle sessioni e dello stato: TempData.
Antifalsificazione Protezione dei dati (vedere Configurare ASP.NET Protezione dati di base).

Per altre informazioni, vedere Prevenire attacchi tramite richieste intersito false (XSRF/CSRF) in ASP.NET Core.

Risoluzione dei problemi

Protezione dei dati e memorizzazione nella cache

Quando la protezione dei dati o la memorizzazione nella cache non è configurata per un ambiente Web farm, si verificano errori intermittenti durante l'elaborazione delle richieste. Ciò si verifica perché i nodi non condividono le stesse risorse e le richieste degli utenti non vengono sempre indirizzate allo stesso nodo.

Si consideri un utente che accede all'app usando cookie l'autenticazione. L'utente acceda all'app in un nodo della Web farm. Se la richiesta successiva arriva allo stesso nodo in cui ha eseguito l'accesso, l'app è in grado di decrittografare l'autenticazione cookie e consente l'accesso alla risorsa dell'app. Se la richiesta successiva arriva a un nodo diverso, l'app non può decrittografare l'autenticazione cookie dal nodo in cui l'utente ha eseguito l'accesso e l'autorizzazione per la risorsa richiesta ha esito negativo.

Quando si verifica uno dei sintomi seguenti in modo intermittente, il problema è in genere da ricondurre a una configurazione non corretta della protezione dei dati o della memorizzazione nella cache per un ambiente Web farm:

  • Interruzioni di autenticazione: l'autenticazione cookie non è configurata correttamente o non può essere decrittografata. Gli accessi OAuth (Facebook, Microsoft, Twitter) o OpenIdConnect non riescono con l'errore "Correlazione non riuscita."
  • Interruzioni di autorizzazione: Identity viene persa.
  • Perdita dei dati per lo stato della sessione.
  • Gli elementi memorizzati nella cache scompaiono.
  • Errore di TempData.
  • I POST hanno esito negativo: il controllo antifalsificazione ha esito negativo.

Per altre informazioni sulla configurazione della protezione dei dati per le distribuzioni di Web farm, vedere Configurare ASP.NET Protezione dati di base. Per altre informazioni sulla configurazione della memorizzazione nella cache per le distribuzioni di web farm, vedere Memorizzazione nella cache distribuita in ASP.NET Core.

Ottenere dati dalle app

Se le app della Web farm sono in grado di rispondere alle richieste, è possibile ottenere dati sulle richieste, le connessioni e altri dati dalle app tramite middleware inline di terminale. Per altre informazioni e codice di esempio, vedere Risolvere i problemi ed eseguire il debug di progetti di base ASP.NET.

Risorse aggiuntive