Come ottimizzare le prestazioni delle VM Linux su Azure Uno script open source per configurare cache e directory temporanee di Nginx, PHP, .NET e WordPress sul disco effimero di Azure, ottenendo più velocità senza costi aggiuntivi.

How to Migrate SQL Server DB to Azure SQL Server DB
Fork me on GitHub

Se utilizzi una macchina virtuale su Microsoft Azure, saprai che la maggior parte di queste VM vengono fornite con un cosiddetto disco temporaneo (solitamente montato in /mnt/). Si tratta di uno storage velocissimo, basato su SSD o NVMe, con IOPS elevatissimi e latenze bassissime... ma con un limite importante: i suoi contenuti sono effimeri. Al riavvio, o in caso di deallocazione della VM, tutto quello che contiene viene perso.

Potrebbe sembrare un problema, ma in realtà è un’opportunità perfetta: quel disco è ideale per cache, file temporanei, sessioni PHP, directory di upload e altro ancora. In altre parole, tutto ciò che deve essere scritto e/o letto con la maggiore efficienza possibile e che, nel contempo, può essere eliminato senza problemi ad ogni reboot. È proprio partendo da questa importante premessa che ho deciso di realizzare azure-tempdisk-bootstrap.

Se ti interessa sfruttare al massimo il disco temporaneo di Azure, non perderti quest'altro post: Come gestire lo swapfile Linux su disco temporaneo Azure. È il complemento perfetto a questo articolo e spiega come configurare in modo affidabile uno swapfile su /mnt

Cos’è e a cosa serve

azure-tempdisk-bootstrap è uno script open source (con relativa unit di systemd) che ricrea in automatico, a ogni avvio della VM, le directory necessarie su /mnt, impostando i permessi corretti e assicurandosi che siano sempre pronte all’uso.

Ecco le cartelle che prepara:

  • /mnt/nginx/fastcgi/ – cache FastCGI di Nginx
  • /mnt/nginx/proxy/ – cache reverse proxy di Nginx
  • /mnt/nginx/temp/ – file temporanei Nginx
  • /mnt/php/sessions/ – file di sessione PHP
  • /mnt/php/uploads/ – directory temporanea per gli upload PHP
  • /mnt/dotnet/temp/ – directory temporanea per ASP.NET Core
  • /mnt/wordpress/ – cache ed esportazioni di WordPress

In questo modo non dovrai più creare manualmente queste directory a ogni riavvio, né rischiare che Nginx o PHP vadano in errore per mancanza di path.

Perché è importante

Spostare le cache e i file temporanei sul disco temporaneo di Azure significa sfruttare la memoria più veloce disponibile sulla VM, senza consumare il disco di sistema o i dischi gestiti.
Il risultato è:

  • Caricamenti più rapidi per le pagine servite da cache
  • Meno stress sul disco OS o dati (meno rischio di colli di bottiglia sugli IOPS)
  • Prestazioni migliori a costo zero

Ovviamente, il disco non è persistente: non va usato per database o log critici, ma per dati effimeri è perfetto.

Come scaricarlo e installarlo

Il progetto può essere scaricato  gratuitamente da GitHub. All’interno troverai lo script e i file di configurazione. Ecco i passi rapidi per installarlo:

Da questo momento in poi, a ogni reboot della VM le directory verranno ricreate in automatico, sempre pronte all’uso.

Nginx: configurazione manuale o semi-automatica

Hai due possibilità per configurare Nginx a usare il disco temporaneo:

Configurazione manuale (per ambienti complessi)

Se gestisci molti siti con esigenze diverse, ti conviene modificare direttamente i file server { }, definendo proxy_cache_path e fastcgi_cache_path
in base alle necessità di ciascun sito. Avrai così il massimo controllo.

Configurazione semi-automatica (più semplice)

Se invece ospiti pochi siti o vuoi un setup rapido, nel pacchetto troverai il file conf/nginx/azure-tempdisk-cache.conf. Basta copiarlo in /etc/nginx/conf.d/ e avrai subito cache e temp path su /mnt.

PHP e .NET

Per PHP ti basta modificare il php.ini così:

Per .NET, invece, basta impostare la variabile d’ambiente TMPDIR su /mnt/dotnet/temp all’interno della systemd unit.

Perché un servizio systemd invece di un semplice script all’avvio?

Una delle domande più frequenti è: perché abbiamo scelto di fornire un servizio systemd dedicato invece di aggiungere lo script di bootstrap a rc.local, cron @reboot o meccanismi simili?

La risposta riguarda principalmente affidabilità e tempistica:

  • Tempistica del mount
    Su Azure, il disco effimero (/mnt) viene montato dall’Azure Linux Agent (waagent) o da cloud-init dopo l’inizializzazione di base del sistema.
    Se lo script parte troppo presto, /mnt potrebbe essere ancora vuoto (o una semplice directory), e tutta la configurazione fallirebbe silenziosamente.
  • Gestione esplicita delle dipendenze
    Con systemd possiamo dichiarare RequiresMountsFor=/mnt e After=local-fs.target, assicurando che il servizio venga eseguito solo quando il disco effimero è correttamente montato e disponibile.
  • Idempotenza e sicurezza
    Il servizio gira in modalità oneshot ed esce dopo aver creato directory e permessi. systemd garantisce che venga eseguito esattamente una volta per boot e nell’ordine corretto.
  • Integrazione con altri servizi
    Dichiarando Before=nginx.service (o altri servizi), ci assicuriamo che Nginx, PHP-FPM o le app .NET non vengano mai avviate senza che le loro directory temporanee/cache siano già presenti.
  • Manutenibilità
    Usare systemd mantiene tutto nello stesso contesto degli altri servizi di sistema, rendendo semplice controllare i log con journalctl, abilitare/disabilitare il bootstrap o aggiornare lo script.

In sintesi: uno script lanciato all’avvio è fragile perché può essere eseguito prima che /mnt sia pronto. Un’unità systemd dedicata rende la configurazione prevedibile, affidabile e integrata nel ciclo di vita dei servizi Linux.

Conclusione

Ho creato azure-tempdisk-bootstrap perché volevo un modo semplice e sicuro per sfruttare al meglio il disco temporaneo di Azure con i miei web server. Funziona così bene che ho deciso di condividerlo in open source: se usi Nginx, PHP, WordPress o .NET su Azure, sono certo che ti tornerà utile.

 

About Ryan

IT Project Manager, Web Interface Architect e Lead Developer di numerosi siti e servizi web ad alto traffico in Italia e in Europa. Dal 2010 si occupa anche della progettazione di App e giochi per dispositivi Android, iOS e Mobile Phone per conto di numerose società italiane. Microsoft MVP for Development Technologies dal 2018.

View all posts by Ryan

Leave a Reply

Your email address will not be published. Required fields are marked *


Il periodo di verifica reCAPTCHA è scaduto. Ricaricare la pagina.

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.