1 25/10/2026 12 min

Su AlmaLinux 8 la strada più lineare per Nextcloud passa da una stack LAMP/LEMP ben tenuta: web server, PHP compatibile, database, TLS e qualche accortezza su permessi e caching. La differenza tra un’installazione che resta stabile e una che si degrada dopo pochi giorni sta quasi sempre nei dettagli: limiti PHP, modulo rewrite, OPcache, database configurato bene e storage con permessi coerenti.

Qui prendo una strada pratica: Apache, MariaDB e PHP-FPM. È una combinazione solida per AlmaLinux 8, facile da mantenere e abbastanza trasparente da diagnosticare quando qualcosa non torna. Se preferisci Nginx la logica non cambia, ma cambiano i file di vhost e la gestione dei parametri FastCGI.

Scelta dei componenti e prerequisiti reali

Prima di installare, chiarisci il contesto. Nextcloud non è solo una web app: scrive molto su disco, usa PHP in modo intenso e beneficia di un database con latenza contenuta. Su un server piccolo, la differenza la fa la disciplina operativa: disco SSD, almeno 2 vCPU, 4 GB di RAM come base minima sensata, spazio separato per dati e backup, e un nome host già pronto con DNS corretto.

Assumo una macchina AlmaLinux 8 aggiornata, accesso root o sudo, dominio già puntato al server e porte 80/443 raggiungibili dall’esterno. Se il server è dietro CDN o reverse proxy, la configurazione TLS e gli header di forwarding vanno adattati, ma l’installazione di base resta la stessa.

Per evitare sorprese, conviene partire con un aggiornamento completo e con i repository necessari. Su AlmaLinux 8 PHP arriva spesso da AppStream o da repository esterni se serve una versione più recente. Per Nextcloud moderno, PHP 8.x è la scelta corretta; PHP 7.2/7.3 è fuori strada per installazioni nuove.

Aggiornamento sistema e pacchetti base

Inizia con un aggiornamento del sistema e l’installazione dei pacchetti fondamentali. Questo riduce i problemi di dipendenze e ti porta a una base coerente per Apache, MariaDB, PHP e gli strumenti di manutenzione.

sudo dnf update -y
sudo dnf install -y epel-release
sudo dnf install -y wget curl tar unzip policycoreutils-python-utils firewalld

Se il server è minimale, abilita anche il firewall e verifica che sia in esecuzione. Non lasciare la macchina aperta “per fare prima”: è una cattiva abitudine che si paga quando il servizio passa in produzione.

sudo systemctl enable --now firewalld
sudo firewall-cmd --state

Installazione di Apache, MariaDB e PHP-FPM

Apache resta una scelta pratica per Nextcloud su AlmaLinux 8, soprattutto se vuoi una configurazione chiara e troubleshooting semplice. MariaDB gestisce il database applicativo, mentre PHP-FPM separa l’esecuzione PHP dal processo web principale, con un comportamento più prevedibile sotto carico.

sudo dnf install -y httpd mariadb-server
sudo dnf install -y php php-cli php-fpm php-common php-gd php-mbstring php-intl php-xml php-zip php-mysqlnd php-curl php-bcmath php-gmp php-opcache php-process php-pecl-redis

Il pacchetto Redis qui non è obbligatorio, ma è utile se prevedi di usare locking e cache applicativa. Se vuoi tenere la prima installazione più essenziale, puoi aggiungerlo dopo. L’importante è non dimenticare OPcache, che su Nextcloud non è un dettaglio marginale.

Avvia e abilita i servizi.

sudo systemctl enable --now httpd mariadb php-fpm
sudo systemctl status httpd mariadb php-fpm --no-pager

Se uno dei tre servizi non parte, prima di cambiare configurazioni controlla i log del servizio e lo stato della sintassi. In questa fase gli errori tipici sono banali: modulo PHP non caricato, socket non raggiungibile, o MariaDB non inizializzato correttamente.

Hardening iniziale di MariaDB

MariaDB va configurato prima di creare il database. Non serve fare tuning estremo all’inizio, ma bisogna impostare almeno una base sicura: password per root del database, rimozione di utenti anonimi, disabilitazione del login remoto di root e database di test eliminato.

sudo mysql_secure_installation

Se preferisci farlo manualmente, entra in console MySQL e crea un database dedicato. Non usare il database di default né un utente generico riutilizzato per altri servizi.

sudo mysql
CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER 'nextclouduser'@'localhost' IDENTIFIED BY 'PASSWORD_FORTE_DA_RUOTARE';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextclouduser'@'localhost';
FLUSH PRIVILEGES;

La password va trattata come segreto operativo: non lasciarla in shell history, non incollarla in ticket e non riutilizzarla in altri contesti. Se devi automatizzare, usa un file protetto o un secret manager, non testo in chiaro.

Configurazione PHP per Nextcloud

La parte più sottovalutata è PHP. Nextcloud funziona male se i limiti sono troppo stretti o se mancano estensioni e timeout adeguati. Su AlmaLinux 8 il file da toccare dipende dalla sorgente del pacchetto, ma in genere la base è in /etc/php.ini e la pool FPM in /etc/php-fpm.d/www.conf.

Regola almeno questi parametri nel file PHP principale o nel file override appropriato.

memory_limit = 512M
upload_max_filesize = 2G
post_max_size = 2G
max_execution_time = 360
max_input_time = 360
date.timezone = Europe/Rome
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.revalidate_freq=1

Per PHP-FPM, verifica che il socket sia coerente con Apache. Un esempio tipico è /run/php-fpm/www.sock. Se il pool usa TCP locale invece del socket Unix, va bene comunque, ma un socket Unix in genere è più semplice e leggero sullo stesso host.

; /etc/php-fpm.d/www.conf
user = apache
group = apache
listen = /run/php-fpm/www.sock
listen.owner = apache
listen.group = apache
pm = dynamic
pm.max_children = 20
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 6

Dopo le modifiche riavvia PHP-FPM. Se il servizio non riparte, il primo controllo è la sintassi del file e il log di sistema.

sudo php-fpm -t
sudo systemctl restart php-fpm
sudo journalctl -u php-fpm -n 50 --no-pager

Virtual host Apache e moduli necessari

Apache deve servire Nextcloud con rewrite attivo e con il binding corretto verso PHP-FPM. Su AlmaLinux 8, il modulo proxy_fcgi è la via più pulita. Abilita anche mod_rewrite, perché Nextcloud si appoggia a URL riscritte e a una serie di endpoint dinamici.

sudo dnf install -y mod_ssl
sudo systemctl restart httpd

Un vhost essenziale può essere strutturato così. Adatta il nome host al tuo dominio reale.

<VirtualHost *:80> ServerName cloud.example.com DocumentRoot /var/www/nextcloud <Directory /var/www/nextcloud/> Require all granted AllowOverride All Options FollowSymlinks MultiViews <IfModule mod_dav.c> Dav off </IfModule> </Directory> ErrorLog /var/log/httpd/nextcloud_error.log CustomLog /var/log/httpd/nextcloud_access.log combined
</VirtualHost>

Se usi PHP-FPM via socket Unix, aggiungi il blocco di gestione PHP nel vhost o in un include dedicato. La configurazione precisa può variare in base al pacchetto, ma il principio è sempre lo stesso: Apache inoltra i file PHP a FPM, non li interpreta direttamente.

<FilesMatch \.php$> SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
</FilesMatch>

Controlla la sintassi e ricarica il servizio.

sudo apachectl configtest
sudo systemctl reload httpd

Download e posizionamento di Nextcloud

Scarica l’archivio ufficiale e verifica che la directory di destinazione sia coerente con il vhost. In genere conviene usare /var/www/nextcloud come document root e tenere i dati fuori da quella directory, per evitare che il contenuto utente finisca esposto accidentalmente.

cd /tmp
wget https://download.nextcloud.com/server/releases/latest.tar.bz2
sudo tar -xjf latest.tar.bz2 -C /var/www/
sudo mv /var/www/nextcloud /var/www/nextcloud

Se stai leggendo questo passaggio e ti sembra una ripetizione, fermati: il punto non è la copiatura del file, ma la correttezza dei permessi e del path finale. Dopo l’estrazione, crea una directory dati separata, ad esempio /var/ncdata, su filesystem con spazio sufficiente.

sudo mkdir -p /var/ncdata
sudo chown -R apache:apache /var/www/nextcloud /var/ncdata

Su sistemi con SELinux enforcing, non basta il chown. Devi assegnare i contesti corretti, altrimenti l’app parte ma poi fallisce su upload, cache o scrittura dei file di configurazione.

sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/nextcloud(/.*)?"
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/nextcloud/config(/.*)?"
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/nextcloud/data(/.*)?"
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/ncdata(/.*)?"
sudo restorecon -Rv /var/www/nextcloud /var/ncdata

Se l’app verrà installata via browser, la directory config deve essere scrivibile durante la procedura iniziale. Dopo l’installazione, restringi i permessi secondo le indicazioni di Nextcloud e mantieni i diritti minimi necessari.

Firewall e accesso HTTPS

Apri solo ciò che serve. In questa fase servono almeno HTTP e HTTPS. Se il server è esposto direttamente, TLS va abilitato subito, non “dopo”. Il traffico in chiaro per un portale di file è una pessima scelta, anche in ambienti interni.

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
sudo firewall-cmd --list-services

Per il certificato, il percorso più semplice è Let’s Encrypt con Certbot. Su AlmaLinux 8 la disponibilità del pacchetto può dipendere dai repository, ma il flusso resta standard: installi Certbot, emetti il certificato e configuri il rinnovo automatico.

sudo dnf install -y certbot python3-certbot-apache
sudo certbot --apache -d cloud.example.com

Dopo l’emissione, verifica che il rinnovo sia schedulato.

sudo systemctl status certbot-renew.timer --no-pager
sudo certbot renew --dry-run

Installazione iniziale via browser

A questo punto apri il dominio nel browser. La schermata iniziale ti chiederà il nome dell’amministratore, la password, la directory dati e i parametri del database. Usa il database creato prima, non l’utente root di MariaDB.

Campi da compilare:

  • utente amministratore locale
  • password amministratore locale
  • directory dati: /var/ncdata
  • utente database: nextclouduser
  • password database: quella definita in precedenza
  • host database: localhost
  • nome database: nextcloud

Se l’installazione fallisce con errore di scrittura, torna ai permessi e ai contesti SELinux. Se fallisce sulla connessione al database, controlla che MariaDB sia attivo e che il socket o l’host siano coerenti con la configurazione scelta.

Configurazione post-installazione da non saltare

Una installazione appena completata è funzionante ma non ancora ben rifinita. Le impostazioni più importanti sono la cache, il locking e i cron job. Senza queste tre cose il comportamento resta accettabile su pochi utenti, ma peggiora appena arrivano carichi reali.

Installa Redis e configura il backend di locking se non lo hai già fatto. Redis aiuta sia con la cache distribuita sia con i lock dei file, evitando conflitti e attese inutili sul filesystem.

sudo dnf install -y redis
sudo systemctl enable --now redis

Nel file config/config.php di Nextcloud puoi aggiungere una configurazione essenziale simile alla seguente. Adatta il path del socket Redis alla tua installazione se necessario.

<?php
$CONFIG = array ( 'memcache.local' => '\\OC\\Memcache\\APCu', 'memcache.locking' => '\\OC\\Memcache\\Redis', 'memcache.distributed' => '\\OC\\Memcache\\Redis', 'redis' => array ( 'host' => '/run/redis/redis.sock', 'port' => 0, ),
);

Per il cron, evita il cron AJAX. È comodo in fase di test, ma non è la scelta giusta per un’istanza che deve restare affidabile. Imposta un job di sistema ogni cinque minuti.

sudo crontab -u apache -e
*/5 * * * * php -f /var/www/nextcloud/cron.php

Se preferisci, puoi usare il cron di sistema in /etc/cron.d/. L’importante è che venga eseguito con l’utente giusto e con il path corretto a PHP.

Controlli di salute e verifica funzionale

Dopo l’installazione, non limitarti a vedere la home page. Verifica che il backend risponda correttamente, che i log siano puliti e che il sistema possa scrivere file, fare upload e generare preview. Un check rapido da CLI ti dice subito se la base è corretta.

curl -I https://cloud.example.com
sudo tail -n 50 /var/log/httpd/nextcloud_error.log
sudo tail -n 50 /var/www/nextcloud/data/nextcloud.log

Nel log applicativo cerca errori su database, permessi, cache e limiti PHP. Se vedi warning ripetuti su OPcache, memoria insufficiente o filesystem non scrivibile, conviene correggerli subito: sono segnali piccoli che diventano problemi grandi quando aumentano gli utenti.

Controlla anche la pagina Impostazioni amministratore di Nextcloud. Il sistema segnala chiaramente: cron non configurato, cache non ottimizzata, backend di locking assente, HTTPS non forzato, header di sicurezza mancanti. Quella pagina è il primo audit da fare dopo ogni installazione.

Errori tipici e correzioni rapide

Il classico errore è la pagina bianca o un 500 dopo il login. Quasi sempre il problema sta in PHP-FPM, nei permessi o in un’estensione mancante. Un altro errore frequente è il blocco in fase di setup con messaggi sul database: in quel caso il database esiste ma l’utente non ha privilegi corretti, oppure il charset non è quello giusto.

Se il certificato è valido ma il browser continua a segnalare contenuti non sicuri, la causa è spesso un reverse proxy o una configurazione errata di overwriteprotocol e trusted_domains. Quando il server è dietro proxy, Nextcloud deve sapere che il traffico esterno è HTTPS anche se internamente arriva in HTTP.

'trusted_domains' => array ( 0 => 'cloud.example.com',
),
'overwriteprotocol' => 'https',
'overwrite.cli.url' => 'https://cloud.example.com',

Se usi SELinux e qualcosa non scrive, non disabilitarlo a colpo d’occhio. È più pulito correggere i contesti o, se serve, capire quale boolean manca. Disabilitare SELinux per comodità è una scorciatoia che complica gli audit futuri.

Backup e manutenzione minima

Un’installazione fatta bene prevede subito il piano di backup. Per Nextcloud servono almeno tre elementi: database, directory dati e file di configurazione. Se perdi uno di questi tre, il restore diventa parziale o incerto.

sudo mysqldump -u root -p nextcloud > /root/backup-nextcloud.sql
sudo tar -czf /root/backup-nextcloud-config.tar.gz /var/www/nextcloud/config
sudo tar -czf /root/backup-nextcloud-data.tar.gz /var/ncdata

Con database grandi, meglio pianificare backup consistenti e testare il restore in un ambiente separato. Il backup non vale nulla se non hai mai verificato che ripristini davvero l’istanza.

Per la manutenzione ordinaria, tieni d’occhio aggiornamenti di sistema, release di Nextcloud e versione PHP supportata. Nextcloud è molto sensibile alla compatibilità tra core, app e runtime. Un upgrade del sistema operativo senza verifica della matrice di compatibilità è il modo più rapido per creare un fermo servizio evitabile.

Chiusura operativa

Se segui questa sequenza, ottieni un’istanza Nextcloud pulita su AlmaLinux 8: stack coerente, TLS attivo, database separato, PHP dimensionato in modo sensato, SELinux mantenuto utile e non aggirato, cron configurato correttamente e una base già pronta per crescere. La parte difficile non è far comparire la pagina iniziale; è evitare che il sistema si rompa dopo il primo picco di utilizzo. È lì che permessi, cache, limiti PHP e database ben impostato fanno davvero la differenza.