GNU/Linux >> Linux Esercitazione >  >> Debian

Come installare Nginx con PHP + MySQL (LEMP) su Debian 9

Questo tutorial ti mostrerà l'installazione del server web Nginx su Debian 9 (Stretch). Nginx (pronunciato "engine x") è un server HTTP gratuito, open source e ad alte prestazioni. Nginx è noto per la sua stabilità, il ricco set di funzionalità, la configurazione semplice e il basso consumo di risorse. Questo tutorial mostra l'installazione di Nginx con supporto PHP (tramite PHP-FPM) e MySQL e MariaDB. Questa configurazione viene spesso definita LEMP =L inux + nginx (pronunciato "e motore x") + M ySQL + P HP) .

Nota preliminare

In questo tutorial, utilizzo il nome host server1.example.com con l'indirizzo IP 192.168.1.100. Queste impostazioni potrebbero differire per te, quindi devi sostituirle dove appropriato. Dovresti avere un server Debian 9, userò il server minimo Debian come sistema di base per questo tutorial.

Aggiorna il sistema Debian

Si consiglia di aggiornare gli elenchi dei pacchetti e di installare eventuali aggiornamenti in sospeso prima di iniziare con l'installazione di Nginx. Esegui i seguenti comandi per installare eventuali aggiornamenti in sospeso.

apt-get update
apt-get upgrade -y

Userò l'editor nano in seguito per modificare i file di configurazione. Nano può essere installato con questo comando:

apt-get -y install nano

Installa Nginx

Nginx è disponibile come pacchetto per Debian 9 che può essere installato con questo comando:

apt-get -y install nginx

Ora avvia il server web Nginx:

systemctl start nginx.service

Digita l'indirizzo IP o il nome host del tuo server web in un browser (ad es. http://192.168.1.100) e vedrai la seguente pagina:

La radice del documento nginx predefinita su Debian Linux è /var/www/html.

Installa MySQL o MariaDB

In questo passaggio, ti mostrerò come installare MySQL o MariaDB. Sei libero di scegliere quale sistema di database preferisci. Assicurati solo di installare un solo motore di database e non MySQL e MariaDB insieme.

Installa MySQL

I pacchetti MySQL per Debian 9 possono essere ottenuti direttamente da Oracle. Oracle fornisce un pacchetto di repository MySQL che integra il repository Oracle MySQL in Debian in modo da poter installare e aggiornare MySQL con apt. Ottieni il pacchetto del repository MySQL apt qui nel caso in cui il download di wget di seguito non riesce a causa di modifiche nell'URL di download.

cd /tmp
wget https://dev.mysql.com/get/mysql-apt-config_0.8.9-1_all.deb
dpkg -i mysql-apt-config_0.8.9-1_all.deb

Scegli di configurare "OK" nell'elenco, quindi metti a fuoco il pulsante OK nel piè di pagina e premi Invio. Questo selezionerà la versione stabile corrente, che è MySQL 5.7.

Ora aggiorneremo l'elenco dei pacchetti e installeremo il server MySQL e il pacchetto client.

apt-get update
apt-get -y install mysql-community-client mysql-community-server

Il programma di installazione di MySQL ti chiederà di impostare una password per l'utente root di MySQL. Scegli una password lunga e sicura poiché questa password consente l'accesso amministrativo completo al database MySQL.

Inserisci nuovamente la password come richiesto.

Installa MariaDB

Per installare MariaDB, eseguiamo:

apt-get -y install mariadb-server mariadb-client

A differenza del programma di installazione di MySQL, il programma di installazione di MariaDB non imposterà una password di root durante l'installazione. Per proteggere l'installazione di MariaDB, rimuovere l'utente anonimo e per disabilitare il database di test, eseguire questo comando:

mysql_secure_installation

Rispondi alle domande come segue:

Change the root password? [Y/n] <-- y
New password: <-- Enter a new MySQL root password
Re-enter new password: <-- Repeat the MySQL root password
Remove anonymous users? [Y/n] <-- y
Disallow root login remotely? [Y/n] <-- y
Remove test database and access to it? [Y/n] <-- y
Reload privilege tables now? [Y/n] <-- y

Installazione di PHP

Possiamo far funzionare PHP in nginx tramite PHP-FPM (PHP FastCGI Process Manager). Questa è un'implementazione alternativa di PHP FastCGI con alcune funzionalità aggiuntive utili per siti di qualsiasi dimensione, in particolare per i siti più trafficati. Installa PHP 7 come segue:

apt-get -y install php7.0-fpm

PHP-FPM è un processo demone (con il file dell'unità systemd php7.0-fpm.service) che esegue un server FastCGI sul socket /var/run/php/php7.0-fpm.sock.

Configurazione di Nginx

La configurazione di Nginx è in /etc/nginx/nginx.conf che apriamo ora:

nano /etc/nginx/nginx.conf

La configurazione è facile da capire (puoi saperne di più qui: https://www.nginx.com/resources/wiki/start/topics/examples/full/ e qui:https://www.nginx.com/ risorse/wiki/)

Per prima cosa imposta keepalive_timeout su un valore ragionevole come 2 secondi:

[...]
keepalive_timeout 2;
[...]

Gli host virtuali sono definiti nei contenitori del server {}. Il vhost predefinito è definito nel file /etc/nginx/sites-available/default - modifichiamolo come segue:

nano /etc/nginx/sites-available/default
[...]
server {
listen 80 default_server;
listen [::]:80 default_server;

# SSL configuration
#
# listen 443 ssl default_server;
# listen [::]:443 ssl default_server;
#
# Note: You should disable gzip for SSL traffic.
# See: https://bugs.debian.org/773332
#
# Read up on ssl_ciphers to ensure a secure configuration.
# See: https://bugs.debian.org/765782
#
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
# include snippets/snakeoil.conf;

root /var/www/html;

# Add index.php to the list if you are using PHP
index index.php index.html index.htm index.nginx-debian.html;

server_name _;

location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}

# pass PHP scripts to FastCGI server
#
location ~ \.php$ {
include snippets/fastcgi-php.conf;

# With php-fpm (or other unix sockets):
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
# With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000;
}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
deny all;
}
} [...]

nome del server _; lo rende un vhost catchall predefinito (ovviamente puoi anche specificare un nome host qui come www.example.com).

Ho aggiunto index.php alla riga dell'indice. radice /var/www/html; significa che la radice del documento è la directory /var/www/html.

La parte importante per PHP è la stanza posizione ~ \.php$ {}. Decommentalo come mostrato sopra per abilitarlo. Sono incluse due righe fastcgi_pass, decommenta solo quella per il file php-7.0-fpm.sock.

Ora salva il file e ricarica Nginx:

systemctl reload nginx.service

Quindi apri /etc/php/7.0/fpm/php.ini...

nano /etc/php/7.0/fpm/php.ini

... e imposta cgi.fix_pathinfo=0:

[...]
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
cgi.fix_pathinfo=0
[...]

... quindi potresti voler aumentare il limite POST e il limite di caricamento file:

post_max_size = 25M
upload_max_filesize = 20M

Quando prevedi di caricare file di grandi dimensioni tramite PHP, dovresti aumentare i valori anche a 500 milioni o più. M sta qui per Megabyte.

Infine, potresti voler impostare il fuso orario sul tuo fuso orario locale. Nel mio caso, il fuso orario è:

date.timezone = 'Europe/Berlin'

Puoi trovare l'elenco dei fusi orari supportati qui.

Ricarica PHP-FPM per applicare le modifiche:

systemctl reload php7.0-fpm.service

Ora crea il seguente file PHP nella radice del documento /var/www/html/:

nano /var/www/html/info.php
<?php
phpinfo();

Ora chiamiamo quel file in un browser (es. http://192.168.1.100/info.php):

Come vedi, PHP 7 funziona e funziona tramite FPM/FastCGI, come mostrato nella riga dell'API del server. Se scorri più in basso, vedrai tutti i moduli che sono già abilitati in PHP. MySQL non è elencato lì, il che significa che non abbiamo ancora il supporto MariaDB / MySQL in PHP.

Ottenere il supporto per MySQL/MariaDB in PHP

Per ottenere il supporto MySQL in PHP, possiamo installare il pacchetto php7.0-mysqlnd. È una buona idea installare alcuni altri moduli PHP e potresti averne bisogno per le tue applicazioni. Puoi cercare i moduli PHP disponibili in questo modo:

apt-cache search php7.0

Scegli quelli che ti servono e installali in questo modo:

apt-get -y install php7.0-mysqlnd php7.0-curl php7.0-gd php7.0-intl php-pear php-imagick php7.0-imap php7.0-mcrypt php-memcache php7.0-intl php7.0-pspell php7.0-recode php7.0-sqlite3 php7.0-tidy php7.0-xmlrpc php7.0-xsl

Ora ricarica PHP-FPM:

systemctl reload php7.0-fpm.service

Ora ricarica http://192.168.1.100/info.php nel tuo browser e scorri di nuovo verso il basso fino alla sezione dei moduli. Ora dovresti trovare molti nuovi moduli lì, inclusi il modulo MySQLi e MySQLnd:

Fare in modo che PHP-FPM utilizzi una connessione TCP (opzionale)

Per impostazione predefinita, PHP-FPM è in ascolto sul socket /var/run/php/php7.0-fpm.sock e questo è il modo più rapido e consigliato per connettere PHP a Nginx. Tuttavia, potrebbero esserci configurazioni in cui desideri consentire a Nginx di connettersi a PHP tramite la rete. È possibile fare in modo che PHP-FPM utilizzi una connessione TCP. Per fare ciò, apri /etc/php/7.0/fpm/pool.d/www.conf...

nano /etc/php/7.0/fpm/pool.d/www.conf

... e fai in modo che la linea di ascolto appaia come segue:

[...]
;listen = /var/run/php5-fpm.sock
listen = 127.0.0.1:9000
[...]

Ciò renderà PHP-FPM in ascolto sulla porta 9000 sull'IP 127.0.0.1 (localhost). Assicurati di utilizzare una porta che non è in uso sul tuo sistema.

Quindi ricarica PHP-FPM:

systemctl reload php7.0-fpm.service

Quindi passa attraverso la tua configurazione Nginx e tutti i tuoi vhost e cambia la riga fastcgi_pass unix:/var/run/php7.0-fpm.sock; a fastcgi_pass 127.0.0.1:9000;, ad es. così:

nano /etc/nginx/sites-available/default
[...]
location ~ \.php$ {
include snippets/fastcgi-php.conf;

# With php-fpm (or other unix sockets):
# fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
# With php-cgi (or other tcp sockets):
fastcgi_pass 127.0.0.1:9000;
} [...]

Infine, ricarica Nginx:

systemctl reload nginx.service

Abilita SSL e HTTP/2 in Nginx

La maggior parte dei siti Web oggi utilizza SSL (TLS) per fornire un accesso sicuro. In questo capitolo, ti mostrerò come creare un certificato SSL e come attivare SSL in Nginx. Puoi utilizzare un certificato SSL autofirmato o richiedere un certificato SSL firmato ufficialmente da Let's encrypt. Let#s encrypt I certificati SSL sono disponibili gratuitamente, ma devi avere un nome di dominio valido che punti già al tuo server in DNS. Se non hai ancora un nome di dominio o quando il tuo server è su una rete locale e non è accessibile dall'esterno, usa un certificato SSL autofirmato. Segui i passaggi per un certificato SSL autofirmato o il certificato Let's encrypt di seguito, ma non entrambi.

Crea un certificato SSL autofirmato

Crea il file della chiave SSL con il comando OpenSSL:

openssl genrsa -out /etc/ssl/private/nginx.key 4096

Quindi crea il certificato SSL autofirmato:

openssl req -new -x509 -key /etc/ssl/private/nginx.key -out /etc/ssl/certs/nginx.pem -days 3650

Il comando chiederà dettagli come paese, stato, città, nome dell'azienda e nome di dominio.

Attiva il certificato SSL autofirmato in Nginx. Per farlo, modifica di nuovo il file nginx.conf:

nano /etc/nginx/sites-disponibili/default

e fai in modo che la parte del server assomigli a questa:

server {
listen 80 default_server;
listen [::]:80 default_server;

# SSL configuration

listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;

ssl on;
ssl_certificate_key /etc/ssl/private/nginx.key;
ssl_certificate /etc/ssl/certs/nginx.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;

# Note: You should disable gzip for SSL traffic.
# See: https://bugs.debian.org/773332
#
# Read up on ssl_ciphers to ensure a secure configuration.
# See: https://bugs.debian.org/765782
#
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
# include snippets/snakeoil.conf;

root /var/www/html;

# Add index.php to the list if you are using PHP
index index.php index.html index.htm index.nginx-debian.html;

server_name _;

location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}

# pass PHP scripts to FastCGI server
#
location ~ \.php$ {
include snippets/fastcgi-php.conf;

# With php-fpm (or other unix sockets):
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
# With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000;
}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
deny all;
}
}

Riavvia Nginx per applicare le modifiche.

systemctl restart nginx.service

Ora apri l'URL https del tuo server in un browser, ad es. https://192.169.1.100/. Riceverai un avviso di sicurezza che dovrai accettare per procedere. Successivamente, vedrai la pagina iniziale di Nginx, l'icona di avviso nella barra degli URL del browser indica che utilizziamo un certificato SSL autofirmato.

Utilizza un certificato SSL Let's Encrypt gratuito

In questo capitolo, descriverò come proteggere il tuo server Nginx utilizzando un certificato SSL gratuito Let's encrypt. Un prerequisito è che possiedi un nome di dominio che punti all'IP del server su cui installi Nginx al momento.

Installa Certbot, il client Let's encrypt che viene utilizzato per ottenere un certificato SSL gratuito.

apt-get -y install certbot python-certbot-nginx

Modifica il file di configurazione del sito web /etc/nginx/sites-available/default e imposta i tuoi nomi di dominio nella riga server_name:

nano /etc/nginx/sites-available/default

La riga dovrebbe apparire così dopo la modifica:

server_name example.com;

Sostituisci example.com con il tuo nome di dominio. Se hai più nomi di dominio o sottodomini, aggiungili separati da spazi bianchi.

server_name example.com www.example.com otherdomain.tld;

Ora richiediamo un certificato SSL da Let's encrypt utilizzando il plugin nginx di Certbot.

certbot --nginx -d example.com

È possibile aggiungere più domini ripetendo l'opzione -d. Esempio:

certbot certonly --webroot -d example.com -d www.example.com

Certbot ti chiederà un indirizzo email a cui inviare le notifiche di rinnovo. Inserisci un indirizzo email valido qui:

Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): [email protected]

Accetta i termini della licenza inserendo 'A'.

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: A

Qui l'ulteriore finestra di dialogo che richiede il certificato SSL. Ho aggiunto le mie risposte in rosso.

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for example.com
http-01 challenge for www.example.com
Select the webroot for example.com:
-------------------------------------------------------------------------------
1: Enter a new webroot
-------------------------------------------------------------------------------
Press 1 [enter] to confirm the selection (press 'c' to cancel): 1
Input the webroot for example.com: (Enter 'c' to cancel):/var/www/html
Select the webroot for www.example.com:
-------------------------------------------------------------------------------
1: Enter a new webroot
2: /var/www/html
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Waiting for verification...
Cleaning up challenges
Generating key (2048 bits): /etc/letsencrypt/keys/0000_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0000_csr-certbot.pem
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your cert will
expire on 2018-04-23. To obtain a new or tweaked version of this
certificate in the future, simply run certbot again. To
non-interactively renew *all* of your certificates, run "certbot
renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

Esiste un metodo alternativo utilizzando l'opzione '--nginx' in Certbot, ma questo metodo non sembra funzionare al momento a causa del problema TLS-SNI-01 in Let's encrypt. Il metodo webroot, come mostrato sopra, funziona comunque bene.

Il certificato SSL appena generato si trova in una sottocartella della cartella /etc/letsencrypt/live/. Il percorso esatto viene mostrato nell'output di Certbot.

Ora aggiungeremo questo certificato SSL nel nostro file del sito Web Nginx. Modifica il file predefinito di Nginx:

nano /etc/nginx/sites-available/default

e modifica la sezione SSL in questo modo:

[...]
server {
listen 80 default_server;
listen [::]:80 default_server;

# SSL configuration

listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;

ssl on;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;

# Note: You should disable gzip for SSL traffic.
# See: https://bugs.debian.org/773332
#
# Read up on ssl_ciphers to ensure a secure configuration.
# See: https://bugs.debian.org/765782
#
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
# include snippets/snakeoil.conf;

root /var/www/html;

# Add index.php to the list if you are using PHP
index index.php index.html index.htm index.nginx-debian.html;

server_name _;

location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}

# pass PHP scripts to FastCGI server
#
location ~ \.php$ {
include snippets/fastcgi-php.conf;

# With php-fpm (or other unix sockets):
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
# With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000;
}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
deny all;
}
} [...]

Sostituisci "example.com" nel percorso del certificato SSL con il tuo nome di dominio. Riavvia Nginx per applicare le modifiche.

systemctl restart nginx.service

Immagine della macchina virtuale

Questo tutorial è disponibile come macchina virtuale pronta per l'uso in formato OVA / OVF per gli abbonati Howtoforge. Il formato VM è compatibile con VMWare e Virtualbox e probabilmente con altri strumenti in grado di importare questo formato. Puoi trovare il link per il download nel menu a destra in alto. Fare clic sul nome del file per avviare il download.

I dettagli di accesso della VM sono:

Accesso SSH

Nome utente:amministratore
Password:howtoforge

Esegui 'su' per diventare utente root, anche la password di root è 'howtoforge'.

L'immagine della macchina virtuale utilizza MySQL come server di database.

Accesso MySQL

Nome utente:root
Password:howtoforge

Si prega di modificare le password dopo il primo avvio.

La VM è configurata per l'IP statico 192.168.1.100, l'IP può essere modificato nel file /etc/network/interfaces.

  • nginx:https://nginx.net/
  • PHP:http://www.php.net/
  • MySQL: https://www.mysql.com/
  • MariaDB: https://mariadb.org/
  • Debian:https://www.debian.org/

Debian
  1. Come installare Phorum con Nginx su Debian 9

  2. Come installare e configurare PHP e Nginx (LEMP) su Debian 11

  3. Come installare Magento con Nginx su Debian 10

  4. Come installare WonderCMS con Nginx su Debian 11

  5. Come installare LEMP Stack Nginx, MySQL, PHP su Debian 11

Installa Nginx con PHP e MySQL (LEMP) più SSL su Debian 10

Come installare Nginx con PHP-FPM su Debian 10

Come installare Nginx, MySQL e PHP (LEMP) su Ubuntu 20.04

Come installare phpBB con LEMP (Nginx, MariaDB e PHP) su Debian 11 Bullseye

Come installare phpMyAdmin con Nginx su Debian 11

Come installare lo stack Nginx, MySQL, PHP (LEMP) su un server cloud Debian 8.3