Novità
ItaliaNerd

Registrati gratuitamente per diventare un membro della community ItaliaNerd! Una volta effettuato l'accesso, potrai partecipare a questo sito aggiungendo i tuoi argomenti e post, nonché connetterti con altri membri tramite la tua casella di posta privata! Sentiti libero di utilizzare questo portale come meglio credi, per una breve panoramica dai un'occhiata QUI!

Icona risorsa

Guida Verificata Creare un Server LEMP con SSL

Una guida verificata è stata controllata dallo staff punto per punto e se ne attesta la sua validità.

Introduzione​

In questa guida vediamo come creare uno stack LEMP, ovvero un server linux (Debian o Ubuntu) con tutto l'occorrente per avviare il proprio sito, che sia un CMS o altro. Vedremo come installare il webserver Nginx, il database e una versione appropriata di PHP.

Questa configurazione è comunemente usata in quanto molto leggera, usando il minimo indispensabile per avviare un progetto (anche complesso). Avrete dunque la possibilità di creare un sito discretamente veloce anche se non disponete di un server potente (naturalmente in base al traffico del vostro sito). Non ci soffermeremo molto sulle corrette impostazioni di php (come ad esempio il tuning del php-fpm, necessita di una guida separata!)

Prerequisiti​

  • Un server (VPS o dedicato) con accesso root
  • Un dominio, in quanto useremo un server block in nginx (virtual host)
  • Caffè!

Installazione​

Prima di iniziare, per non appesantire la guida, non tratteremo la messa in sicurezza del vostro server. Potete trovare una guida a riguardo qui:

La guida può essere seguita sia su Debian che su Ubuntu, verranno indicati i pochi passaggi che differiscono.

Intanto, una volta connessi in SSH al nostro server, un bel controllo dei pacchetti non guasta mai, quindi procediamo con
Bash:
sudo apt update && sudo apt upgrade

Nginx​

Installiamo ora il webserver, che possiamo trovare tranquillamente nelle repository
Bash:
sudo apt install nginx
Verrà creato un utente di sistema www-data, lo vedremo dopo.

Dobbiamo ora aprire le porte 80 e 443, necessarie per un sito internet. In realtà la scelta è vostra, se non vi interessa l'ssl potete anche aprire solo la porta 80, viceversa se volete fornire il sito solo in ssl potete anche evitare di aprire la porta 80. Qui le apriamo tutte e 2, poi faremo un bel redirect alla connessione ssl (più pulito e raggiungibile).

Installiamo il firewall UFW
Bash:
sudo apt install ufw
Apriamo prima di tutto la porta SSH, altrimenti non potremo più connetterci alla nostra macchina!
Bash:
sudo ufw allow OpenSSH
Se avete cambiato il numero di porta, il comando da eseguire è
Bash:
sudo ufw allow 12345/tcp
Sostituendo naturalmente 12345 con la porta usata.

e infine abilitiamo il firewall con
Bash:
ufw enable
Possiamo controllare lo stato del firewall con
Bash:
ufw status
Vedremo una schermata simile
1.jpg

Dobbiamo ora aprire le porte necessarie al webserver. Abbiamo 3 scelte:
Bash:
sudo ufw allow 'Nginx Full' <--- Per aprire la porta 80 e 443 (consigliato)
sudo ufw allow 'Nginx HTTP' <--- Per aprire la porta 80
sudo ufw allow 'Nginx HTTPS' <--- Per aprire la porta 443

Possiamo subito verificare la corretta installazione di nginx connettendoci con un browser direttamente all'indirizzo ip della nostra macchina. Il sito sarà raggiungibile (Per il momento solo sulla porta 80).
2.jpg

Mysql​

ATTENZIONE: Dobbiamo ora installare MySql. Su debian, è consigliato usare MariaDB (un fork di MySql). I comandi che seguiranno avranno l'intestazione "mysql", se siete su debian, sostituite semplicemente con "mariadb".

Procediamo con
Bash:
sudo apt install mysql-server
e subito dopo, mettiamo in sicurezza lanciando lo script interattivo
Bash:
sudo mysql_secure_installation (questo comando è identico anche su Debian)
Il consiglio è di rispondere "yes" a tutti i quesiti che seguiranno. Inoltre, impostate una password robusta per l'utente root (attenzione, non si tratta del root di sistema, ma dell'account root del database).

Ricordiamo che se avete disattivato l'accesso remoto, i database creati risponderanno solo all'indirizzo localhost (si può modificare in seguito). Quindi, durante (ad esempio) l'installazione di un CMS quale wordpress, come indirizzo del database dovrete inserire "localhost" o "127.0.0.1".

Creiamo il nostro primo database, entriamo in mysql (o mariadb)
Bash:
sudo mariadb
3.jpg

E creiamo il database "example_database" con
Codice:
CREATE DATABASE example_database;

Ora creiamo un utente "example_user" con "password" e diamogli i permessi sul database appena creato
Codice:
GRANT ALL ON example_database.* TO 'example_user'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
lanciamo poi
Codice:
FLUSH PRIVILEGES;
e usciamo digitando exit.

Testiamo l'accesso digitando
Bash:
mariadb -u example_user -p
e lanciamo
Codice:
SHOW DATABASES;
4.jpg
E anche il database è fatto!

PHP​

Al momento della scrittura di questa guida, le distro prese in esame sono alla versione Debian 11 e Ubuntu 22.04 LTS (Non è consigliato usare distro non LTS).

Mentre ubuntu ha nelle proprie repository le ultime versioni di php, debian è ferma alla 7.4, quindi dobbiamo aggiungere una repository per scaricare la versione di nostro interesse (8.x). Questa è la base della principale differenza tra le due Distro, Ubuntu tende a rendere disponibile quanto prima i nuovi software, debian aspetta prima che un aggiornamento sia "super" testato prima di rilasciarlo nelle proprie repository!

Se usiamo Ubuntu​

Lanciamo direttamente i comandi per scaricare i moduli php di nostro interesse, ad esempio
Bash:
sudo apt install php8.1-fpm php-mysql

Se usiamo Debian​

Dobbiamo prima scaricare alcune dipendenze
Bash:
sudo apt-get install apt-transport-https ca-certificates curl lsb-release software-properties-common wget -y
Aggiungiamo ora la repository
Bash:
curl -sSL https://packages.sury.org/php/README.txt | sudo bash -x  ;  sudo apt update
e procediamo con
Bash:
sudo apt install php8.1-fpm php-mysql

Configurazione​

L'installazione standard di Nginx è pensata per far "girare" un solo sito sul nostro server, ma possiamo facilmente farne girare quanti ne vogliamo grazie ai blocchi server (o i virtual host di apache).

Creiamo il nostro primo blocco per il dominio your_domain:

Creiamo la cartella dove andremo a posizionare i files
Bash:
sudo mkdir /var/www/your_domain
e assegniamo la proprietà all'utente www-data (inserito automaticamente durante l'installazione di nginx)
sudo chown -R www-data:www-data /var/www/your_domain

NOTA: Alcuni CMS richiedo permessi particolari permessi sui propri files (ad esempio 755 o 777). Il comando chmod -R 755 /directory può aiutarci successivamente se necessario.

Ora dobbiamo creare un nuovo file di configurazione per il nostro sito
Bash:
sudo nano /etc/nginx/sites-available/your_domain

Ora, qui possiamo solo procedere con esempi, in quanto la personalizzazione del file dipende esclusivamente dalle vostre esigenze. Bloccare alcune cartelle, le porte da usare, i reindirizzamenti etc dipendono esclusivamente da voi. Una configurazione standard che usa PHP 8.1 (senza modifiche) e disponibile sulla porta 80 può essere la seguente
NGINX:
server {
    listen 80;
    server_name your_domain www.your_domain;
    root /var/www/your_domain;

    index index.html index.htm index.php;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
     }

    location ~ /\.ht {
        deny all;
    }

}
dove sostituiamo server_name your_domain www.your_domain; e root /var/www/your_domain; con il nome del nostro dominio e la cartella che abbiamo creato in precedenza (ovvero /var/www/dominio).

Dobbiamo ora lanciare il seguente comando per attivare il sito
Bash:
sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/
(anche qui facendo le opportune modifiche).

FORTEMENTE consigliato un test della configurazione, con
Bash:
sudo nginx -t
se abbiamo ricevuto il messaggio di ok, riavviamo nginx con
Bash:
sudo systemctl reload nginx

Come test, possiamo creare un file info.php all'interno del nostro sito e verificare che php sia stato caricato correttamente. Per farlo, digitiamo
Bash:
nano /var/www/your_domain/info.php
e all'interno copiamo il seguente codice
PHP:
<?php
phpinfo();

Ora collecandoci al nostro dominio domain.tld/info.php dovremmo vedere una schermata con diverse informazioni relative alla nostra installazione. Naturalmente si consiglia di eliminare il file per evitare che queste informazioni (molto importanti) possano essere lette da terzi.

Consiglio di disattivare il sito web che viene caricato di default una volta conclusa l'installazione di nginx. Per farlo, rimuoviamo semplicemente il file "default" all'interno della directory /etc/nginx/sites-enabled

SSL​

Inserire l'SSL su un'installazione del genere è semplicissimo in quanto il software Certbot è perfettamente integrato con nginx, permettendoci appunto di avere un certificato gratuito con pochissimi comandi!

Installiamo intanto certbot con il modulo nginx
Bash:
sudo apt install certbot python3-certbot-nginx

E procediamo semplicemente creando il certificato per il nostro sito
Bash:
sudo certbot --nginx -d example.com -d www.example.com
Dobbiamo accettare i termini di utilizzo e inserire una mail in modo da essere avvisati in prossimità della scadenza del certificato.

Possiamo anche evitare di inserire la mail inserendo il comando consigliato durante l'emissione del certificato, la scelta è nostra.

I certificati creati hanno una durata di 90 giorni, ma il comando crea automaticamente un cronjob per rinnovarli in automatico in prossimità della scadenza, non dobbiamo occuparci di nulla! Inoltre il file di configurazione di nginx in /etc/nginx/sites-available/domain è stato automaticamente modificato grazie al modulo di integrazione. Consiglio di riaprirlo per capirne il funzionamento e modificarlo a nostro piacimento.

Il file modificato si presenterà grosso modo in questo modo
NGINX:
server {

    root /var/www/domain.tld;
    index index.php index.html index.htm;

    server_name domain.tld www.domain.tld;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
    }

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/domain.tld/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/domain.tld/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot


}
server {
    if ($host = www.domain.tld) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = domain.tld) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    listen [::]:80;

    server_name domain.tld www.domain.tld;
    return 404; # managed by Certbot
}

Ovvero, sono stati inseriti i certificati e i reindirizzamenti permanenti (301) dalla porta 80 alla porta 443 che usa l'SSL.

Termina qui la nostra guida. Avrete capito che lo stack LEMP è uno strumento molto potente, capace di una velocità enorme se configurato correttamente, magari con direttive php adeguate (lo vedremo in un altra guida).

Come sempre, fatemi sapere nei commenti cosa ne pensate!
  • Like
Reazioni: Gzenn
Autore
Anyma
Visite
468
Primo rilascio
Ultimo aggiornamento

Ratings

0.00 stella(e) 0 valutazioni

Più risorse di Anyma

Indietro
Alto