Blogging · 12 min read · Oct 23, 2025
Come distribuire Ghost Blog con Nginx su Debian 12

Ghost è una piattaforma di blogging open-source che ti aiuta a creare un blog dall’aspetto professionale. È stata lanciata nel 2013 come alternativa a WordPress. È scritta in JavaScript ed è alimentata dalla libreria Node.js.
In questo tutorial, esploreremo come installare Ghost CMS utilizzando Nginx e MySQL su un server alimentato da Debian 12. Utilizzeremo il certificato SSL di Let’s Encrypt per proteggere la nostra installazione.
Prerequisiti
- Un server che esegue Debian 12 con un minimo di 2GB di RAM.
- Un utente non root con privilegi sudo.
- Un Nome di Dominio Completo (FQDN) come
example.comche punta al tuo server. - Assicurati che tutto sia aggiornato.
$ sudo apt update $ sudo apt upgrade - Alcuni pacchetti di cui il tuo sistema ha bisogno.
$ sudo apt install wget curl nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring unzip -yAlcuni di questi pacchetti potrebbero già essere installati sul tuo sistema.
Passo 1 - Configurare il Firewall UFW
Il primo passo è configurare il firewall. Debian viene fornito con ufw (Uncomplicated Firewall) per impostazione predefinita.
Controlla se il firewall è attivo.
$ sudo ufw status
Dovresti ottenere il seguente output.
Status: inactive
Consenti la porta SSH in modo che il firewall non interrompa la connessione attuale quando viene abilitato.
$ sudo ufw allow OpenSSH
Consenti anche le porte HTTP e HTTPS.
$ sudo ufw allow http
$ sudo ufw allow https
Abilita il Firewall
$ sudo ufw enable
Il comando potrebbe interrompere le connessioni ssh esistenti. Procedere con l'operazione (y|n)? y
Il firewall è attivo e abilitato all'avvio del sistema
Controlla di nuovo lo stato del firewall.
$ sudo ufw status
Dovresti vedere un output simile.
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
Passo 2 - Installare Nginx
Debian 12 viene fornito con una versione più vecchia di Nginx. Per installare l’ultima versione, è necessario scaricare il repository ufficiale di Nginx.
Importa la chiave di firma di Nginx.
$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
Aggiungi il repository per la versione stabile di Nginx.
$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/debian `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
Aggiorna i repository di sistema.
$ sudo apt update
Installa Nginx.
$ sudo apt install nginx
Verifica l’installazione. Il sudo è necessario per eseguire il comando su Debian.
$ sudo nginx -v
nginx version: nginx/1.24.0
Avvia il server Nginx.
$ sudo systemctl start nginx
Passo 3 - Installare Node.js
Ghost Installer ha bisogno di Nodejs per funzionare. Il primo passo è importare la chiave GPG di Nodesource.
$ curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/nodesource.gpg
Successivamente, crea il file del repository Nodesource. Installeremo Node 18x che è l’attuale versione LTS (Long Term Support) che Ghost raccomanda.
$ NODE_MAJOR=18
$ echo "deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
Aggiorna l’elenco dei repository di sistema.
$ sudo apt update
Installa Node.
$ sudo apt install nodejs -y
Conferma l’installazione di Node.
$ node --version
v18.18.2
Passo 4 - Installare MySQL utilizzando Docker
Debian non fornisce più MySQL. Invece, fornisce MariaDB. Ghost supporta solo MySQL. Puoi modificare Ghost per funzionare con MariaDB, ma non è raccomandato. Poiché i repository ufficiali di MySQL non sono stati aggiornati per Debian 12 al momento della scrittura di questo tutorial, lo installeremo utilizzando Docker.
Importa la chiave GPG di Docker.
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg
Crea un file di repository Docker.
$ echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/debian \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Aggiorna l’elenco dei repository di sistema.
$ sudo apt update
Installa Docker e Docker Compose.
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Per impostazione predefinita, Docker richiede privilegi di root. Se vuoi evitare di usare sudo ogni volta che esegui il comando docker, aggiungi il tuo nome utente al gruppo docker.
$ sudo usermod -aG docker $(whoami)
Dovrai disconnetterti dal server e riconnetterti come lo stesso utente per abilitare questa modifica o utilizzare il seguente comando.
$ su - ${USER}
Conferma che il tuo utente è stato aggiunto al gruppo Docker.
$ groups
navjot wheel docker
Ora che Docker è installato, dobbiamo creare un file di composizione Docker per MySQL. Crea una directory per Docker di MySQL.
$ mkdir ~/mysql
Crea e apri il file docker-compose.yml per la modifica.
$ nano docker-compose.yml
Incolla il seguente codice in esso.
services:
database:
image: container-registry.oracle.com/mysql/community-server:latest
container_name: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_USER: ghost
MYSQL_PASSWORD: ghostpassword
MYSQL_DATABASE: ghostdb
ports:
- "3306:3306"
volumes:
- ./mysql:/var/lib/mysql
Salva il file premendo Ctrl + X e inserendo Y quando richiesto.
Qui abbiamo impostato la password di root e le credenziali MySQL per il database Ghost. Questi verranno creati quando il contenitore verrà eseguito.
Avvia il contenitore MySQL.
$ docker compose up -d
Controlla lo stato del contenitore Docker.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ec42fb205f1e container-registry.oracle.com/mysql/community-server:latest "/entrypoint.sh mysq…" 4 seconds ago Up 2 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060-33061/tcp mysql
Ghost può connettersi al contenitore MySQL utilizzando la porta 3306 ed eseguire operazioni su di esso.
Passo 5 - Installare Ghost
Possiamo installare Ghost anche utilizzando Docker, il che può semplificare le cose, ma non lo faremo qui.
L’installazione di Ghost comprenderà tre componenti - lo strumento da riga di comando Ghost-CLI che installa e gestisce gli aggiornamenti del blog Ghost e il pacchetto del blog stesso.
Installare Ghost-CLI
Esegui il seguente comando per installare lo strumento Ghost-CLI.
$ sudo npm install ghost-cli@latest -g
Preparare la Directory di Ghost
Crea la directory principale di Ghost.
$ sudo mkdir -p /var/www/html/ghost
Imposta la proprietà della directory all’utente corrente.
$ sudo chown $USER:$USER /var/www/html/ghost
Imposta i permessi corretti per la directory.
$ sudo chmod 755 /var/www/html/ghost
Passa alla directory di Ghost.
$ cd /var/www/html/ghost
Installare Ghost
Installare Ghost è un processo con un singolo comando.
$ ghost install
Durante l’installazione, lo strumento CLI farà diverse domande per configurare il blog.
- URL del Blog: Inserisci il tuo URL completo del blog insieme al protocollo https. (
https://example.com) - Nome Host MySQL: Premi Invio per utilizzare il valore predefinito di
localhostpoiché la nostra installazione di Ghost e MySQL sono sullo stesso server. - Nome Utente MySQL: Inserisci
ghostcome nome utente MySQL. - Password MySQL: Inserisci la tua password di root creata prima nel file docker.
- Nome del database Ghost: Inserisci il nome del database (
ghostdb) configurato nel file docker. - Password Sudo: Ti verrà chiesta la tua password sudo per eseguire attività amministrative.
- Configurare Nginx? Di solito, Ghost-CLI rileva la tua installazione di Nginx e la configura automaticamente per il tuo blog. Ma questo funziona solo per Nginx installato utilizzando il pacchetto OS. Poiché lo abbiamo installato utilizzando il repository di Nginx, Ghost non può rilevarlo e lo salterà automaticamente.
- Configurare SSL?: Poiché ha saltato la configurazione di Nginx, lo strumento CLI salterà anche la configurazione di un SSL.
- Configurare systemd?: Ghost chiederà se vuoi impostare un servizio di sistema per Ghost. Premi Y per procedere.
- Avviare Ghost?: Premi Y per avviare la tua installazione di Ghost. Tuttavia, non funzionerà perché Nginx e SSL non sono ancora configurati.
Passo 6 - Installare SSL
Prima di procedere, dobbiamo installare lo strumento Certbot e installare un certificato SSL per il nostro dominio.
Per installare Certbot, utilizzeremo l’installer di pacchetti Snapd. Snapd porta sempre l’ultima versione stabile di Certbot. Tuttavia, Debian non viene fornito con Snapd installato. Installalo prima.
$ sudo apt install snapd
Assicurati che la tua versione di snapd sia aggiornata.
$ sudo snap install core
$ sudo snap refresh core
Installa Certbot.
$ sudo snap install --classic certbot
Usa il seguente comando per assicurarti che il comando Certbot possa essere eseguito creando un collegamento simbolico alla directory /usr/bin.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Verifica l’installazione.
$ certbot --version
certbot 2.7.1
Genera un certificato SSL.
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d example.com
Il comando sopra scaricherà un certificato nella directory /etc/letsencrypt/live/example.com sul tuo server.
Genera un certificato di gruppo Diffie-Hellman.
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Controlla il servizio di pianificazione del rinnovo di Certbot.
$ sudo systemctl list-timers
Troverai snap.certbot.renew.service come uno dei servizi programmati per l’esecuzione.
NEXT LEFT LAST PASSED UNIT ACTIVATES
Tue 2023-10-17 00:00:00 UTC 14h left Mon 2023-10-16 00:00:18 UTC 9h ago dpkg-db-backup.timer dpkg-db-backup.service
Mon 2023-10-16 19:12:00 UTC 9h left Mon 2023-10-16 07:27:11 UTC 2h 17min ago snap.certbot.renew.timer snap.certbot.renew.service
Mon 2023-10-16 20:49:14 UTC 11h left Mon 2023-10-16 07:48:12 UTC 1h 56min ago apt-daily.timer apt-daily.service
Fai una prova del processo per controllare se il rinnovo SSL funziona correttamente.
$ sudo certbot renew --dry-run
Se non vedi errori, sei a posto. Il tuo certificato si rinnoverà automaticamente.
Passo 7 - Configurare Nginx
Crea e apri il file /etc/nginx/conf.d/ghost.conf per la modifica.
$ sudo nano /etc/nginx/conf.d/ghost.conf
Incolla il seguente codice nel file ghost.conf. Sostituisci tutte le istanze di example.com con il tuo dominio.
server {
listen 80;
listen [::]:80;
server_name example.com;
location / {
return 301 https://$server_name$request_uri;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com;
access_log /var/log/nginx/ghost.access.log;
error_log /var/log/nginx/ghost.error.log;
client_max_body_size 20m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
resolver_timeout 2s;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:2368;
}
}
La configurazione sopra reindirizzerà tutte le richieste HTTP a HTTPS e fungerà da proxy per il servizio Ghost per servirlo tramite il tuo dominio.
Salva il file premendo Ctrl + X e inserendo Y quando richiesto.
Apri il file /etc/nginx/nginx.conf per la modifica.
$ sudo nano /etc/nginx/nginx.conf
Aggiungi la seguente riga prima della riga include /etc/nginx/conf.d/*.conf;.
server_names_hash_bucket_size 64;
Salva il file premendo Ctrl + X e inserendo Y quando richiesto.
Verifica la tua configurazione Nginx.
$ sudo nginx -t
Se non vedi errori, significa che sei a posto. Riavvia il server Nginx per applicare la configurazione.
$ sudo systemctl restart nginx
Passo 9 - Esegui il Sito
Ora puoi verificare la tua installazione aprendo https://example.com nel tuo browser. Otterrai la seguente pagina che indica un’installazione riuscita.

Passo 10 - Completa la Configurazione
Per completare la configurazione del tuo blog Ghost, visita https://example.com/ghost nel tuo browser. L’extra /ghost alla fine del dominio del tuo blog ti reindirizza al Pannello di Amministrazione di Ghost o in questo caso alla configurazione poiché lo stai accedendo per la prima volta.
Qui, ti verrà chiesto di creare il tuo account Amministratore e scegliere un titolo per il blog.

Inserisci i tuoi dettagli e fai clic sul pulsante Crea account e inizia a pubblicare per procedere.
Successivamente, verrai portato alla seguente schermata dove ti vengono date opzioni come scrivere il tuo primo post, personalizzare il tuo sito e importare membri.

Sceglieremo Esplora l’amministrazione di Ghost per esplorare e andare direttamente al dashboard. Alla fine della configurazione, verrai accolto con il pannello di amministrazione di Ghost.

Se desideri passare alla modalità scura, puoi farlo facendo clic sull’interruttore accanto al pulsante delle impostazioni in basso nella pagina delle impostazioni.
Vedrai un post predefinito. Puoi dispubblicarlo o eliminarlo e iniziare a pubblicare.

Passo 11 - Configurare il Mailer
Ghost non solo funge da piattaforma di blogging, ma anche da gestore di newsletter. Per le operazioni quotidiane, puoi utilizzare qualsiasi servizio di posta transazionale per lavorare con Ghost per inviare email. Ma se desideri inviare newsletter tramite Ghost, l’unico servizio di email di massa ufficialmente supportato è Mailgun. Puoi utilizzare anche un altro servizio di newsletter, ma per questo dovrai utilizzare la funzione di integrazione Zapier di Ghost.
Prima configuriamo un servizio SMTP per le email transazionali. Per questo, apri il file /var/www/html/ghost/config.production.json per la modifica.
$ nano /var/www/html/ghost/config.production.json
Trova le seguenti righe.
"mail": {
"transport": "Direct"
},
Sostituiscile con il seguente codice.
"mail": {
"from": "'Supporto HowtoForge' [email protected]",
"transport": "SMTP",
"options": {
"host": "YOUR-SES-SERVER-NAME",
"port": 465,
"service": "SES",
"auth": {
"user": "YOUR-SES-SMTP-ACCESS-KEY-ID",
"pass": "YOUR-SES-SMTP-SECRET-ACCESS-KEY"
}
}
},
Qui stiamo utilizzando il servizio di posta Amazon SES poiché è conveniente e non richiede costi mensili.
Salva il file premendo Ctrl + X e inserendo Y quando richiesto. Una volta terminato, riavvia l’applicazione Ghost affinché le modifiche abbiano effetto.
$ ghost restart
Per configurare le impostazioni della newsletter, visita la sezione Impostazioni >> Newsletter email.

Fai clic sul collegamento Configurazione Mailgun per espandere.
Compila la tua Regione Mailgun, dominio e chiave API.

Fai clic sul pulsante Salva in alto a destra per salvare le impostazioni.
Per testare la consegna della newsletter, crea un nuovo post di prova, premi pubblica e seleziona l’opzione Solo email. Se desideri pubblicare anche il post, seleziona l’opzione Pubblica e invia email.

Fai clic sul pulsante Continua, revisione finale per procedere. La pagina successiva chiederà nuovamente conferma finale.

Fai clic sul pulsante Invia email, subito per inviare la newsletter. Riceverai il seguente messaggio una volta inviata l’email.

Controlla la tua email per il post.

Passo 12 - Aggiornare Ghost
Ci sono due tipi di aggiornamenti di Ghost - aggiornamenti minori e aggiornamenti maggiori.
Per prima cosa, esegui un backup completo se desideri eseguire un aggiornamento minore. Crea un backup di tutti i post, membri, temi, immagini, file e file di reindirizzamento.
$ cd /var/www/html/ghost
$ ghost backup
Esegui il comando di aggiornamento per eseguire l’aggiornamento minore.
$ ghost update
Per eseguire un aggiornamento maggiore, dovresti seguire la guida ufficiale dettagliata per l’aggiornamento su Ghost. A seconda della versione attuale e della versione maggiore a cui desideri aggiornare, i passaggi varieranno.
Conclusione
Questo conclude il nostro tutorial su come impostare Ghost CMS sul tuo server Debian 12 utilizzando Nginx. Se hai domande o feedback, condividili nei commenti qui sotto.
Ricevi i nuovi post nella tua casella di posta.
Nessuno spam. Disiscriviti in qualsiasi momento.