Distribuzione senza soluzione di continuità in ASP.NET (IIS Kills Process worker prima che il processo di nuovi lavoratori sia pronto)

StackOverflow https://stackoverflow.com/questions/5358020

Domanda

Sto cercando di distribuire un'applicazione Web .NET su IIS (7.5) senza problemi per gli utenti. L'ho assicurato Disabilita il riciclo sovrapposto è falso Ma ho ancora lo stesso problema ogni volta.

Ogni volta che carico nuovi binari per il sito, IIS uccide il processo del lavoratore prima che ne abbia avviato uno nuovo. Quindi ogni volta che carico nuovi utenti binari ricevono questo messaggio di errore:

Errore del server nell'applicazione '/' Impossibile caricare file o assemblaggio "myapplicationWeb" o una delle sue dipendenze. Il processo non può accedere al file perché viene utilizzato da un altro processo. (Eccezione da HResult: 0x80070020)

Non ho idea di come farlo senza soluzione di continuità. Come è ora carico il binario; Ma mentre il caricamento si verifica (o copia locale), darà il comportamento sopra citato. Ho anche provato a usare un giardino web ma con lo stesso risultato.

Quello che non sto cercando:

  • Come risolverlo con bilanciatori di carico esterni (è una soluzione funzionale ma è una soluzione per performance per pochi server e non funzionerà affatto se c'è un solo server)
  • Come creare un hack-around con un aggiornamento in una pagina di errore personalizzata (in quanto ha alcuni ovvi problemi, ma soprattutto non funzionerà affatto con i servizi Web/AJAX).

Penso davvero che questo dovrebbe essere fattibile http://www.microsoft.com/technet/prodtechnol/windowserver2003/library/iis/24e3c22e-79a9-4f07-a407-dbd0e7f35432.mspx?mfr=true

Aggiornamento: nell'articolo sopra dicono:

Tuttavia, poiché il valore di timeout di spegnimento di un arresto o di un avvio è configurabile, il processo del lavoratore può essere terminato mentre sta ancora servendo richieste se non finisce di soddisfare le richieste esistenti entro il limite di tempo.

Non ho idea di dove trovare questo valore né cosa sia predefinito. Se è inferiore a qualche secondo potrebbe spiegare i miei risultati.

ps. Lo sto pubblicando quindi piuttosto che su SF/webmaster ecc. Perché penso che questo tipo di conoscenza sarà probabilmente minimo tra le persone che non sono attive nello sviluppo, spero che vada bene.

È stato utile?

Soluzione

Durante la distribuzione di applicazioni ASP.NET creo una nuova cartella sul server e cambio la directory home del sito Web all'interno di IIS. Ciò fornisce una distribuzione di tempi di inattività zero e una posizione di rollback rapida in caso di problemi imprevisti. In un futuro aggiornamento, scarto la vecchia versione e ripeto il processo in modo che ci sia sempre una singola posizione di rollback.

Aggiornamento - limite di tempo di spegnimento

I dettagli che configurano il limite di tempo di spegnimento per i lavoratori sono dettagliati a http://www.iis.net/configreference/system.applicationhost/applicationpools/add/processmodel. L'impostazione predefinita è di 1 min 30 secondi. Cerca la sezione ShutdownMeLimit nella pagina collegata.

Aggiornamento: ulteriori informazioni

Domanda simile con una grande risposta

L'essenza di ciò è che a causa del sovrascrivere i file esistenti Il meccanismo di copia prende un blocco esclusivo sui file e che non è possibile avere una distribuzione apparente senza l'uso di app_offline.htm o un meccanismo come suggerito sopra. Leggi la risposta collegata mentre approfondisce molto più.

Altri suggerimenti

Sono d'accordo con la risposta di Smirkin: aggiornare una seconda cartella e cambiare la directory home IIS per indicare l'altra cartella. Un altro vantaggio è che hai un percorso di rollback facile (basta cambiare la directory home IIS).

Ho scritto un post con una sceneggiatura su come farlo usando PowerShell - spero che aiuti: http://davidduffett.net/post/4833657659/blue-green-deployment-to-iis-with-powershell

Dovresti essere in grado di utilizzare questo script direttamente dal tuo sistema di integrazione continua.

Mentre La risposta di Smirkin Fornisce un bel modo senza soluzione di continuità per un amministratore di distribuire un sito con pochi o nessun tempo di inattività e dovrebbe risolvere il tuo problema con assemblaggi/riferimenti mancanti, se si dispone di modifiche alla base del codice (cioè rimuovere le vecchie pagine, modifiche ai moduli, ecc. .), quindi l'utilizzo di questo metodo potrebbe ancora comportare un po 'di "seccatura" per tutti gli utenti che avviano un processo prima dello switch e completalo dopo lo switch (cioè, richiedono una pagina prima di passare, iniziare a riempirlo e quindi Invia la pagina dopo che sei passato alla nuova directory).

So che non vuoi che lo dica, ma senza un bilanciatore del carico con sessioni appiccicose abilitate, non sarai in grado di consentire alle persone di continuare a usare la vecchia versione del sito fino a quando non avranno finito durante la gestione di nuovi Sessioni sulla nuova versione: modificando la home directory dell'applicazione, IIS eseguirà un riepilogo dell'app e riavvia i processi. In questo modo è possibile impostare il vecchio server per continuare a servire le sue connessioni correnti, ma dire al carico di non inviare nuove connessioni ad esso.

C'è tuttavia un altro passo che puoi fare per aiutare a mitigare i problemi spesso visti intorno a questo:

Configurare il Machinekey essere un valore costante piuttosto che AutoGenerate - Ciò significa che quando i ricicli di AppPool utilizzerà la stessa chiave e quindi potrà decodificare i cookie di sessione, ViewState, ecc.

La mia ipotesi è che tu abbia uno scanner per virus o un altro tipo di processo di indicizzazione che blocca il file non appena lo copi là fuori.

potresti usare app_offline.htm

Questa soluzione non è senza soluzione di continuità, ma potresti usare un

<meta http-equiv="refresh" content="5" />

Nel file HTM, quindi il browser aggiorna automaticamente senza javascript.

Saluti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top