Tempo stimato : 30-45 minuti
Difficoltà : Intermedia ⭐⭐
Sistema : Debian 13 (Trixie) / Ubuntu 24.04 LTS
📋 Introduzione
Questa guida ti spiega come installare Laravel 12 (ultima versione) su un VPS Linux con Debian 13 o Ubuntu 24.04. Alla fine di questo tutorial, avrai un ambiente di produzione pronto con :
- ✅ PHP 8.3 (richiesto per Laravel 12)
- ✅ Composer (gestore di dipendenze PHP)
- ✅ Nginx (server web ad alte prestazioni)
- ✅ MariaDB (database)
- ✅ Laravel 12 (framework PHP)
Requisiti
| Requisiti | Descrizione |
|---|---|
| 🖥️ VPS Linux | Debian 13 o Ubuntu 24.04 con accesso root |
| 🔑 Accesso SSH | Connessione come root o utente sudo |
| 🌐 Nome di dominio | (Opzionale) Per accedere tramite un URL |
| 💾 RAM | Minimo 1 GB raccomandato |
| 💿 Storage | Minimo 10 GB |
Configurazione richiesta per Laravel 12
| Componente | Versione minima |
|---|---|
| PHP | 8.2 (8.3 o 8.4 raccomandato) |
| Composer | 2.x |
| Database | MySQL 5.7+ / MariaDB 10.3+ / PostgreSQL 10+ / SQLite 3.26+ |
🔄 Passo 1 : Aggiornare il Sistema
Prima di qualsiasi installazione, aggiorna il tuo sistema.
Connessione SSH
ssh root@il-tuo-ip-server
Aggiornamento dei pacchetti
# Aggiornare la lista dei pacchetti
apt update
# Aggiornare i pacchetti installati
apt upgrade -y
✅ Risultato atteso : Tutti i pacchetti sono aggiornati.
🐘 Passo 2 : Installare PHP 8.3
Laravel 12 richiede PHP 8.2 minimo. Installeremo PHP 8.3 per migliori prestazioni.
Per Debian 13
Debian 13 (Trixie) include PHP 8.4 di default. Per installare PHP 8.3, aggiungi il repository Sury :
# Installare le dipendenze
apt install -y apt-transport-https lsb-release ca-certificates curl gnupg
# Scaricare la chiave GPG del repository Sury
curl -fsSL https://packages.sury.org/php/apt.gpg | gpg --dearmor -o /usr/share/keyrings/sury-php.gpg
# Aggiungere il repository Sury
echo "deb [signed-by=/usr/share/keyrings/sury-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/sury-php.list
# Aggiornare la lista dei pacchetti
apt update
Per Ubuntu 24.04
Ubuntu 24.04 include PHP 8.3 di default. Se desideri una versione più recente, aggiungi il PPA Ondřej :
# Installare le dipendenze
apt install -y software-properties-common
# Aggiungere il PPA PHP (opzionale per PHP 8.4)
add-apt-repository ppa:ondrej/php -y
# Aggiornare la lista dei pacchetti
apt update
Installare PHP 8.3 e le estensioni richieste
apt install -y php8.3 php8.3-fpm php8.3-cli php8.3-common \
php8.3-mysql php8.3-pgsql php8.3-sqlite3 \
php8.3-curl php8.3-gd php8.3-mbstring php8.3-xml \
php8.3-zip php8.3-bcmath php8.3-intl php8.3-readline \
php8.3-tokenizer php8.3-opcache
| Estensione | Utilità |
|---|---|
php8.3-fpm | FastCGI Process Manager (per Nginx) |
php8.3-mysql | Connessione MySQL/MariaDB |
php8.3-curl | Richieste HTTP |
php8.3-gd | Manipolazione delle immagini |
php8.3-mbstring | Stringhe multibyte (UTF-8) |
php8.3-xml | Elaborazione XML |
php8.3-zip | Compressione ZIP |
php8.3-bcmath | Calcoli di precisione |
php8.3-intl | Internazionalizzazione |
Verificare l'installazione
php -v
Risultato atteso :
PHP 8.3.x (cli) (built: ...)
Copyright (c) The PHP Group
Zend Engine v4.3.x, Copyright (c) Zend Technologies
with Zend OPcache v8.3.x, Copyright (c), by Zend Technologies 📦 Passo 3 : Installare Composer
Composer è il gestore di dipendenze PHP, indispensabile per Laravel.
Scaricare e installare Composer
# Scaricare l'installatore
curl -sS https://getcomposer.org/installer -o composer-setup.php
# Installare Composer globalmente
php composer-setup.php --install-dir=/usr/local/bin --filename=composer
# Rimuovere l'installatore
rm composer-setup.php
Verificare l'installazione
composer --version
Risultato atteso :
Composer version 2.x.x 2024-xx-xx xx:xx:xx 🌐 Passo 4 : Installare Nginx
Nginx è un server web performante, ideale per Laravel.
Installare Nginx
apt install -y nginx
Avviare e abilitare Nginx
# Avviare Nginx
systemctl start nginx# Abilitare all'avvio
systemctl enable nginx# Verificare lo stato
systemctl status nginx
Risultato atteso :
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; ...)
Active: active (running) since ...
Testare Nginx
Apri il tuo browser e accedi a http://il-tuo-ip-server. Dovresti vedere la pagina predefinita di Nginx.
🗄️ Passo 5 : Installare MariaDB
MariaDB è un database compatibile con MySQL, performante e open source.
Installare MariaDB
apt install -y mariadb-server mariadb-client
Avviare e abilitare MariaDB
# Avviare MariaDB
systemctl start mariadb# Abilitare all'avvio
systemctl enable mariadb# Verificare lo stato
systemctl status mariadb
Mettere in sicurezza l'installazione
mysql_secure_installation
Rispondi alle domande :
| Domanda | Risposta raccomandata |
|---|---|
| Enter current password for root | Premi Invio (vuoto) |
| Switch to unix_socket authentication | n |
| Change the root password | Y poi inserisci una password forte |
| Remove anonymous users | Y |
| Disallow root login remotely | Y |
| Remove test database | Y |
| Reload privilege tables | Y |
Creare un database per Laravel
# Connettersi a MariaDB
mysql -u root -p
-- Creare il database
CREATE DATABASE laravel CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- Creare un utente
CREATE USER 'laravel_user'@'localhost' IDENTIFIED BY 'LaTuaPasswordSicura123!';
-- Dare i permessi
GRANT ALL PRIVILEGES ON laravel.* TO 'laravel_user'@'localhost';
-- Applicare le modifiche
FLUSH PRIVILEGES;
-- Uscire
EXIT;
📝 Nota : Tieni queste informazioni per la configurazione di Laravel :
- Database :
laravel- Utente :
laravel_user- Password :
LaTuaPasswordSicura123!
🚀 Passo 6 : Installare Laravel 12
Creare la directory del progetto
# Creare la cartella per i siti web
mkdir -p /var/www
# Andare nella directory
cd /var/www
Installare Laravel tramite Composer
composer create-project laravel/laravel iltuosito
💡 Sostituisci
iltuositocon il nome del tuo progetto.
Risultato atteso :
Creating a "laravel/laravel" project at "./iltuosito"
Installing laravel/laravel (v12.x.x)
- Downloading laravel/laravel (v12.x.x)
- Installing laravel/laravel (v12.x.x): Extracting archive
...
Application ready! Build something amazing. Struttura del progetto Laravel
📁 /var/www/iltuosito/
├── 📁 app/ ← Codice dell'applicazione
├── 📁 bootstrap/ ← File di avvio
├── 📁 config/ ← Configurazione
├── 📁 database/ ← Migrazioni e seeds
├── 📁 public/ ← Punto di ingresso web (index.php)
├── 📁 resources/ ← Viste, CSS, JS
├── 📁 routes/ ← Rotte dell'applicazione
├── 📁 storage/ ← File generati, log, cache
├── 📁 tests/ ← Test unitari
├── 📁 vendor/ ← Dipendenze Composer
├── 📄 .env ← Variabili d'ambiente
├── 📄 artisan ← CLI Laravel
└── 📄 composer.json ← Dipendenze del progetto
⚙️ Passo 7 : Configurare Laravel
Configurare il file .env
cd /var/www/iltuosito
nano .env
Modifica le seguenti righe :
APP_NAME="Il Mio Sito Laravel"
APP_ENV=production
APP_DEBUG=false
APP_URL=http://il-tuo-dominio.com
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel_user
DB_PASSWORD=LaTuaPasswordSicura123!
⚠️ Importante : In produzione, imposta
APP_DEBUG=falseper non esporre informazioni sensibili.
Generare la chiave dell'applicazione
php artisan key:generate
Risultato atteso :
INFO Application key set successfully.
Eseguire le migrazioni
php artisan migrate
Risultato atteso :
INFO Running migrations.
2024_01_01_000000_create_users_table ............... 45ms DONE
2024_01_01_000001_create_password_reset_tokens_table 12ms DONE
2024_01_01_000002_create_sessions_table ............ 18ms DONE
...
📁 Passo 8 : Configurare i Permessi
Laravel richiede che alcune cartelle siano accessibili in scrittura.
Definire il proprietario
# Cambiare il proprietario verso l'utente web
chown -R www-data:www-data /var/www/iltuosito
Definire i permessi
# Permessi per le cartelle
find /var/www/iltuosito -type d -exec chmod 755 {} \;
# Permessi per i file
find /var/www/iltuosito -type f -exec chmod 644 {} \;
# Permessi speciali per storage e bootstrap/cache
chmod -R 775 /var/www/iltuosito/storage
chmod -R 775 /var/www/iltuosito/bootstrap/cache
🔧 Passo 9 : Configurare Nginx per Laravel
Creare la configurazione del sito
nano /etc/nginx/sites-available/iltuosito
Incolla la seguente configurazione :
server {
listen 80;
listen [::]:80;
# Sostituisci con il tuo dominio o IP
server_name il-tuo-dominio.com www.il-tuo-dominio.com;
# Radice del sito (cartella pubblica di Laravel)
root /var/www/iltuosito/public;
# File index
index index.php index.html index.htm;
# Codifica
charset utf-8;
# Log
access_log /var/log/nginx/iltuosito.access.log;
error_log /var/log/nginx/iltuosito.error.log;
# Gestione delle richieste
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# File statici
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
# Errore 404 → Laravel
error_page 404 /index.php;
# Elaborazione PHP tramite PHP-FPM
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_hide_header X-Powered-By;
}
# Bloccare l'accesso ai file nascosti
location ~ /\.(?!well-known).* {
deny all;
}
}
Attivare il sito
# Creare un link simbolico
ln -s /etc/nginx/sites-available/iltuosito /etc/nginx/sites-enabled/
# Disabilitare il sito predefinito (opzionale)
rm /etc/nginx/sites-enabled/default
# Testare la configurazione
nginx -t
Risultato atteso :
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Riavviare Nginx
systemctl restart nginx
✅ Passo 10 : Testare l'Installazione
Accedere al sito
Apri il tuo browser e accedi a :
http://il-tuo-ip-server(se non hai un dominio)http://il-tuo-dominio.com(se il dominio è configurato)
Dovresti vedere la pagina iniziale di Laravel :
Verificare la salute dell'applicazione
Laravel 12 include una rotta di health check :
curl http://localhost/up
Risultato atteso : Codice HTTP 200 (OK)
🔒 Passo 11 : Mettere in Sicurezza con HTTPS (Let's Encrypt)
Installare Certbot
apt install -y certbot python3-certbot-nginx
Ottenere un certificato SSL
certbot --nginx -d il-tuo-dominio.com -d www.il-tuo-dominio.com
Segui le istruzioni :
- Inserisci la tua email
- Accetta i termini
- Scegli di reindirizzare HTTP verso HTTPS (raccomandato)
Verificare il rinnovo automatico
certbot renew --dry-run
Risultato atteso :
Congratulations, all simulated renewals succeeded
✅ Il tuo sito è ora accessibile tramite
https://il-tuo-dominio.com
🛠️ Comandi Laravel Utili
Artisan (CLI Laravel)
# Andare nella cartella del progetto
cd /var/www/iltuosito
# Vedere tutti i comandi disponibili
php artisan list
# Svuotare la cache
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
# Ottimizzare per la produzione
php artisan optimize
# Creare un controller
php artisan make:controller NomeController
# Creare un modello con migrazione
php artisan make:model NomeModello -m
# Eseguire le migrazioni
php artisan migrate
# Tornare indietro
php artisan migrate:rollback
# Modalità manutenzione
php artisan down
php artisan up
📊 Ottimizzazione per la Produzione
Ottimizzare Laravel
cd /var/www/iltuosito
# Mettere in cache la configurazione
php artisan config:cache
# Mettere in cache le rotte
php artisan route:cache
# Mettere in cache le viste
php artisan view:cache
# Ottimizzazione globale
php artisan optimize
Configurare OPcache
nano /etc/php/8.3/fpm/conf.d/10-opcache.ini
Aggiungi o modifica :
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.validate_timestamps=0
opcache.save_comments=1
Riavvia PHP-FPM :
systemctl restart php8.3-fpm
🔧 Risoluzione dei Problemi
Errore 500 - Internal Server Error
| ❌ Causa | ✅ Soluzione |
|---|---|
| Permessi errati | chown -R www-data:www-data /var/www/iltuosito |
| Storage non accessibile | chmod -R 775 /var/www/iltuosito/storage |
| Chiave APP_KEY mancante | php artisan key:generate |
| .env mal configurato | Controlla i parametri del database |
# Vedere gli errori Laravel
tail -f /var/www/iltuosito/storage/logs/laravel.log
Errore 502 Bad Gateway
| ❌ Causa | ✅ Soluzione |
|---|---|
| PHP-FPM non avviato | systemctl start php8.3-fpm |
| Socket PHP errato | Controlla /var/run/php/php8.3-fpm.sock |
| Versione PHP errata | update-alternatives --config php |
Errore di connessione al database
| ❌ Causa | ✅ Soluzione |
|---|---|
| MariaDB non avviata | systemctl start mariadb |
| Credenziali errate | Controlla .env (DB_DATABASE, DB_USERNAME, DB_PASSWORD) |
| Database non creato | Crea il database tramite mysql -u root -p |
# Testare la connessione
php artisan tinker
>>> DB::connection()->getPdo();
Pagina bianca
# Attivare il debug temporaneamente
nano /var/www/iltuosito/.env
# Cambiare APP_DEBUG=true
# Svuotare la cache
php artisan cache:clear
php artisan config:clear
# Controllare i log
tail -50 /var/www/iltuosito/storage/logs/laravel.log
📝 Riepilogo dei Comandi
# === AGGIORNAMENTO SISTEMA ===
apt update && apt upgrade -y
# === INSTALLAZIONE PHP 8.3 (Debian 13) ===
apt install -y apt-transport-https lsb-release ca-certificates curl gnupg
curl -fsSL https://packages.sury.org/php/apt.gpg | gpg --dearmor -o /usr/share/keyrings/sury-php.gpg
echo "deb [signed-by=/usr/share/keyrings/sury-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/sury-php.list
apt update
apt install -y php8.3 php8.3-fpm php8.3-cli php8.3-common php8.3-mysql php8.3-curl php8.3-gd php8.3-mbstring php8.3-xml php8.3-zip php8.3-bcmath php8.3-intl
# === INSTALLAZIONE COMPOSER ===
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# === INSTALLAZIONE NGINX ===
apt install -y nginx
systemctl enable nginx && systemctl start nginx
# === INSTALLAZIONE MARIADB ===
apt install -y mariadb-server mariadb-client
systemctl enable mariadb && systemctl start mariadb
mysql_secure_installation
# === CREAZIONE DATABASE ===
mysql -u root -p -e "CREATE DATABASE laravel; CREATE USER 'laravel_user'@'localhost' IDENTIFIED BY 'Password'; GRANT ALL ON laravel.* TO 'laravel_user'@'localhost'; FLUSH PRIVILEGES;"
# === INSTALLAZIONE LARAVEL ===
cd /var/www
composer create-project laravel/laravel monsite
cd monsite
php artisan key:generate
php artisan migrate
# === PERMESSI ===
chown -R www-data:www-data /var/www/monsite
chmod -R 775 /var/www/monsite/storage /var/www/monsite/bootstrap/cache
# === HTTPS (Let's Encrypt) ===
apt install -y certbot python3-certbot-nginx
certbot --nginx -d vostro-dominio.com
🎉 Conclusione
Congratulazioni! Hai installato con successo:
- ✅ PHP 8.3 con tutte le estensioni Laravel
- ✅ Composer 2.x per la gestione delle dipendenze
- ✅ Nginx configurato per Laravel
- ✅ MariaDB con un database dedicato
- ✅ Laravel 12 pronto per la produzione
- ✅ HTTPS con Let's Encrypt (opzionale)
Prossimi passi
- 📖 Consulta la documentazione Laravel
- 🎨 Installa un starter kit:
php artisan breeze:installophp artisan jetstream:install - 📊 Configura le code con Redis o Supervisor
- 📧 Configura l'invio di email (SMTP, Mailgun, ecc.)
