Tutorial · Laravel

Installare Laravel 13 su un server Debian 13 con nginx

5 capitoli · 1 h 15 · Intermedio · Composer, Debian · verificato il 7 Settembre 2026

Risposta rapida

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 laravel che 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:

bash
sudo adduser deploy
sudo usermod -aG sudo deploy

1. PHP e le sue estensioni

Debian 13 fornisce PHP 8.4, quindi il repository esterno Sury non serve:

bash
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.24

Il 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:

bash
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.3

3. Creare il progetto Laravel

Come utente deploy, mai da root:

bash
su - deploy
composer create-project laravel/laravel /home/deploy/app --no-interaction
cd /home/deploy/app
php artisan --version   # Laravel Framework 13.30.1

create-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:

.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=un_mot_de_passe_solide
bash
php artisan migrate --force

4. 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:

bash
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/database

Se il progetto vive nella cartella personale di un utente, nginx deve poterla attraversare:

bash
sudo chmod o+x /home/deploy
Mai chmod -R 777

È 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.

bash
sudo apt install -y nginx php-fpm

Annota il percorso esatto del socket, porta il numero di versione di PHP:

bash
grep -h '^listen' /etc/php/8.4/fpm/pool.d/www.conf
# listen = /run/php/php8.4-fpm.sock

Crea il file del sito. La root punta su public/, mai sulla radice del progetto:

/etc/nginx/sites-available/laravel
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:

bash
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 nginx
code
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

6. Verificare l’installazione

Bastano due controlli per sapere se l’installazione sta in piedi:

bash
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/.env
code
page d'accueil : 200
.env          : 403

Il 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:

.env
APP_ENV=production
APP_DEBUG=false
APP_URL=https://exemple.com

Poi le cache, da rigenerare dopo ogni deploy:

bash
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 OFF

Il 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.

bash
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d exemple.com

Infine lo scheduler, se l’applicazione lo usa:

bash
sudo crontab -u deploy -e
# * * * * * cd /home/deploy/app && php artisan schedule:run >> /dev/null 2>&1

Per cache, sessioni e code su Redis, prosegui con il capitolo dedicato a Redis.

Inizia il tutorial

Errori frequenti

Root di nginx sul progetto invece che su public/ Tutto il codice sorgente, file .env compreso, diventa scaricabile. Verifica sempre che /.env risponda 403.
chmod -R 777 su storage Rende l'applicazione modificabile da qualsiasi account del server. 775 con il gruppo www-data basta.
Composer lanciato con sudo Gli script delle dipendenze girano da root e i file creati diventano non scrivibili dal server web.
Socket PHP-FPM scritto a mano Il percorso contiene il numero di versione: /run/php/php8.4-fpm.sock. Prendilo dal pool invece di ricopiarlo.
Cartella personale non attraversabile Un progetto in /home/deploy richiede chmod o+x /home/deploy, altrimenti nginx restituisce un errore di permessi.
Dimenticare di rigenerare le cache Dopo un deploy vanno rilanciati config:cache, route:cache e view:cache, altrimenti resta attiva la vecchia configurazione.
Newsletter

I nuovi test, tutorial e progetti, via e-mail.

Test riproducibili, codice versionato, risultati datati. Mai spam.