Cosa succede quando aggiorno una pagina su un sito web dal vivo?

3

Diciamo che sto usando Nginx come mio server web. So che Nginx gestisce il comando -s reload che ricarica la configurazione quando viene cambiata, ma aspetta che le richieste correnti finiscano prima che cicli i processi di lavoro per usare la nuova configurazione, quindi evviva, nessun tempo di inattività!

Ma per quanto riguarda la modifica dei file effettivi?

Per esempio, diciamo che ho un index.html e ho realizzato che c'è un errore di battitura nella mia pagina. Diciamo anche che è una pagina molto attiva (come StackOverflow, per esempio) e voglio correggere il mio errore di battitura.

Se devo solo modificare il file con un editor di testo o aggiornarlo con rsync o scp o qualcosa del genere, è possibile che una richiesta venga cancellata?

Ad esempio, supponiamo di essere in esecuzione su una macchina multicore e che la richiesta arrivi dal client attraverso Nginx per caricare index.html , e nello stesso tempo i dati cominciano a venire da me per aggiornare index.html .

C'è qualche tipo di circostanza in cui il cliente ottiene solo un file parzialmente finito? O un file che contiene vecchi dati presenti sul disco nella posizione di quel nuovo file?

O ci sono alcuni tipi di garanzia su ciò che non sta accadendo. Capisco che la probabilità che tali eventi effettivamente stiano accadendo è piuttosto ridotta, ma qual è il metodo più semplice che garantisce sia l'uptime che l'accesso solo ai file corretti?

    
posta Wayne Werner 17.10.2016 - 04:11
fonte

1 risposta

3

If I just go edit the file with a text editor, or update it with rsync or scp or something, is it possible for a request to get fouled up?

Per gli editor di testo (almeno tutti quelli comuni), rsync o scp , non è possibile. Qualsiasi programmatore esperto a metà avrebbe guardato da questo.

Per "o qualcosa", dipende dal fatto che "qualcosa" sia stato scritto da un programmatore esperto a metà.

Normalmente, i programmi che possono essere utilizzati per aggiornare i file live, sono scritti in modo tale da rendere tali aggiornamenti atomicamente. Su quasi tutti i filesystem su quasi tutti gli Unix in uso oggi, rename di un file è atomico, quindi gli editor di testo saranno prima write in un file di "scambio" temporaneo e quindi atomicamente rename il file di swap per effettivo nome del file.

Tuttavia, in quest'ultimo caso, tutti i programmi che hanno già aperto il file avranno ancora il vecchio file (ora cancellato) aperto. Dovranno chiudere e riaprire il file. Ma un server web probabilmente non manterrà mai un file aperto dopo averlo inviato. L'unico file che manterrà aperto è il file di registro, per la scrittura continua. (Ecco perché è necessario riavviare il server Web quando si utilizza una sorta di rotazione dei registri, poiché in caso contrario, anche dopo aver ruotato il vecchio file di registro e averne creato uno nuovo, il descrittore di file aperto del server Web rimane quello del vecchio file. anche perché i server di lunga durata con funzionalità di registrazione utilizzano di solito intrappolare il segnale HUP e interpretarlo come una richiesta per chiudere e riaprire il file di registro, proprio in modo da non doverli riavviare (e rischiare un breve periodo di sospensione del servizio).)

    
risposta data 17.10.2016 - 10:26
fonte

Leggi altre domande sui tag