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:![italianerd.com](https://italianerd.com/data/assets/logo/fb.png)
Guida Verificata - [Server] Come proteggere il tuo server Linux
Introduzione In questa breve guida, vediamo come proteggere in modo semplice un server linux, che sia una VPS, un server dedicato, o anche semplicemente il vostro raspberry connesso alla rete. Data l'enormità delle distribuzioni linux con cui è...
![italianerd.com](https://italianerd.com/data/assets/logo/favicon.png)
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
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
Bash:
sudo ufw allow OpenSSH
Bash:
sudo ufw allow 12345/tcp
e infine abilitiamo il firewall con
Bash:
ufw enable
Bash:
ufw status
![1.jpg 1.jpg](https://italianerd.com/data/attachments/0/62-7f2b75d508545604a731913177333dd1.jpg?hash=GZhDDd5UuA)
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 2.jpg](https://italianerd.com/data/attachments/0/63-21a197fe50eba2ddc59a555e6b0cd14e.jpg?hash=xdPR5agTvR)
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
Bash:
sudo mysql_secure_installation (questo comando è identico anche su Debian)
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 3.jpg](https://italianerd.com/data/attachments/0/64-74e7fb72c3bbe153dd0dbf0452b9c4b5.jpg?hash=pzAjZ-BGGq)
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;
Codice:
FLUSH PRIVILEGES;
Testiamo l'accesso digitando
Bash:
mariadb -u example_user -p
Codice:
SHOW DATABASES;
![4.jpg 4.jpg](https://italianerd.com/data/attachments/0/65-67e77bf9ad4a9604f206aa788bb05f66.jpg?hash=TnKIBaBB1U)
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
Bash:
curl -sSL https://packages.sury.org/php/README.txt | sudo bash -x ; sudo apt update
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
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;
}
}
Dobbiamo ora lanciare il seguente comando per attivare il sito
Bash:
sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/
FORTEMENTE consigliato un test della configurazione, con
Bash:
sudo nginx -t
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
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
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!