Installare Laravel 13 su un server Debian 13 con nginx
5 capitoli · 1 h 15 · Intermedio · Composer, Debian · verificato il 7 Settembre 2026
Su Debian 13 PHP 8.4 arriva dai repository ufficiali: nessun repository esterno è necessario. Installa PHP e le sue estensioni, poi Composer (verificandone la firma), crea il progetto con composer create-project laravel/laravel, dai i permessi di scrittura a storage/ e bootstrap/cache/, poi punta la root di nginx su public/. Controlla il risultato: la home page deve rispondere 200 e /.env deve rispondere 403.
Questa guida percorre l’installazione completa di un’applicazione Laravel 13 su un server Debian 13, da un sistema vergine fino a una pagina servita da nginx. Ogni passaggio è stato eseguito su un Debian 13 «trixie» pulito il 2 settembre 2026, e il risultato finale verificato: risposta HTTP 200 sulla home page, file .env irraggiungibile dal web.
Articolo del percorso Sviluppo web. Cinque passaggi hanno un capitolo dedicato, elencato nella barra laterale. Quella che segue è la sequenza completa, con il minimo indispensabile per arrivare in fondo.
Cosa serve prima di iniziare
- Un server Debian 13 «trixie» raggiungibile via SSH. Anche Debian 12 va bene, con PHP 8.2.
- Un utente non root con accesso a
sudo. Non installare e non fare deploy da root. - Una macchina di sviluppo dalla tua parte. Su macOS l’intoppo abituale è il comando
laravelche non si trova. - Un nome di dominio che punta al server, se prevedi l’HTTPS.
Crea l’utente che ospiterà l’applicazione, se non l’hai già fatto:
sudo adduser deploy
sudo usermod -aG sudo deploy1. PHP e le sue estensioni
Debian 13 fornisce PHP 8.4, quindi il repository esterno Sury non serve:
sudo apt update
sudo apt install -y php-cli php-fpm \
php-mbstring php-xml php-curl php-zip \
php-bcmath php-intl php-mysql php-sqlite3 \
unzip curl ca-certificates
php -v # PHP 8.4.24Il dettaglio delle estensioni richieste, le impostazioni di php.ini e la procedura per installare un’altra versione di PHP sono nel capitolo dedicato a PHP.
2. Composer
Installalo verificando l’impronta dell’installer, come prescrive la documentazione ufficiale:
EXPECTED="$(curl -sS https://composer.github.io/installer.sig)"
curl -sS https://getcomposer.org/installer -o composer-setup.php
ACTUAL="$(php -r 'echo hash_file("sha384", "composer-setup.php");')"
if [ "$EXPECTED" = "$ACTUAL" ]; then
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer
fi
rm composer-setup.php
composer --version # Composer version 2.10.33. Creare il progetto Laravel
Come utente deploy, mai da root:
su - deploy
composer create-project laravel/laravel /home/deploy/app --no-interaction
cd /home/deploy/app
php artisan --version # Laravel Framework 13.30.1create-project genera il file .env, crea la chiave dell’applicazione ed esegue le migrazioni sul database SQLite di default. Per un database MySQL o MariaDB, la cui installazione ha un capitolo dedicato, compila la connessione e rilancia le migrazioni:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=un_mot_de_passe_solidephp artisan migrate --force4. Permessi sui file
È il passaggio che si salta e che produce la pagina bianca, o un errore 500. Le cartelle interessate corrispondono a storage_path() e bootstrap/cache, descritte in i percorsi dell’applicazione, più database/ finché l’applicazione usa il database SQLite creato all’installazione: il driver di sessione vi scrive a ogni visita. Il server web deve poter scrivere in queste tre cartelle, e solo in queste:
sudo chown -R deploy:www-data /home/deploy/app/storage /home/deploy/app/bootstrap/cache /home/deploy/app/database
sudo chmod -R 775 /home/deploy/app/storage /home/deploy/app/bootstrap/cache /home/deploy/app/databaseSe il progetto vive nella cartella personale di un utente, nginx deve poterla attraversare:
sudo chmod o+x /home/deployÈ il consiglio più diffuso e il più pericoloso: rende l’applicazione modificabile da qualsiasi account del server. 775 con il gruppo giusto basta, ed è quello che è stato usato per la verifica.
5. nginx e PHP-FPM
Questa sezione installa nginx. Se preferisci Apache, più comune sull’hosting condiviso, segui il capitolo dedicato ad Apache: il resto della guida resta valido.
sudo apt install -y nginx php-fpmAnnota il percorso esatto del socket, porta il numero di versione di PHP:
grep -h '^listen' /etc/php/8.4/fpm/pool.d/www.conf
# listen = /run/php/php8.4-fpm.sockCrea il file del sito. La root punta su public/, mai sulla radice del progetto:
server {
listen 80;
server_name exemple.com;
root /home/deploy/app/public;
index index.php;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
location ~ /\.(?!well-known).* {
deny all;
}
}Attiva il sito, disattiva quello di default, controlla la sintassi:
sudo ln -s /etc/nginx/sites-available/laravel /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginxnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful6. Verificare l’installazione
Bastano due controlli per sapere se l’installazione sta in piedi:
curl -s -o /dev/null -w "page d'accueil : %{http_code}\n" http://127.0.0.1/
curl -s -o /dev/null -w ".env : %{http_code}\n" http://127.0.0.1/.envpage d'accueil : 200
.env : 403Il secondo è il più importante. Un 200 su /.env significherebbe che le credenziali del database e la tua APP_KEY sono leggibili da chiunque. A impedirlo è il blocco location ~ /\.(?!well-known).*, ed è per questo che la root del sito deve essere public/.
7. Passare in produzione
La configurazione di sviluppo lascia trapelare informazioni. Tre righe nel .env:
APP_ENV=production
APP_DEBUG=false
APP_URL=https://exemple.comPoi le cache, da rigenerare dopo ogni deploy:
composer install --no-dev --optimize-autoloader
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan about --only=environment # Debug Mode deve mostrare OFFIl dettaglio di questa impostazione è trattato nell’articolo sulla modalità di debug.
Aggiungi l’HTTPS con Certbot, che modifica da sé la configurazione di nginx:
Se l’applicazione espone form pubblici, prevedi anche una protezione contro gli invii automatizzati.
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d exemple.comInfine lo scheduler, se l’applicazione lo usa:
sudo crontab -u deploy -e
# * * * * * cd /home/deploy/app && php artisan schedule:run >> /dev/null 2>&1Per cache, sessioni e code su Redis, prosegui con il capitolo dedicato a Redis.
Errori frequenti
chmod o+x /home/deploy, altrimenti nginx restituisce un errore di permessi.