Installare un ambiente LAMP: Linux, Apache2, SSL, MySQL, PHP5 - Stretch: differenze tra le versioni

Vai alla navigazione Vai alla ricerca
(48 versioni intermedie di uno stesso utente non sono mostrate)
Riga 8: Riga 8:
Installare il web server Apache2 su Debian è un'operazione molto semplice:
Installare il web server Apache2 su Debian è un'operazione molto semplice:
<pre>
<pre>
# apt install apache2 apache2-utils libexpat1 apache2-suexec-pristine
# 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
</pre>
</pre>
Se notaste, all'avvio del web server, il messaggio di avvertimento:
Se notaste, all'avvio del web server, il messaggio di avvertimento:
Riga 15: Riga 15:
using 127.0.0.1 for ServerName
using 127.0.0.1 for ServerName
</pre>
</pre>
Per eliminarlo è sufficiente aprire il file di configurazione di Apache2:
Per eliminarlo è sufficiente aprire il file:
<pre>
<pre>
# nano /etc/apache2/apache2.conf
# nano /etc/apache2/conf-available/fqdn.conf
</pre>
</pre>
e aggiungere la direttiva:
e aggiungere la direttiva:
<pre>
<pre>
ServerName demo
ServerName demo
</pre>
e abilitare la configurazione:
<pre>
# a2enconf fqdn
# systemctl restart apache2.service
</pre>
</pre>
Abilitate alcuni comodi moduli aggiuntivi:
Abilitate alcuni comodi moduli aggiuntivi:
<pre>
<pre>
# a2enmod headers
# a2enmod expires
# a2enmod expires
# a2enmod suexec rewrite ssl actions include dav_fs dav auth_digest cgi headers status info
</pre>
</pre>
Quindi riavviate Apache2 per fargli digerire le modifiche:
Quindi riavviate Apache2 per fargli digerire le modifiche:
Riga 84: Riga 89:
Iniziamo con il creare un file di testo che specifichi il nostro Virtual Host SSL:
Iniziamo con il creare un file di testo che specifichi il nostro Virtual Host SSL:
<pre>
<pre>
# nano /etc/apache2/sites-available/default-ssl
# nano /etc/apache2/sites-available/default-ssl.conf
</pre>
</pre>
e configuriamolo come segue:
e configuriamolo come segue:
Riga 185: Riga 190:
</pre>
</pre>


== Installazione di PHP5 ==
== Installazione di PHP7 ==
Per avere il supporto a PHP5 è sufficiente installare il linguaggio di scripting e il relativo modulo di supporto ad Apache2:
Per avere il supporto a PHP7 è sufficiente installare il linguaggio di scripting e il relativo modulo di supporto ad Apache2:
<pre>
<pre>
# aptitude install php5 libapache2-mod-php5
# 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
</pre>
</pre>
A questo punto un riavvio di Apache è sufficiente:
A questo punto un riavvio di Apache è sufficiente:
<pre>
<pre>
# /etc/init.d/apache2 reload
# systemctl reload apache2
</pre>
</pre>




Su tutte le Debian Squeeze c’è una correzione al volo da fare al file ''php.ini''. Il problema è dovuto al parametro:
Su tutte le Debian c’è una correzione al volo da fare al file ''php.ini''. Il problema è dovuto al parametro:
<pre>
<pre>
memory_limit = -1
memory_limit = -1
Riga 206: Riga 211:
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:
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:
<pre>
<pre>
/etc/php5/cli/php.ini
/etc/php/7.0/cli/php.ini
</pre>
</pre>
E la modifica da effettuare è la seguente:
E la modifica da effettuare è la seguente:
Riga 235: Riga 240:
e riavviando il server:
e riavviando il server:
<pre>
<pre>
# /etc/init.d/apache2 restart
# systemctl reload apache2
</pre>
=== Messa in sicurezza di PHP ===
Modifichiamo il file:
<pre>
# nano /etc/php/7.0/apache2/conf.d/99_security.ini
</pre>
con questi valori:
<pre>
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
</pre>
e riavviamo Apache:
<pre>
# systemctl restart apache2.service
</pre>
</pre>
=== Test della configurazione ===
=== Test della configurazione ===
Prima di procedere è una buona idea verificare che tutto ciò che abbiamo fatto funzioni realmente. Per questo utilizziamo il metodo <code>phpinfo</code> di PHP5 caricandolo in una pagina di test. Partiamo col creare il file della pagina di test:
Prima di procedere è una buona idea verificare che tutto ciò che abbiamo fatto funzioni realmente. Per questo utilizziamo il metodo <code>phpinfo</code> di PHP5 caricandolo in una pagina di test. Partiamo col creare il file della pagina di test:
<pre>
<pre>
# nano -w /var/www/test.php
# nano -w /var/www/html/test.php
</pre>
</pre>
Quindi riempiamolo in questo modo:
Quindi riempiamolo in questo modo:
Riga 255: Riga 281:
</html>
</html>
</pre>
</pre>
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.
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 PHP7.
=== Moduli aggiuntivi ===
 
Tramite le funzionalità di ricerca di aptitude diamo uno sguardo ai moduli disponibili per 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.
<br/>
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ý.
<br/>
Aggiungiamo il suo repository al nostro sources.list:
<pre>
# apt-get install apt-transport-https curl
# 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
</pre>
E installiamo PHP 5.6:
<pre>
# apt-get install php5.6-cli php5.6-fpm
</pre>
Verifichiamo che tutto sia a posto:
<pre>
# php7.0 -v
PHP 7.0.15-1 (cli)
# php5.6 -v
PHP 5.6.30-5+0~20170223133422.27+stretch~1.gbp1ee0cb (cli)
</pre>
La versione predefinita è rimasta la 7.0, come possiamo facilmente constatare:
<pre>
<pre>
# aptitude search php5
# php -v
PHP 7.0.15-1 (cli)
</pre>
</pre>
Scegliete '''solo''' quelli che vi servono e installateli nel solito modo:
ma possiamo cambiarla in maniera molto veloce:
<pre>
<pre>
# apt-get install dh-php5 libapache2-mod-php5filter libexpect-php5 libgv-php5 libow-php5 libphp5-embed php5-adodb php5-apcu php5-cgi php5-curl php5-dbg php5-enchant php5-exactimage php5-ffmpeg php5-fpm php5-gd php5-gdcm php5-geoip php5-gmp php5-imagick php5-idn php5-imap php5-interbase php5-intl php5-json php5-ldap php5-librdf php5-mapscript php5-mcrypt php5-memcache php5-memcached php5-mhash php5-ming php5-mongo php5-mssql php5-mysql php5-odbc php5-pgsql php5-ps php5-pspell php5-radius php5-recode php5-remctl php5-rrd php5-sasl php5-snmp php5-sqlite php5-svn php5-sybase php5-tidy php5-xcache php5-xmlrpc php5-xsl
# update-alternatives --config php
</pre>
</pre>


Riga 269: Riga 319:
L'installazione del RDBM MySQL è semplice:
L'installazione del RDBM MySQL è semplice:
<pre>
<pre>
# aptitude install mysql-server mysql-client
# apt install mysql-server mysql-client
</pre>
</pre>
Durante l'installazione vi verrà chiesta la password di amministratore di MySQL (che è chiamato '''root''' ma è diverso dall'utente '''root''' del server Debian):
Al termine dell'installazione occorrerà impostare la password di amministratore di MySQL (che è chiamato '''root''' ma è diverso dall'utente '''root''' del server Debian):
<pre>
<pre>
New password for the MySQL "root" user: <-- LAMIAPASSWORD
mysql -u root
Repeat password for the MySQL "root" user: <-- LAMIAPASSWORD
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('LAMIAPASSWORD');
</pre>
</pre>
La password che sceglierete sarà valida sia per l'utente MySQL root@localhost sia per l'utente root@demo.
La password che sceglierete sarà valida sia per l'utente MySQL root@localhost sia per l'utente root@demo.
<br/>
Mettiamo in sicurezza l'installazione di MySQL avviando il tool apposito:
<pre>
# mysql_secure_installation
</pre>
e rispondendo alle domande autoesplicative.
<br/><br/>
<br/><br/>
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:
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:
Riga 289: Riga 345:
</pre>
</pre>
=== L'interfaccia phpMyAdmin ===
=== L'interfaccia phpMyAdmin ===
Per amministrare i nostri database può essere comoda un'interfaccia grafica raggiungibile da browser. A questo scopo installiamo '''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):
<pre>
<pre>
# aptitude install phpmyadmin
# apt install phpmyadmin adminer
</pre>
</pre>
Durante l'installazione vi verrà chiesto di indicare il web server in esecuzione sulla vostra machina. Indicate apache2:
Durante l'installazione vi verrà chiesto di indicare il web server in esecuzione sulla vostra machina. Indicate apache2:
Riga 297: Riga 353:
Web server to reconfigure automatically: <-- apache2
Web server to reconfigure automatically: <-- apache2
</pre>
</pre>
A questo punto lanciate il browser su '''http://123.45.67.890/phpmyadmin''' e fate login con le credenziali di root di MySQL inserite poco fa.
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.
{{Box|Nota|È possibile che la pagina di autenticazione di phpmyadmin non venga caricata, in tal caso provare a riavviare manualmente apache.}}
<br/>
Questo comporta che i tentativi di login in PHPMyAdmin utilizzando l'utente root terminano tutti con un errore:
<pre>
#1698 - Access denied for user 'root'@'localhost'
</pre>
dal momento che PHPMyAdmin cerca di autenticarsi sulla tabella userd del database di MySQL.
<br/>
<br/>
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 protocollo SSL. Questo può essere agevolmente fatto modificando il file di configurazione di phpmyadmin.
Per risolvere questo problema è sufficiente aggiungere un nuovo utente "amministratore" in MySQL e utilizzare quello per le future connessioni tramite PHPMyAdmin:
* '''Fino a Debian Wheezy''':
<pre>
<pre>
# nano /etc/apache2/conf.d/phpmyadmin.conf
# 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;
</pre>
</pre>
* '''Da Debian Jessie (Apache 2.4.x)''':
A questo punto lanciate il browser su '''http://123.45.67.890/phpmyadmin''' e fate login con le credenziali inserite poco fa.
{{Box|Nota|È possibile che la pagina di autenticazione di phpmyadmin non venga caricata, in tal caso provare a riavviare manualmente apache.}}
<br/>
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
<pre>
<pre>
# nano /etc/phpmyadmin/apache.conf
# nano /etc/phpmyadmin/apache.conf
Riga 326: Riga 393:
</pre>
</pre>
Da adesso, anche digitando '''http://123.45.67.890/phpmyadmin''', sarete rigirati verso l'equivalente pagina HTTPS.
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:
* Migliorare le prestazioni con Memcached: [[http://guide.debianizzati.org/index.php/Installare_Memcached_in_un_server_Apache2_-_Stretch Memcached]]
* Configurare i Virtual Hosts: [[http://guide.debianizzati.org/index.php/Apache_e_Virtual_Hosts:_configurare_Apache2_per_ospitare_pi%C3%B9_siti_web Virtual Hosts]]
* Migliorare le prestazioni con PageSpeed: [[http://guide.debianizzati.org/index.php/Incrementare_le_prestazioni_di_Apache_con_mod_pagespeed Mod_PageSpeed]]
* Hardening di Apache2: [[http://guide.debianizzati.org/index.php/Hardening_di_un_web_server_Apache Hardening di Apache2]]
* Ottimizzare la banda di Apache2: [[http://guide.debianizzati.org/index.php/Ottimizzare_la_banda_di_Apache Ottimizzare la banda]]
* Individuare gli script PHP che inviano SPAM: [[http://guide.debianizzati.org/index.php/Individuare_gli_script_PHP_che_inviano_SPAM Script PHP che inviano SPAM]]
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.
<br/>
Invece della directory <code>/etc/apache2/conf.d/</code> abbiamo <code>/etc/apache2/conf-enabled/</code> che contiene dei link a <code>/etc/apache2/conf-available/</code>.
<br/>
I file di configurazione in <code>/etc/apache2/sites-enabled</code>/ devono terminare con l'estensione <code>.conf</code>.
<br/>
La direttiva <code>NameVirtualHost *:80</code> e analoga per la porta 443 non serve più.
<br/>
Una directory pubblicata tramite Alias deve avere l'opzione <code>Require all granted</code> altrimenti ogni tentativo di accedere al suo contenuto risulta in un errore <code>AH01630: client denied by server configuration</code>.
<br/><br/>
Una delle modifiche classiche da fare è la seguente:
<pre>
# Configuration for Apache 2.2
Order allow,deny
Allow from all
# Configuration for Apache 2.4 with mod_authz_host.
Require all granted
</pre>
In maniera analoga per negare ogni richiesta:
<pre>
# Configuration for Apache 2.2
Order deny,allow
Deny from all
# Configuration for Apache 2.4 with mod_authz_host.
Require all denied
</pre>
Un controllo di accesso basato sull'indirizzo IP è fatto in questo modo:
<pre>
Require local
Require ip 127.0.0.0/8 ::1 185.21.73.97 10.0.1.0/24
</pre>
Un'altro cambiamento non da poco è la direttiva <code>AllowOverride</code>, che adesso ha valore predefinito <code>None</code>. Questo significa ad esempio che tutti i file .htaccess smettono di funzionare!


== Apache2: layout di configurazione ==
== Apache2: layout di configurazione ==
Riga 333: Riga 443:
# ls
# ls
</pre>
</pre>
=== conf ===
In Apache 2.4, due nuove directory, <tt>conf-available</tt> e <tt>conf-enabled</tt> hanno sostituito la vecchia directory di configurazione <tt>conf.d/</tt>.
<br/>
i file di configurazione dei vari moduli di Apache si trovano nella directory <tt>conf-available</tt>. Per attivare un particolare modulo occorre creare un symbolic link verso la directory <tt>conf-enabled</tt> e riavviare Apache2.
=== sites-available ===
=== 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:
Questa directory conterrà i file con le configurazioni di ogni sito (conosciuti come '''virtual hosts''') che vorrete servire con Apache. Uno sguardo alla directory:
Riga 338: Riga 454:
ls sites-available/
ls sites-available/
...
...
default  default-ssl
000-default.conf default-ssl.conf
</pre>
</pre>
ci dice che l'installazione Apache2 di Debian ha due vhost disponibili: <code>default</code> e <code>default-ssl</code>. 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.<br>


* '''Da Debian Jessie (Apache 2.4.x)''':
ci dice che l'installazione Apache2 di Debian ha due vhost disponibili: <code>000-default.conf</code> e <code>default-ssl.conf</code>. 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.<br>
<pre>
ls sites-available/
...
000-default.conf  default-ssl.conf
</pre>
i due vhost disponibili sono <code>000-default.conf</code> e <code>default-ssl.conf</code>, terminano con estensione .conf e il contenuto va personalizzato secondo le proprie esigenze.




Riga 361: Riga 470:
</pre>
</pre>
Su questo web server il solo sito ad essere visibile sarà perciò quello chiamato <code>default</code>.
Su questo web server il solo sito ad essere visibile sarà perciò quello chiamato <code>default</code>.
==== mods-available ====
=== mods-available ===
Questa directory contiene i moduli di Apache2 pronti per essere resi disponibili.
Questa directory contiene i moduli di Apache2 pronti per essere resi disponibili.
=== mods-enabled ===
=== mods-enabled ===
Questa directory, come nel caso dei virtual host, contiene i link simbolici ai moduli effettivamente abilitati sul web server.
Questa directory, come nel caso dei virtual host, contiene i link simbolici ai moduli effettivamente abilitati sul web server.
Riga 383: Riga 493:
==== a2enmod ====
==== a2enmod ====
Questo comando abilita un modulo di Apache.
Questo comando abilita un modulo di Apache.
== Apache2: files di configurazione ==
== Apache2: files di configurazione ==
=== ports.conf ===
=== ports.conf ===

Menu di navigazione