Soluzione per errori 503 “Service temporarily unavailable” su Apache

Un nostro cliente aveva un problema con Apache: al riavvio della loro web application (che gira su un application server separato), Apache sembrava “addormentarsi” per circa un minuto, restituendo una pagina d’errore 503 “Service temporarily unavailable”.
Controllando i log, abbiamo trovato la causa del problema:

[Thu Oct 11 09:35:18 2012] [error] (111)Connection refused: proxy: HTTP: attempt to connect to 192.168.0.10:48880 (192.168.0.10) failed
[Thu Oct 11 09:35:18 2012] [error] ap_proxy_connect_backend disabling worker for (192.168.0.10)
[Thu Oct 11 09:35:19 2012] [error] proxy: HTTP: disabled connection for (192.168.0.10)
[...]

Il modulo proxy di Apache, vedendo che il servizio era down, bloccava tutte le richieste per un minuto. Per risolvere è bastato aggiungere l’opzione retry=0 alla direttiva ProxyPass nel file di configurazione:

ProxyPass / http://192.168.0.10:48880/ retry=0 timeout=5
ProxyPassReverse / http://192.168.0.10:48880/

Per maggiori informazioni si faccia riferimento alla documentazione di Apache.

Backup incrementali su un server RSYNC centralizzato

Una delle soluzioni più storicamente affidabili per effettuare backup incrementali in una Intranet è costituita dall’utilizzo di server RSYNC, sia su piattaforma Linux che Windows. In questa script d’esempio si presuppone di avere un server RSYNC già funzionante, protetto da password di accesso, verso il quale effettuare un backup incrementale settimanale.

Per prima cosa si definirà la directory di cui effettuare il backup, ad esempio la home dell’utente:

SRC_DIR=/home/$USER

Successivamente si specificherà il file che conterrà eventuali file o directory da escludere (anche mediante wildcard), il nome del server centrale di backup e quindi la relativa password di accesso, in questo modo:

EXCLUDES=/path/to/exclude_file
BACKUP_SERVER=server_name
export RSYNC_PASSWORD=server_password

A questo punto si sceglieranno i nomi delle directory di destinazione (è da notare come il comando date in combinazione con il flag A restituirà il nome del giorno della settimana per esteso) e le opzioni di backup come illustrato di seguito:

DST_DIR=`date +%A`
OPTS="--force --ignore-errors --delete-excluded --exclude-from=$EXCLUDES --delete --backup --backup-dir=/$DST_DIR -a"

Prima di inviare il comando di backup vero e proprio, un’ulteriore serie di comandi verrà utilizzata per ripulire i backup incrementali relativi al giorno corrente della settimana precedente (se esistente) in questo modo:

mkdir $HOME/empty_dir
rsync --delete -a $HOME/empty_dir/ $BACKUP_SERVER::$USER/$DST_DIR/
rmdir $HOME/empty_dir

In pratica verrà creata localmente (e quindi alla fine rimossa) una directory vuota sulla base della quale il contenuto del giorno corrente verrà aggiornato (di conseguenza, essendo la directory vuota ed utilizzando il flag –delete, ciò significa che a tutti gli effetti la directory di destinazione verrà ripulita).

Finalmente siamo pronti ad avviare il backup con il comando rsync come specificato di seguito:

rsync $OPTS $SRC_DIR $BACKUP_SERVER::$USER/current

Al termine dell’esecuzione (e della settimana) si avrà, nel server centralizzato di backup, rispettivamente per ogni utente, una directory denominata current/ che conterrà il backup completo, mentre una directory per ogni giorno della settimana conterrà il relativo backup incrementale.