Installare un ambiente LAMP: Linux, Apache2, SSL, MySQL, PHP5 - Stretch

Da Guide@Debianizzati.Org.

Debian-swirl.png Versioni Compatibili
Debian 9 "Stretch"

Indice

Introduzione

LAMP è un acronimo che indica un ambiente server in cui siano installati Linux, Apache, MySQL e PHP. In questa guida vedremo come installare un server Apache2 su Debian Lenny, come configurare il modulo SSL e come fornire supporto per il linguaggio di scripting PHP5 e i database basati su MySQL.
In tutta la guida assumeremo che il nome del server Debian sia demo e il suo indirizzo IP sia 123.45.67.890. Questi valori vanno ovviamente sostituiti con quelli del vostro ambiente di lavoro.

Installazione di Apache2

Installare il web server Apache2 su Debian è un'operazione molto semplice:

# apt install libexpat1 apache2 apache2-doc apache2-utils libapache2-mod-php libapache2-mod-fcgid apache2-suexec-pristine mcrypt  imagemagick libruby libapache2-mod-python memcached libapache2-mod-passenger certbot

Se notaste, all'avvio del web server, il messaggio di avvertimento:

apache2: Could not reliably determine the server's fully qualified domain name,
using 127.0.0.1 for ServerName

Per eliminarlo è sufficiente aprire il file:

# nano /etc/apache2/conf-available/fqdn.conf

e aggiungere la direttiva:

ServerName demo

e abilitare la configurazione:

# a2enconf fqdn
# systemctl restart apache2.service

Abilitate alcuni comodi moduli aggiuntivi:

# a2enmod expires
# a2enmod suexec rewrite ssl actions include dav_fs dav auth_digest cgi headers status info

Quindi riavviate Apache2 per fargli digerire le modifiche:

# systemctl restart apache2

A questo punto aprite il vostro browser preferito e navigate verso l'indirizzo http://123.45.67.890. Sarete accolti dalla pagina di benvenuto del vostro web server: It Works!

Configurazione di SSL

Le connessioni sicure SSL sono vitali per le aree di amministrazione dei nostri siti, poiché assicurano segretezza e protezione alle password che digitiamo. In questa sezione vedremo come configurare un certificato auto-firmato e come creare un virtual host sulla porta https (443) per le nostre connessioni.
NOTA: i certificati auto-firmati, poiché non verificati da un'autorità internazionale, generano nel browser un messaggio di avvertimento. Per questo motivo sono adatti in ambienti intranet o su server dove il traffico https serve solo per amministrazione e non per fornire servizi a utenti esterni.

Installazione

Creiamo innanzitutto una directory dove archiviare i nostri certificati:

# mkdir /etc/apache2/ssl

Quindi creiamo i nostri certificati:

# openssl req -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem

L'output iniziale del comando sarà:

Generating a 1024 bit RSA private key
...........++++++
...........++++++
writing new private key to '/etc/apache2/ssl/apache.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----

e poi ci verrà posta una serie di domande:

Country Name (2 letter code) [AU]: IT
State or Province Name (full name) [Some-State]: Lodi
Locality Name (eg, city) []: S. Angelo Lodigiano
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Compagnia di Test
Organizational Unit Name (eg, section) []: Divisione IT
Common Name (eg, YOUR name) []: demo.dominio.local
Email Address []: webmaster@dominio.local

Rispondete ovviamente inserendo i parametri più adatti al vostro caso.
Adesso che abbiamo i certificati piazzati al loro posto non dobbiamo far altro che abilitare Apache mod_ssl e, già che ci siamo, alcuni altri moduli utili:

# a2enmod ssl
# a2enmod rewrite
# a2enmod suexec
# a2enmod include

Configurazione dei Virtual Host

Iniziamo con il creare un file di testo che specifichi il nostro Virtual Host SSL:

# nano /etc/apache2/sites-available/default-ssl.conf

e configuriamolo come segue:

NameVirtualHost *:443
<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile    /etc/apache2/ssl/apache.pem
    SSLCertificateKeyFile /etc/apache2/ssl/apache.pem

    ServerAdmin admin@dominio.org
    ServerName server.dominio.org

    ErrorLog /var/log/apache2/error_ssl.log
    LogLevel warn
    CustomLog /var/log/apache2/access_ssl.log combined
    ServerSignature On
    DocumentRoot /var/www/apache2-default

    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/apache2-default>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        
        # Fino a Debian Wheezy
        #Order allow,deny
        #allow from all

        # Da Debian Jessie
        Require all granted

    </Directory>

    ScriptAlias /cgi-local/ /var/www/apache2-default/cgi-bin/
    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
 
    <Directory "/var/www/apache2-default/cgi-bin">
         AllowOverride None
         Options None
         Require all granted

    </Directory>

    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options None
        Require all granted

    </Directory>

    Alias /icons/ "/usr/share/apache2/icons/"
    Alias /manual/ "/usr/share/doc/apache2-doc/manual/"
   
    <Directory "/usr/share/apache2/icons">
        Options Indexes MultiViews
        AllowOverride None
        Require all granted

    </Directory>
</VirtualHost>

NOTE

1) la DocumentRoot è /var/www/html/

2) il controllo degli accessi Rule-Based prevede una configurazione differente:

Order deny,allow
Deny from all
modificare in
Require all denied


Order allow,deny
Allow from all
modificare in
Require all granted


Apache non è in ascolto sulla porta 443, quella normalmente utilizzata da apache-ssl, e quindi lo dobbiamo istruire modificando il file /etc/apache2/ports.conf aggiungendo la riga:

Listen 443

Come ultima cosa, importantissima, bisogna attivare il sito che abbiamo appena creato (sempre utilizzando i comodi comandi che Apache2 ci mette a disposizione). Sarà quindi sufficiente un:

# a2ensite default-ssl

senza includere l'estensione ".conf". discussione

Un riavvio di Apache2 caricherà la nuova configurazione:

# systemctl reload apache2

Installazione di PHP7

Per avere il supporto a PHP7 è sufficiente installare il linguaggio di scripting e il relativo modulo di supporto ad Apache2:

# apt install php libapache2-mod-php php7.0 php7.0-common php7.0-gd php7.0-mysql php7.0-imap php7.0-cli php7.0-cgi php-pear php7.0-mcrypt imagemagick php7.0-curl php7.0-intl php7.0-pspell php7.0-recode php7.0-sqlite3 php7.0-tidy php7.0-xmlrpc php7.0-xsl php-memcache php-imagick php-gettext php7.0-zip php7.0-mbstring php7.0-soap php7.0-fpm php7.0-opcache php-apcu

A questo punto un riavvio di Apache è sufficiente:

# systemctl reload apache2


Su tutte le Debian c’è una correzione al volo da fare al file php.ini. Il problema è dovuto al parametro:

memory_limit = -1

Visto così sembrerebbe un flag disabilitato e ci aspetteremmo quindi che non ci sia alcun limite nella memoria allocabile, invece il comportamento è tutt’altro:

PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted (tried to allocate 64 bytes) in /var/www/clients/client21/web54/web/XXXXXX.php on line 212

Per ovviare al problema, è bene specificare quale effettivamente è il limite di memoria che intendiamo imporre ad uno script php eseguito da linea di comando. Il parametro si trova nel file:

/etc/php/7.0/cli/php.ini

E la modifica da effettuare è la seguente:

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
;memory_limit = -1
memory_limit = 128M

Potrebbe essere utile aumentare il valore dei dati POST caricabili attraverso script PHP. In questo caso occorre modificare il file di configurazione di Apache:

# nano /etc/apache2/apache2.conf

aggiungendo la sezione

<Files *.php>
    # Da Debian Wheezy
    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps
    
    # Fino a Debian Squeeze
    #SetOutputFilter PHP
    #SetInputFilter PHP
    
    LimitRequestBody 524288
</Files>

e riavviando il server:

# systemctl reload apache2

Messa in sicurezza di PHP

Modifichiamo il file:

# nano /etc/php/7.0/apache2/conf.d/99_security.ini

con questi valori:

allow_url_include = Off
allow_url_fopen = Off
session.use_only_cookies = 1
session.cookie_httponly = 1
expose_php = Off
display_errors = Off
register_globals = Off
disable_functions = shell_exec, escapeshellarg, escapeshellcmd, passthru, proc_close, proc_get_status, proc_nice, proc_open,proc_terminate

e riavviamo Apache:

# systemctl restart apache2.service

Test della configurazione

Prima di procedere è una buona idea verificare che tutto ciò che abbiamo fatto funzioni realmente. Per questo utilizziamo il metodo phpinfo di PHP5 caricandolo in una pagina di test. Partiamo col creare il file della pagina di test:

# nano -w /var/www/html/test.php

Quindi riempiamolo in questo modo:

<html>
<head>
<title> PHP Test Script </title>
</head>
<body>
<?php
phpinfo( );
?>
</body>
</html>

salviamo il file e richiamiamolo nel nostro browser: http://123.45.67.890/test.php. Se tutto è andato per il verso giusto vi troverete davanti a una schermata di riepilogo delle funzionalità abilitate di PHP5.

Installazione di PHP 5.6

Potrebbe essere necessario installare una vecchia versione di PHP affiancata a quella ufficiale presente in Stretch, ad esempio perchè alcuni siti presenti sul nostro server non girano correttamente con PHP 7.0.
Debian Stretch offre nei repository ufficiali solo la versione 7.0 di PHP, ma possiamo utilizzare i pacchetti .deb messi a disposizione direttamente dal maintainer dei pacchetti PHP di Debian, Ondřej Surý.
Aggiungiamo il suo repository al nostro sources.list:

# apt-get install apt-transport-https
# curl https://packages.sury.org/php/apt.gpg | apt-key add -
# echo 'deb https://packages.sury.org/php/ stretch main' > /etc/apt/sources.list.d/deb.sury.org.list
# apt-get update

E installiamo PHP 5.6:

# apt-get install php5.6-cli php5.6-fpm

Verifichiamo che tutto sia a posto:

# php7.0 -v
PHP 7.0.15-1 (cli)
# php5.6 -v
PHP 5.6.30-5+0~20170223133422.27+stretch~1.gbp1ee0cb (cli)

La versione predefinita è rimasta la 7.0, come possiamo facilmente constatare:

# php -v
PHP 7.0.15-1 (cli)

ma possiamo cambiarla in maniera molto veloce:

# update-alternatives --config php

Installazione di MySQL

L'installazione del RDBM MySQL è semplice:

# apt install mysql-server mysql-client

Al termine dell'installazione occorrerà impostare la password di amministratore di MySQL (che è chiamato root ma è diverso dall'utente root del server Debian):

mysql -u root
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('LAMIAPASSWORD');

La password che sceglierete sarà valida sia per l'utente MySQL root@localhost sia per l'utente root@demo.
Mettiamo in sicurezza l'installazione di MySQL avviando il tool apposito:

# mysql_secure_installation

e rispondendo alle domande autoesplicative.

Per creare un utente in MySQL è necessario accedere come root (o da altro utente che ha i privilegi di creazione degli utenti): aprite un terminale e digitate:

# mysql -uroot -p

Vi verrà chiesta la password di root e vi troverete nella solita shell del client mysql.
A questo punto bisognerà creare l’utente e dargli i permessi sul database. Per fare ciò digitate nella shell di MySQL:

GRANT ALL PRIVILEGES ON nome_db.* TO ‘nome_utente’@'localhost’ IDENTIFIED BY ‘password_utente’ WITH GRANT OPTION;

L'interfaccia phpMyAdmin

Per amministrare i nostri database può essere comoda un'interfaccia grafica raggiungibile da browser. A questo scopo installiamo phpMyAdmin (e adminer, un'interfaccia semplificata):

# apt install phpmyadmin adminer

Durante l'installazione vi verrà chiesto di indicare il web server in esecuzione sulla vostra machina. Indicate apache2:

Web server to reconfigure automatically: <-- apache2

Con le ultime versioni di MySQL è cambiato il metodo di autenticazione; ora l'utente root utilizza di default lo UNIX auth_socket plugin al posto della tabella utenti di MySQL.
Questo comporta che i tentativi di login in PHPMyAdmin utilizzando l'utente root terminano tutti con un errore:

 #1698 - Access denied for user 'root'@'localhost'

dal momento che PHPMyAdmin cerca di autenticarsi sulla tabella userd del database di MySQL.
Per risolvere questo problema è sufficiente aggiungere un nuovo utente "amministratore" in MySQL e utilizzare quello per le future connessioni tramite PHPMyAdmin:

# apt-get install mcrypt
# mysql -uroot -p
CREATE USER 'sqlroot'@'localhost' IDENTIFIED BY 'LaMiaPassword';
GRANT ALL PRIVILEGES ON *.* TO 'sqlroot'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;

A questo punto lanciate il browser su http://123.45.67.890/phpmyadmin e fate login con le credenziali inserite poco fa.

Info.png Nota
È possibile che la pagina di autenticazione di phpmyadmin non venga caricata, in tal caso provare a riavviare manualmente apache.


Poiché la password di login su phpmyadmin viaggia in chiaro, può essere una buona cosa forzare il servizio phpmyadmin a restare in ascolto solo sul protocollo HTTPS, creando una riscrittura automatica dell'indirizzo HTTP verso il

# nano /etc/phpmyadmin/apache.conf

e aggiungendo all'inizio del file le righe:

<IfModule mod_rewrite.c>
<IfModule mod_ssl.c>
<Location /phpmyadmin>
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/phpmyadmin [R]
</Location>
</IfModule>
</IfModule>

# Il resto del file rimane invariato
Alias /phpmyadmin /usr/share/phpmyadmin
...

Da adesso, anche digitando http://123.45.67.890/phpmyadmin, sarete rigirati verso l'equivalente pagina HTTPS.

Sicurezza della configurazione e prestazioni del server

Di seguito alcune guide specifiche per migliorare la protezione e le prestazioni del server Apache appena installato:

Non sono impostazioni necessarie per il corretto funzionamento di Apache, ma sono fortemente consigliate.

Note e changelog

Da Debian Jessie è stato introdotto Apache 2.4 al posto del 2.2, e anche il sistema di configurazione è cambiato leggermente.
Invece della directory /etc/apache2/conf.d/ abbiamo /etc/apache2/conf-enabled/ che contiene dei link a /etc/apache2/conf-available/.
I file di configurazione in /etc/apache2/sites-enabled/ devono terminare con l'estensione .conf.
La direttiva NameVirtualHost *:80 e analoga per la porta 443 non serve più.
Una directory pubblicata tramite Alias deve avere l'opzione Require all granted altrimenti ogni tentativo di accedere al suo contenuto risulta in un errore AH01630: client denied by server configuration.

Una delle modifiche classiche da fare è la seguente:

# Configuration for Apache 2.2
Order allow,deny
Allow from all
# Configuration for Apache 2.4 with mod_authz_host.
Require all granted

In maniera analoga per negare ogni richiesta:

# Configuration for Apache 2.2
Order deny,allow
Deny from all
# Configuration for Apache 2.4 with mod_authz_host.
Require all denied

Un controllo di accesso basato sull'indirizzo IP è fatto in questo modo:

Require local
Require ip 127.0.0.0/8 ::1 185.21.73.97 10.0.1.0/24

Un'altro cambiamento non da poco è la direttiva AllowOverride, che adesso ha valore predefinito None. Questo significa ad esempio che tutti i file .htaccess smettono di funzionare!

Apache2: layout di configurazione

Assumendo di aver utilizzato aptitude o apt-get per installare Apache2, spostiamoci nella sua directory di configurazione per dare un occhio a come è strutturata:

# cd /etc/apache2
# ls

conf

In Apache 2.4, due nuove directory, conf-available e conf-enabled hanno sostituito la vecchia directory di configurazione conf.d/.
i file di configurazione dei vari moduli di Apache si trovano nella directory conf-available. Per attivare un particolare modulo occorre creare un symbolic link verso la directory conf-enabled e riavviare Apache2.

sites-available

Questa directory conterrà i file con le configurazioni di ogni sito (conosciuti come virtual hosts) che vorrete servire con Apache. Uno sguardo alla directory:

ls sites-available/
...
000-default.conf  default-ssl.conf

ci dice che l'installazione Apache2 di Debian ha due vhost disponibili: 000-default.conf e default-ssl.conf. Notate che la presenza di un virtual host in questa directory non significa che questo sia attivo e visibile dagli utenti; significa solo che sarà disponibile se verrà abilitato.


Tutto questo ci porta a...

sites-enabled

Questa directory contiene dei link simbolici ai files dei siti che volete rendere disponibili. Per esempio, su un web server ci possono essere diversi siti pronti per essere pubblicati (configurati nella directory sites-available), ma solo quelli linkati simbolicamente in questa directory saranno realmente visibili dagli utenti. Diamo uno sguardo alla directory:

# ls -l sites-enabled
...
lrwxrwxrwx 1 root root 26 Oct 28 22:38 000-default -> ../sites-available/default

Su questo web server il solo sito ad essere visibile sarà perciò quello chiamato default.

mods-available

Questa directory contiene i moduli di Apache2 pronti per essere resi disponibili.

mods-enabled

Questa directory, come nel caso dei virtual host, contiene i link simbolici ai moduli effettivamente abilitati sul web server.

a2en e a2dis

Essere buoni amministratori di sistema significa conoscere i comandi per renderci le cose più semplici.

a2dissite

Questo comando cancella il link simbolico di un sito abilitato. Ad esempio il comando:

# a2dissite default

rende indisponibile il sito di default di Apache.

a2ensite

Questo comando serve invece a abilitare un virtual host:

# a2ensite default

rimette le cose a posto, ripristinando il sito di default precedentemente disabilitato.

a2dismod

Questo comando disabilita un modulo di Apache.

a2enmod

Questo comando abilita un modulo di Apache.

Apache2: files di configurazione

ports.conf

È il file che indica ad Apache su quali porte TCP/IP restare in ascolto:

NameVirtualHost *:80
Listen 80

<IfModule mod_ssl.c>
    # SSL name based virtual hosts are not yet supported, therefore no
    # NameVirtualHost statement here
    Listen 443
</IfModule>

La sintassi del file di default è molto semplice:

Se volete aggiungere porte basterà inserire una riga del tipo:

Listen 8080

e riavviare Apache.

per evitare di visualizzare l'avviso

Restarting web server: apache2AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/apache2/ports.conf:5
commentare la riga 5 relativa a NameVirtualHost

apache2.conf

È il file di configurazione principale di Apache su Debian. È estremamente ben commentato, ma può valer la pena lo stesso dare un'occhiata alle opzioni di configurazione principali.

Timeout

Default:

Timeout 300

Questa opzione imposta il tempo massimo, in secondi, durante il quale Apache aspetta una richiesta, la processa e le risponde. È impostato deliberatamente su un valore molto alto, ma è possibile ridurlo, portandolo a un sano 45 (o anche meno). Ridurre questo valore può anche aiutare a controbattere gli effetti di un attacco DOS.

KeepAlive

Default:

KeepAlive On

Questo parametro andrebbe lasciato su ON, poiché indica a Apache di mantenere aperta una connessione con il client, in modo che ogni file o immagine di un documento HTML non siano richiesti con una nuova connessione. Di seguito vedremo alcune impostazioni del parametro KeepAlive.

MaxKeepAliveRequests

Default:

MaxKeepAliveRequests 100

Per ogni connessione persistente attiva definisce il numero massimo di richieste possibili. Va tenuto alto per garantire efficienza. Se il vostro sito contiene parecchi javascript, immagini, etc, provate a aumentarlo a 200.

KeepAliveTimeout

Default:

KeepAliveTimeout 15

Descrive il tempo in secondi in cui ogni connessione persistente attiva aspetta per la prossima richiesta, prima di chiudersi definitivamente.

prefork MPM

Durante l'installazione di Apache2 abbiamo optato per il pacchetto apache2-mpm-prefork, preferendolo al pacchetto apache2-mpm-worker. Vi rimando alla documentazione ufficiale di Apache2 per le differenze.
Questo parametro definisce il comportamento di Apache2 MPM prefork.
Default:

<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>

ServerName

Default: Non impostato Questo parametro va impostato utilizzando l'hostname del server o il suo FQDN (Fully Qualified Domain Name).

HostnameLookups

Default:

HostnameLookups Off

Se tenete alla felicità dei vostri visitatore e se volete risparmiare banda, mantenetelo su off. Altre impostazioni sono:

ServerTokens

Default:

ServerTokens Full

Indica quante informazioni vengono inviate dal server nell'header. Può essere utile modificare il valore di default per una questione di sicurezza: meno informazioni forniamo sul nostro server, sulla versione di Apache e sui moduli installati, e meno facile sarà trovare un exploit per bucarci.
Le possibili opzioni sono:

Apache/2.2.9 (Debian) PHP/5.2.6-1+lenny3 with Suhosin-Patch Server at demo
Apache/2.2.9 (Debian) Server
Apache/2.2.9 Server
Apache/2.2 Server
Apache/2 Server
Apache Server

ServerSignature

Default:

ServerSignature On

Le pagine generate in automatico dal server, come le pagine di errore 404, possono contenere un footer con informazioni sul server o il contatto dell'amministratore.
I possibili valori sono:

Per approfondimenti vedi anche:

Installare un ambiente LAMP: Linux, Apache2, SSL, MySQL, PHP5
Backup di MySQL tramite script
Configurare MySQL per accettare connessioni remote




Guida scritta da: Ferdybassi

Swirl-auth40.png Debianized 40%

Estesa da:
Selky
Verificata da:
marzolinus

Verificare ed estendere la guida | Cos'è una guida Debianized

Strumenti personali
Namespace
Varianti
Azioni
Navigazione
Risorse
Strumenti