Installare Nextcloud 17 su CentOS 8 con Nginx, PHP‑FPM 7.3 e MariaDB

Questo tutorial mostra come installare Nextcloud 17 su un server CentOS 8 usando Nginx, PHP‑FPM 7.3 e MariaDB, proteggendo il sito con certificati Let’s Encrypt. Include configurazione di PHP, SELinux, virtual host Nginx, e suggerimenti di sicurezza e manutenzione.
Importante: requisiti minimi suggeriti — 2 GB di RAM, 25 GB spazio libero, 2 CPU. Cambia i nomi di dominio e le credenziali negli esempi prima di applicare i comandi.
Sommario rapido
- Installare Nginx e aprire le porte HTTP/HTTPS
- Installare PHP‑FPM 7.3 dal repository REMI e configurare php.ini e opcache
- Installare e proteggere MariaDB, creare database e utente Nextcloud
- Ottenere certificati SSL con certbot (Let’s Encrypt)
- Scaricare Nextcloud 17, impostare permessi e data directory
- Configurare il virtual host Nginx per Nextcloud
- Applicare le regole SELinux e verificare i servizi
- Eseguire l’installazione tramite web installer
Termini chiave (1 linea ciascuno)
- Nextcloud: software open source per sincronizzazione file e condivisione.
- PHP‑FPM: FastCGI Process Manager per eseguire PHP con Nginx.
- MariaDB: fork compatibile di MySQL usato come database.
- certbot: client per ottenere certificati TLS/SSL da Let’s Encrypt.
Prerequisiti
- Server CentOS 8 aggiornato
- Accesso root o sudo
- Dominio DNS puntato al server (es. cloud.tuodominio.example)
- Requisiti hardware consigliati: 2 GB RAM, 25 GB spazio, 2 CPU
Cosa faremo
- Installare Nginx
- Installare PHP‑FPM 7.3 e moduli necessari
- Configurare PHP‑FPM e opcache
- Installare e configurare MariaDB
- Generare certificato SSL con Let’s Encrypt
- Scaricare e installare Nextcloud 17
- Configurare Nginx per Nextcloud
- Configurare SELinux
- Completare l’installazione via web
Contesto e scelte tecniche: perché questa combinazione
Nginx + PHP‑FPM è una scelta performante e comune per Nextcloud. PHP 7.3 è compatibile con Nextcloud 17; REMI fornisce pacchetti aggiornati per CentOS. MariaDB è usata qui per semplicità, ma PostgreSQL è un’alternativa supportata.
Step 1 - Installare Nginx
Installiamo Nginx dall’AppStream e apriamo le porte sul firewall (firewalld).
Esegui:
sudo dnf install nginx
Avvia e abilita il servizio all’avvio:
systemctl start nginx
systemctl enable nginx
Verifica lo stato:
systemctl status nginx
Dovresti vedere nginx attivo e in esecuzione.
Aggiungi i servizi HTTP/HTTPS al firewall:
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
firewall-cmd --reload
Step 2 - Installare PHP‑FPM 7.3
Nextcloud 17 richiede una versione moderna di PHP. Useremo PHP 7.3 dai repository REMI.
Abilita PowerTools, EPEL e REMI:
sudo dnf config-manager --set-enabled PowerTools
sudo dnf install epel-release
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
Controlla i repository disponibili:
dnf repolist
Abilita il modulo PHP 7.3 di REMI:
dnf module list php
dnf module enable php:remi-7.3
Installa PHP e i moduli richiesti:
sudo dnf install php-fpm php-cli php-devel php-gd php-mysqlnd php-pear php-xml php-mbstring php-pdo php-json php-pecl-apcu php-pecl-apcu-devel php-pecl-imagick-devel php-intl php-opcache php-zip
Ora PHP e PHP‑FPM 7.3 sono installati.
Step 3 - Configurare PHP‑FPM 7.3
Modifichiamo le impostazioni consigliate per Nextcloud.
Apri php.ini:
vim /etc/php.ini
Cambia/discommenta:
memory_limit = 512M
date.timezone = Asia/Jakarta
cgi.fixpathinfo = 0
Nota: imposta date.timezone sul tuo fuso orario (es. Europe/Rome).
Configura opcache:
vim /etc/php.d/10-opcache.ini
Imposta:
opcache.enable=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1
Configura PHP‑FPM pool:
vim /etc/php-fpm.d/www.conf
Modifica l’utente e il gruppo in nginx:
user = nginx
group = nginx
Imposta l’ascolto su socket:
listen = /run/php-fpm/www.sock
Discommenta le variabili d’ambiente e la cache file opcache:
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
php_value[opcache.file_cache] = /var/lib/php/opcache
Crea directory per sessioni/opcache e imposta i permessi:
mkdir -p /var/lib/php/{session,opcache}
chown -R nginx:nginx /var/lib/php/{session,opcache}
Abilita e avvia php-fpm:
systemctl enable php-fpm
systemctl start php-fpm
Verifica socket e stato:
netstat -pl | grep php
systemctl status php-fpm
Step 4 - Installare e configurare MariaDB
Installa MariaDB:
sudo dnf install mariadb mariadb-server
Avvia e abilita:
systemctl start mariadb
systemctl enable mariadb
Esegui lo script di sicurezza:
mysql_secure_installation
Rispondi Y alle richieste per impostare la password root, rimuovere utenti anonimi, rimuovere database di test e ricaricare le tabelle dei privilegi.
Accedi al prompt MySQL:
mysql -u root -p
TYPE YOUR ROOT PASSWORD
Crea database e utente per Nextcloud (sostituisci password e nomi nelle installazioni reali):
create database nextcloud_db;
create user nextclouduser@localhost identified by 'nextcloudpassdb';
grant all privileges on nextcloud_db.* to nextclouduser@localhost identified by 'nextcloudpassdb';
flush privileges;
Step 5 - Generare certificato SSL Letsencrypt
Installa certbot e richiedi il certificato usando il webroot di Nginx. Sostituisci dominio e email con i tuoi.
sudo dnf install certbot
certbot certonly --webroot --webroot-path /usr/share/nginx/html --agree-tos -m [email protected] -d cloud.hakase-labs.io
I certificati saranno sotto /etc/letsencrypt/live/tuo-dominio/
ls -lah /etc/letsencrypt/live/cloud.hakase-labs.io/
Step 6 - Scaricare e installare Nextcloud 17
Installa unzip e scarica Nextcloud:
sudo dnf install unzip
cd /var/www/
wget https://download.nextcloud.com/server/releases/nextcloud-17.0.2.zip
unzip nextcloud-17.0.2.zip
Crea la directory dati e imposta permessi:
mkdir -p /var/www/nextcloud/data/
sudo chown -R nginx:nginx /var/www/nextcloud
Step 7 - Configurare Nginx per Nextcloud
Crea un virtual host in /etc/nginx/conf.d/nextcloud.conf e sostituisci il dominio e i percorsi dei certificati con i tuoi:
upstream php-handler {
#server 127.0.0.1:9000;
server unix:/run/php-fpm/www.sock;
}
server {
listen 80;
listen [::]:80;
server_name cloud.hakase-labs.io;
# enforce https
return 301 https://$server_name:443$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name cloud.hakase-labs.io;
# Use Mozilla's guidelines for SSL/TLS settings
# https://mozilla.github.io/server-side-tls/ssl-config-generator/
# NOTE: some settings below might be redundant
ssl_certificate /etc/ssl/nginx/fullchain.pem;
ssl_certificate_key /etc/ssl/nginx/privkey.pem;
# Add headers to serve security related headers
add_header Referrer-Policy "no-referrer" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Download-Options "noopen" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Permitted-Cross-Domain-Policies "none" always;
add_header X-Robots-Tag "none" always;
add_header X-XSS-Protection "1; mode=block" always;
# Remove X-Powered-By, which is an information leak
fastcgi_hide_header X-Powered-By;
# Path to the root of your installation
root /var/www/nextcloud;
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location = /.well-known/carddav {
return 301 $scheme://$host:$server_port/remote.php/dav;
}
location = /.well-known/caldav {
return 301 $scheme://$host:$server_port/remote.php/dav;
}
# set max upload size
client_max_body_size 512M;
fastcgi_buffers 64 4K;
# Enable gzip but do not remove ETag headers
gzip on;
gzip_vary on;
gzip_comp_level 4;
gzip_min_length 256;
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
location / {
rewrite ^ /index.php;
}
location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ {
deny all;
}
location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) {
deny all;
}
location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+)\.php(?:$|\/) {
fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
set $path_info $fastcgi_path_info;
try_files $fastcgi_script_name =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $path_info;
fastcgi_param HTTPS on;
# Avoid sending the security headers twice
fastcgi_param modHeadersAvailable true;
# Enable pretty urls
fastcgi_param front_controller_active true;
fastcgi_pass php-handler;
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
}
location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) {
try_files $uri/ =404;
index index.php;
}
location ~ \.(?:css|js|woff2?|svg|gif|map)$ {
try_files $uri /index.php$request_uri;
add_header Cache-Control "public, max-age=15778463";
add_header Referrer-Policy "no-referrer" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Download-Options "noopen" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Permitted-Cross-Domain-Policies "none" always;
add_header X-Robots-Tag "none" always;
add_header X-XSS-Protection "1; mode=block" always;
access_log off;
}
location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap)$ {
try_files $uri /index.php$request_uri;
access_log off;
}
}
Test e riavvia nginx:
nginx -t
systemctl restart nginx
Controlla le porte in ascolto:
netstat -plntu
Step 8 - Configurare SELinux per Nextcloud
Se SELinux è in modalità enforcing, applica i contesti corretti alle directory usate da Nextcloud.
Installa gli strumenti SELinux:
sudo dnf install policycoreutils-python-utils
Esegui i seguenti comandi come root:
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/data(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/config(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/apps(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/assets(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/.htaccess'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/.user.ini'
restorecon -Rv '/var/www/nextcloud/'
Questo applicherà i contesti necessari per consentire a Nginx/PHP di scrivere nelle directory richieste.
Step 9 - Completare l’installazione via web
Apri il browser su:
Compila l’utente amministratore, scegli MySQL/MariaDB e inserisci i parametri del database creato in precedenza. Clicca Finish Setup.
Al termine vedrai la dashboard di Nextcloud.
Controlli post-installazione consigliati
- Verifica i log di Nginx (/var/log/nginx/error.log) e PHP (/var/log/php-fpm/error.log)
- Controlla lo stato dei servizi: nginx, php-fpm, mariadb
- Testa l’accesso HTTPS e la catena dei certificati
- Verifica i permessi delle cartelle /var/www/nextcloud e /var/www/nextcloud/data
Hardening e suggerimenti di sicurezza
- Abilita HSTS solo dopo aver verificato il dominio e il funzionamento HTTPS: add_header Strict-Transport-Security “max-age=15768000; includeSubDomains; preload;” always;
- Disabilita l’accesso SSH con password (usa chiavi SSH)
- Esegui backup regolari dei dati e del database (dump e copia della cartella data)
- Usa firewall e limitazioni di accesso (fail2ban per proteggere admin/login)
- Mantieni il sistema aggiornato e monitora gli avvisi di sicurezza di Nextcloud
Alternative e scenari diversi
- Apache invece di Nginx: Apache + mod_php o Apache + PHP‑FPM è supportato. La configurazione VirtualHost differisce ma il principio è identico.
- PostgreSQL: supportato da Nextcloud; consigliato in ambienti con carichi complessi o se già usi PostgreSQL.
- PHP 7.4/8.x: versioni più nuove possono essere compatibili con Nextcloud recenti, ma verifica i requisiti specifici della release.
- Container: eseguire Nextcloud in Docker o Podman semplifica isolamento e aggiornamenti.
Quando questa guida potrebbe non funzionare (controesempi)
- CentOS 8 obsoleto o repository rimossi: se il repository REMI/EPEL non è disponibile, l’installazione fallirà.
- Dominio non risolto o porte bloccate: certbot e accesso web falliranno.
- SELinux in modalità permissiva non ripristina automaticamente i contesti: alcune scritture potrebbero comunque essere negate.
Checklist di ruolo (operazioni rapide)
Admin di sistema:
- Verificare servizi (nginx, php-fpm, mariadb)
- Controllare aggiornamenti di sistema e sicurezza
- Pianificare backup regolari
DevOps:
- Automatizzare deploy (ansible/terraform)
- Configurare monitoraggio e alerting
- Implementare CI per aggiornamenti e test
Utente finale:
- Configurare client desktop/mobile Nextcloud
- Abilitare autenticazione a due fattori nel profilo
Metodo rapido di aggiornamento (mini‑metodologia)
- Metti Nextcloud in modalità maintenance: occ maintenance:mode –on
- Esegui backup DB e dati
- Aggiorna pacchetti PHP/Nginx/OS
- Scarica nuova release Nextcloud e testa in staging
- Esegui update tramite occ o web updater
- Disattiva maintenance: occ maintenance:mode –off
Esempi di test/criteri di accettazione
- Accesso alla pagina di login via HTTPS restituisce 200 e certificato valido
- Upload di un file singolo >100 MB funziona (se client_max_body_size adeguato)
- Creazione di un nuovo utente e login funzionano
- I backup del DB si completano correttamente e possono essere ripristinati
Migrazione da ownCloud o versioni precedenti
- Segui le note ufficiali di upgrade Nextcloud: test in staging, backup completi, verifica compatibilità app.
- Alcune app di terze parti potrebbero non essere compatibili e richiedere aggiornamenti o sostituzioni.
Privacy e note GDPR (uso dei dati)
- Nextcloud memorizza file e metadati degli utenti sul server: assicurati che il server sia sotto il tuo controllo e ubicato in un’area giuridica conforme alle tue policy
- Mantieni log accessibili solo al personale autorizzato
- Fornisci informazioni di contatto e policy privacy agli utenti se gestisci un’istanza multiutente pubblica
Manutenzione e backup (playbook sintetico)
- Backup giornaliero: dump MySQL e sincronizzazione della cartella data verso storage esterno
- Backup settimanale: snapshot completo del filesystem
- Test mensile di ripristino: verifica che i backup siano ripristinabili
FAQ
Posso usare PostgreSQL invece di MariaDB?
Sì. Nextcloud supporta PostgreSQL; la procedura per creare database/utente è simile.
Come rinnovare automaticamente i certificati Let’s Encrypt?
Usa certbot renew e configura un cron job o systemd timer per eseguire il rinnovo automatico (es. quotidiano).
Devo usare SELinux?
SELinux aumenta la sicurezza. Se non vuoi configurarlo, puoi impostarlo in permissive ma perdi alcune garanzie di isolamento.
Riferimenti
- Documentazione ufficiale Nextcloud: https://docs.nextcloud.com/
Riassunto finale
Hai installato Nextcloud 17 su CentOS 8 con Nginx, PHP‑FPM 7.3, e MariaDB, protetto con Let’s Encrypt. Dopo l’installazione, applica hardening, backup regolari e un piano di aggiornamento per mantenere l’istanza sicura e affidabile.
Materiali simili

Apple Music non funziona in iOS 17 — come risolvere

Installare Tripwire su Ubuntu 16.04

Split View su Mac: guida pratica

Aggiungere immagini come punti elenco in Word
