2011-12-16 10 views
6

come facciamo le cose oraAlla ricerca di un modo sicuro per distribuire codice PHP

Abbiamo un file server (tramite NFS) che multipla web server montare e utilizzare questi supporti come la radice web. Quando distribuiamo il nostro codebase, SCP archivia un archivio (tar.gz) nel server NFS e disarchivia i dati direttamente nella "directory web" del file server.

La questione

Durante il processo di implementazione che stiamo vedendo alcuni errori di I/O, per lo più quando un file richiesto non può essere letto: Smarty error: unable to read resource: "header.tpl" Questi errori sembrano andare via dopo il Deploy è finito, così abbiamo assumere è perché l'archiviazione dei dati direttamente nella directory web non è la cosa più sicura. Immagino che abbiamo bisogno di qualcosa di atomico.

La mia domanda

Come possiamo atomicamente copiare i nuovi file in una directory esistente (directory principale del server web)?

EDIT

I file che ci sono compromessi nella directory web non sono gli unici file che si trovano nella directory. Stiamo aggiungendo file alla directory, che ha già file. Quindi copiare la directory o usare un link simbolico non è un'opzione (che io sappia).

+1

Rename è atomica (mv), forse anche del suo meglio per utilizzare soft link e la directory web attuale è solo un link a /storage/www.revision.3282378 per esempio – jackdoe

risposta

1

Ecco cosa faccio.

DocumentRoot è, ad esempio, /var/www/sites/www.example.com/public_html/:

cd /var/www/sites/www.example.com/ 
svn export http://svn/path/to/tags/1.2.3 1.2.3 
ln -snf 1.2.3 public_html 

Si potrebbe facilmente modificare questo per espandere la vostra .tar.gz prima di cambiare il link simbolico invece di esportare da svn. La parte importante è che il cambiamento è l'applicazione atomica del collegamento simbolico.

0

Perché non hai solo 2 dir con 2 diverse versioni del sito. Quindi, quando hai terminato la distribuzione in site_2 hai appena cambiato la directory del sito nella configurazione del tuo server web (ad esempio apache) e copia tutti i file nella directory site_1. Quindi puoi distribuire nella directory site_1 e passare da esso a site_2 con lo stesso metodo.

+0

Immagino che qualcosa come menzionato qui sia il modo più veloce. Copia le tue nuove cose in una cartella temporanea, quindi rinomina l'originale e la nuova cartella/temp in seguito (che non richiederà molto tempo). – djot

+0

Vedere la mia modifica - Abbiamo altri file nella radice Web che devono rimanere (sito di marketing) e molto (> 40 GB di contenuto generato dall'utente), non voglio duplicarlo sempre ... – mmattax

0

RSync è nato per correre ... ehm ... intendo fare questo molto cosa

RSync funziona su file system e ssh locali - è molto robusto e veloce - solo invio/copia file modificati.

Può essere configurato per eliminare tutti i file che sono stati cancellati (o che semplicemente mancano dall'origine), oppure può essere configurato per lasciarli soli. È possibile impostare elenchi di esclusione per escludere determinati file/directory durante la sincronizzazione.

Ecco uno link to a tutorial.

Re: atomico - link to another question on SO

+0

per quello che vale , Ho usato questo su più siti Web per distribuire il codice per gli ultimi 2 anni senza errori (registro ed errori di posta elettronica) - nessun avviso/errore di file mancanti - solo semplici, comandi singoli, distribuzioni script da riga di comando. –

+0

Questa sembra una buona opzione, qualche esempio di esecuzione come "one off" su una directory locale, o rsync deve sempre essere eseguito come un demone? – mmattax

+0

Eseguo rsync localmente sempre come parte di uno script che configura progetti di codice google. Sono abbastanza sicuro di non aver mai configurato rsyncd - Sono su un mac. –

0

mi piace l'idea di NFS. Distribuiamo il nostro codice sul server NFS che è mout sui nostri frontend. In effetti, eseguiamo uno script di shell quando vogliamo rilasciare una nuova versione.Quello che facciamo è utilizzare una corrente link simbolico all'ultima dir rilascio, in questo modo:

/fasmounts/website/current -> /fasmounts/website/releases/2013120301/ 

e Apache documento radice è:

/fasmounts/website/current/public 

(in realtà document root apache è/var/www che è un collegamento simbolico a/fasmounts/sito web/corrente/pubblico)

Lo script di shell aggiorna il collegamento simbolico corrente alla nuova versione DOPO che tutto è stato caricato correttamente.

1

Penso che rsync sia una scelta migliore invece di scp, solo i file modificati verrebbero sincronizzati. ma la distribuzione del codice per script non è conveniente per lo sviluppo in una squadra e gli errori nella distribuzione non sono umanizzati.

si può pensare a Capistrano, Magallanes, Deployer, ma sono anche una sceneggiatura. Posso consigliarti di provare walle-web, uno strumento di distribuzione scritto in PHP con yii2 out of the box. L'ho ospitato per mesi nella nostra azienda, funziona senza problemi durante l'implementazione di test, simulazione, ambiente di produzione.

esso dipenderà da gruppi di strumenti Bash, rsync, git, collegamento, ma un'interfaccia utente web generalmente ben per il funzionamento, avere una prova :)

+0

Benvenuti in Stack Overflow! Ho notato che tutte e cinque le tue risposte finora su questo sito (compresi i due che sono stati recentemente rimossi) promuovono lo stesso strumento, walle-web. Per favore prenditi un momento per leggere le nostre [linee guida sull'autopromozione] (http://meta.stackexchange.com/a/59302/253560). È importante sottolineare che, se si è affiliati con questo strumento, è necessario rivelarlo in ogni risposta. Inoltre, non dovresti promuovere il tuo strumento in tutte le tue risposte su questo sito. – josliber

Problemi correlati