1 23/04/2026 13 min

Su Amazon Linux 2023 la scelta sensata per Nextcloud è una stack LEMP pulita: Nginx, PHP-FPM, MariaDB e HTTPS subito, senza trascinarsi dietro pacchetti vecchi o configurazioni importate da altre distro. La differenza la fanno due dettagli: la gestione dei repository EPEL/Remi per PHP e il fatto che Amazon Linux 2023 usa un ecosistema più vicino a Fedora/RHEL moderno rispetto alle vecchie abitudini da Amazon Linux 2.

Qui l’obiettivo non è “far partire qualcosa”, ma ottenere un’installazione ripetibile, con permessi corretti, caching minimo, upload decenti e una base già pronta per certificato TLS, cron e manutenzione. Se salti questi passaggi, Nextcloud funziona lo stesso, ma poi paghi il conto in errori PHP, performance scarse o problemi di upgrade.

Prerequisiti e scelta architetturale

Assumo una istanza Amazon Linux 2023 con IP pubblico o dietro reverse proxy, un dominio già puntato verso il server e accesso SSH come utente con sudo. Sul piano operativo conviene partire da una macchina con almeno 2 vCPU e 4 GB di RAM per un uso piccolo o medio; per ambienti con più utenti o preview server, meglio 8 GB e storage veloce. Se il disco è EBS, scegli un volume con IOPS adeguate: Nextcloud soffre più la latenza che la pura banda.

La struttura che segue usa database locale MariaDB. Per un ambiente più serio puoi spostare il DB su un’istanza separata, ma per una prima installazione locale riduci variabili e semplifichi il troubleshooting. Se hai già un reverse proxy o un load balancer davanti, adatta solo i parametri di trusted proxy e headers; il resto resta uguale.

Aggiornamento base e pacchetti necessari

Prima di installare qualsiasi cosa, allinea il sistema. Su una macchina nuova spesso il problema non è Nextcloud, ma un kernel o una libreria non aggiornata.

sudo dnf update -y
sudo reboot

Dopo il reboot, verifica che il sistema sia pulito e che SELinux sia attivo in modalità enforcing. Disabilitarlo “per provare” è una scorciatoia che poi diventa debito tecnico.

getenforce
cat /etc/os-release

Atteso: Enforcing e Amazon Linux 2023. Se SELinux è permissive, non correggerlo dopo a installazione finita: sistemalo subito, così eventuali denial emergono mentre configuri il servizio e non quando il sistema è già in produzione.

Installare Nginx, MariaDB e PHP 8.x su Amazon Linux 2023

Amazon Linux 2023 non è un clone di Debian: la disponibilità dei moduli PHP va verificata con attenzione. Prima controlla cosa offre il repository base e poi, se serve, integra un repository compatibile per una versione PHP supportata da Nextcloud. In generale, per una release moderna di Nextcloud serve PHP recente; se il repository di sistema non basta, usa Remi in modo controllato.

sudo dnf install -y nginx mariadb105-server unzip bzip2 tar wget policycoreutils-python-utils
sudo systemctl enable --now nginx mariadb

Per PHP, verifica prima i moduli disponibili:

sudo dnf module list php
sudo dnf info php

Se la versione proposta è compatibile con la tua release di Nextcloud, installala insieme ai moduli necessari. In caso contrario, abilita un repository PHP più aggiornato, ma fallo in modo esplicito e documentato. Ecco un esempio tipico con un set di moduli che servono davvero a Nextcloud: FPM, GD, XML, mbstring, intl, zip, curl, opcache, sqlite solo se vuoi un test rapido, non per produzione.

sudo dnf install -y php php-fpm php-cli php-mysqlnd php-gd php-mbstring php-intl php-xml php-zip php-curl php-opcache php-process php-bcmath php-gmp

Se il comando fallisce perché la versione PHP non è abbastanza recente, il punto non è “forzare” il pacchetto, ma scegliere un repository compatibile con Amazon Linux 2023 e mantenere il controllo della provenienza. In quel caso, chiudi il gap verificando l’output di dnf module list php e la documentazione del repository che vuoi introdurre prima di procedere.

Configurare MariaDB per Nextcloud

MariaDB di default parte, ma non è pronta per uso applicativo serio senza qualche ritocco. Prima mettila in sicurezza, poi crea database e utente dedicato. Non usare root applicativo e non riutilizzare credenziali tra servizi.

sudo mysql_secure_installation

Imposta una password root del database, rimuovi utenti anonimi, disabilita il login remoto root e cancella il database di test. Dopo questo, crea schema e utente per Nextcloud.

sudo mysql -u root -p
CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER 'nextclouduser'@'localhost' IDENTIFIED BY 'PASSWORD_FORTE_QUI';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextclouduser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Il charset utf8mb4 non è un vezzo: evita problemi con emoji e caratteri particolari, e ti mette al riparo da conversioni sporche in fase di upgrade. Se il database è su un host remoto, sostituisci 'localhost' con l’IP o la subnet corretta e limita l’esposizione a livello firewall. Blast radius: molto alto se lasci il DB esposto su 3306 senza controllo.

Scaricare Nextcloud e sistemare i permessi

Scarica l’archivio ufficiale dal sito di Nextcloud o dal mirror che usi in azienda. Qui conviene verificare sempre il checksum o la firma, soprattutto se stai preparando un ambiente che poi verrà clonato in produzione. Non è paranoia: è igiene operativa.

cd /tmp
wget https://download.nextcloud.com/server/releases/latest.zip
unzip latest.zip
sudo mv nextcloud /var/www/nextcloud

Crea una directory dati fuori dalla root web. Non metterla dentro /var/www/nextcloud, perché l’upgrade e la superficie d’attacco diventano più scomodi da gestire.

sudo mkdir -p /var/ncdata
sudo chown -R nginx:nginx /var/www/nextcloud /var/ncdata
sudo find /var/www/nextcloud -type d -exec chmod 750 {} \;
sudo find /var/www/nextcloud -type f -exec chmod 640 {} \;

Su Amazon Linux 2023 l’utente del web server è in genere nginx. Se il tuo setup usa un altro account, verifica con ps -eo user,comm | grep nginx o controllando il file di servizio. Non assumere il nome utente a memoria: è uno di quei dettagli che si trasformano in 403 e file non scrivibili.

Configurare PHP-FPM per Nextcloud

Nextcloud è sensibile a limiti PHP troppo stretti. I valori di default vanno quasi sempre aumentati per upload, timeout e memoria. Modifica il file di pool di PHP-FPM o il file php.ini principale, a seconda della tua installazione. Su sistemi recenti i percorsi più comuni sono /etc/php-fpm.d/www.conf e /etc/php.ini.

sudo vi /etc/php.ini

Imposta almeno questi parametri, adattandoli al carico previsto:

memory_limit = 512M
upload_max_filesize = 2G
post_max_size = 2G
max_execution_time = 360
max_input_time = 360
date.timezone = Europe/Rome

Nel pool FPM controlla che il socket sia accessibile a Nginx. Un esempio semplice:

sudo vi /etc/php-fpm.d/www.conf
user = nginx
group = nginx
listen = /run/php-fpm/www.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

Riavvia PHP-FPM e verifica che il servizio parta senza errori.

sudo systemctl enable --now php-fpm
sudo systemctl restart php-fpm
sudo systemctl status php-fpm --no-pager

Se lo stato è failed, guarda il log con journalctl -u php-fpm -xe. Le cause tipiche sono un file di configurazione con sintassi errata o permessi sul socket incoerenti con Nginx.

Configurare Nginx per Nextcloud

La configurazione di Nginx deve gestire correttamente PHP, gli header di sicurezza e i path riservati di Nextcloud. Un errore comune è lasciare passare tutto a PHP o non proteggere gli endpoint interni. Qui conviene adottare un server block dedicato.

sudo vi /etc/nginx/conf.d/nextcloud.conf
server {
    listen 80;
    server_name cloud.example.com;

    root /var/www/nextcloud;
    index index.php index.html /index.php$request_uri;

    client_max_body_size 2G;
    fastcgi_buffers 64 4K;

    add_header X-Content-Type-Options nosniff always;
    add_header X-Robots-Tag "noindex, nofollow" always;
    add_header X-Frame-Options SAMEORIGIN always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Referrer-Policy no-referrer always;

    location = /robots.txt { allow all; log_not_found off; access_log off; }
    location = /.well-known/carddav { return 301 /remote.php/dav/; }
    location = /.well-known/caldav { return 301 /remote.php/dav/; }

    location / {
        try_files $uri $uri/ /index.php$request_uri;
    }

    location ~ ^/index\.php(?:$|/) {
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param modHeadersAvailable true;
        fastcgi_param front_controller_active true;
        fastcgi_pass unix:/run/php-fpm/www.sock;
        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;
    }

    location ~ \.php(?:$|/) {
        return 404;
    }

    location ~* \.(?:css|js|woff2?|svg|gif|map|png|jpg|jpeg|ico)$ {
        try_files $uri /index.php$request_uri;
        expires 6M;
        access_log off;
    }

    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
        deny all;
    }
}

Controlla la sintassi e ricarica Nginx solo dopo verifica positiva.

sudo nginx -t
sudo systemctl enable --now nginx
sudo systemctl reload nginx

Se nginx -t fallisce, non andare avanti: correggi prima il file. Il rollback qui è semplice e reversibile: ripristina il file precedente da backup o da versioning prima del reload.

Installazione via browser e parametri iniziali

A questo punto apri il dominio in browser e completa il wizard web. Qui è facile sbagliare dettagli che poi costano tempo, quindi usa i valori con metodo.

  1. Inserisci un utente amministratore iniziale robusto, non riutilizzato altrove.
  2. Imposta la directory dati su /var/ncdata.
  3. Seleziona MariaDB/MySQL e compila database, utente e password creati prima.
  4. Avvia l’installazione e attendi la creazione delle tabelle.

Se il wizard resta in attesa o termina con errore, il punto da controllare è quasi sempre uno tra permessi della directory dati, credenziali DB o limiti PHP. La diagnostica utile non è “riprovare”: è leggere il log di Nginx, il log PHP-FPM e il log applicativo di Nextcloud.

Impostare cron, trusted domains e cache

Nextcloud non dovrebbe usare AJAX per i compiti ricorrenti in produzione. Usa cron di sistema. Questo riduce carico inutile e rende più prevedibile il comportamento.

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

Se il binario php non è nel path dell’utente nginx, usa il percorso completo, ad esempio /usr/bin/php. Verifica che il task giri con crontab -u nginx -l e che il file di log di sistema non segnali problemi di esecuzione.

Nel file config.php di Nextcloud, controlla i domini fidati. Senza questo passaggio, il login può funzionare male o il sistema può rifiutare l’host in modo intermittente se il nome cambia tra IP, FQDN e reverse proxy.

sudo vi /var/www/nextcloud/config/config.php
'trusted_domains' =>
array (
  0 => 'cloud.example.com',
  1 => '192.0.2.10',
),
'memcache.local' => '\\OC\\Memcache\\APCu',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'filelocking.enabled' => true,

Per la cache, APCu e Redis sono la combinazione giusta. Redis è particolarmente utile per locking e riduzione dei colli di bottiglia in ambienti con più utenti. Se vuoi introdurlo, installa il servizio e configura PHP con estensione e socket locali, non con una porta esposta senza necessità.

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

Prima di abilitare Redis in Nextcloud, verifica che il socket o la porta siano realmente locali. Il blast radius di un Redis esposto male è inutile da spiegare: non va fatto.

Abilitare HTTPS con certificato TLS

Non tenere Nextcloud in HTTP semplice oltre il tempo necessario al bootstrap. Con Let’s Encrypt puoi chiudere il problema in pochi minuti, a patto di avere il dominio risolto correttamente verso l’istanza.

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

Dopo il rilascio del certificato, forza il redirect a HTTPS e aggiorna eventuali trusted proxies o parametri di overwrite protocol se sei dietro un bilanciatore. Se il certificato non si rinnova, il problema di solito è nel path di validazione o nel firewall che blocca la challenge.

Se preferisci gestire TLS fuori da Nginx con un load balancer, mantieni comunque la configurazione di Nextcloud coerente con il protocollo visto dall’utente finale. In caso contrario vedrai loop di redirect o warning sui cookie sicuri.

Verifiche post-installazione che evitano sorprese

Una volta dentro l’interfaccia, non fermarti al “si apre”. Controlla stato sistema e warning amministrativi. È qui che emergono i problemi latenti: directory dati scrivibile male, cron non attivo, memcache assente, opcache sottodimensionata o trusted domain incompleto.

  1. Apri https://cloud.example.com e accedi come admin.
  2. Vai in Impostazioni amministratore e controlla gli avvisi di sicurezza e configurazione.
  3. Verifica che il job di manutenzione sia impostato su cron.
  4. Carica un file di test e conferma che upload e download funzionino.
  5. Controlla i log applicativi in /var/www/nextcloud/data/nextcloud.log.

Se vuoi una verifica rapida da shell, puoi controllare che Nginx risponda e che il backend PHP non stia generando errori ripetuti.

curl -I https://cloud.example.com
sudo journalctl -u nginx -n 50 --no-pager
sudo journalctl -u php-fpm -n 50 --no-pager

Atteso: HTTP/2 200 o 302 verso il login, nessun errore ricorrente in journal, nessun warning su permessi o socket. Se vedi 502 Bad Gateway, il layer da isolare è quasi sempre PHP-FPM; se vedi pagina bianca, spesso è PHP o un modulo mancante; se il dominio non risolve, il problema è a monte nel DNS.

Hardening minimo utile in produzione

La sicurezza di base non richiede invenzioni. Richiede disciplina: aggiornamenti, permessi stretti, esposizione minima e segreti gestiti bene. Su Nextcloud i punti sensibili sono database, directory dati, configurazione web e account admin iniziale.

  1. Lascia SELinux attivo e risolvi eventuali denial con log audit, non con disabilitazione globale.
  2. Non esporre MariaDB su rete pubblica se non è strettamente necessario.
  3. Proteggi il file config.php con permessi adeguati e backup sicuri.
  4. Ruota la password dell’admin iniziale se è stata usata in test o in un contesto condiviso.
  5. Abilita gli aggiornamenti regolari e pianifica la finestra di manutenzione per major upgrade.

Per il tuning, la metrica che conta davvero è la latenza percepita sulle operazioni più comuni: login, listing file, upload e apertura preview. Se il TTFB cresce dopo l’installazione, il primo sospetto non è “Nextcloud è lento”, ma storage, PHP-FPM saturato o cache assente.

Upgrade e manutenzione senza farsi male

Prima di ogni upgrade, fai un backup coerente di database e directory dati. Non basta copiare i file a caldo e sperare. Per una procedura minima, metti in manutenzione l’istanza, esegui dump DB, salva config.php e verifica lo spazio libero. Se lo spazio manca, il rischio non è solo il fallimento dell’upgrade: è la corruzione di dati temporanei o del journal applicativo.

sudo -u nginx php /var/www/nextcloud/occ maintenance:mode --on
sudo mysqldump -u root -p nextcloud > /root/nextcloud.sql
sudo cp /var/www/nextcloud/config/config.php /root/config.php.bak
sudo -u nginx php /var/www/nextcloud/occ maintenance:mode --off

Il rollback, in caso di upgrade fallito, è semplice solo se hai una copia coerente prima di cambiare versione. Senza quella, il ripristino diventa un esercizio di recupero parziale. Per questo conviene trattare il file system e il database come un’unica unità logica.

Check finale di una installazione sana

Una installazione fatta bene su Amazon Linux 2023 deve soddisfare alcuni controlli oggettivi: Nginx risponde in HTTPS, PHP-FPM è attivo, MariaDB è locale o raggiungibile in modo controllato, cron gira, i trusted domain sono corretti e il pannello admin non mostra errori strutturali. Se manca uno solo di questi punti, il sistema funziona ma non è ancora affidabile.

Il valore pratico di questa procedura è che puoi riprodurla su più istanze con pochissime varianti. Una volta stabilito il modello, il resto diventa standardizzazione: stesso layout, stessi permessi, stessi controlli, stesso criterio di rollback. Ed è proprio questo che rende una installazione Nextcloud gestibile nel tempo, non solo avviata una volta.