4 069
contributi
(59 versioni intermedie di 3 utenti non mostrate) | |||
Riga 1: | Riga 1: | ||
{{Versioni compatibili|Stretch}} | {{Versioni compatibili|ONLY|Stretch}} | ||
== Introduzione == | == Introduzione == | ||
'''LAMP''' è un acronimo che indica un ambiente server in cui siano installati '''L'''inux, '''A'''pache, '''M'''ySQL e '''P'''HP. In questa guida vedremo come installare un server Apache2 su Debian | '''LAMP''' è un acronimo che indica un ambiente server in cui siano installati '''L'''inux, '''A'''pache, '''M'''ySQL e '''P'''HP. In questa guida vedremo come installare un server Apache2 su Debian [[Stretch]], come configurare il modulo SSL e come fornire supporto per il linguaggio di scripting PHP5, PHP7 e i database basati su MySQL. | ||
<br> | <br> | ||
In tutta la guida assumeremo che il nome del server Debian sia <code>'''demo'''</code> e il suo indirizzo IP sia <code>'''123.45.67.890'''</code>. Questi valori vanno ovviamente sostituiti con quelli del vostro ambiente di lavoro. | In tutta la guida assumeremo che il nome del server Debian sia <code>'''demo'''</code> e il suo indirizzo IP sia <code>'''123.45.67.890'''</code>. Questi valori vanno ovviamente sostituiti con quelli del vostro ambiente di lavoro. | ||
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 | # 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 | Per eliminarlo è sufficiente aprire il file: | ||
<pre> | <pre> | ||
# nano /etc/apache2/ | # 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 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: | ||
<pre> | <pre> | ||
# systemctl restart apache2 | # systemctl restart apache2 | ||
</pre> | |||
Se pianificate di installare il CMS Wordpress, occorre anche modificare una configurazione in Apache2: | |||
<pre> | |||
# nano /etc/apache2 | |||
</pre> | |||
cambiando la sezione seguente da: | |||
<pre> | |||
<Directory /var/www/> | |||
Options Indexes FollowSymLinks | |||
AllowOverride None | |||
Require all granted | |||
</Directory> | |||
</pre> | |||
a: | |||
<pre> | |||
<Directory /var/www/> | |||
Options Indexes FollowSymLinks | |||
AllowOverride All | |||
Require all granted | |||
</Directory> | |||
</pre> | </pre> | ||
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! | 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! | ||
Riga 84: | Riga 109: | ||
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 182: | Riga 207: | ||
Un riavvio di Apache2 caricherà la nuova configurazione: | Un riavvio di Apache2 caricherà la nuova configurazione: | ||
<pre> | <pre> | ||
# | # systemctl reload apache2 | ||
</pre> | </pre> | ||
== Installazione di | == Installazione di PHP7 == | ||
Per avere il supporto a | Per avere il supporto a PHP7 è sufficiente installare il linguaggio di scripting e il relativo modulo di supporto ad Apache2: | ||
<pre> | <pre> | ||
# | # 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 php-bcmath | ||
</pre> | </pre> | ||
PHP 7.0 è ormai fuori supporto, e il team di sviluppo consiglia di passare alla versione LTS 7.2 di PHP. I pacchetti per Debian Stretch di PHP 7.2 sono disponibili solo tramite un repository esterno. Per chi volesse installare PHP 7.2 su Debian Stretch consigliamo di seguire la guida apposita: [[Installare PHP 7.2 su Debian Stretch]] . | |||
A questo punto un riavvio di Apache è sufficiente: | A questo punto un riavvio di Apache è sufficiente: | ||
<pre> | <pre> | ||
# | # systemctl reload apache2 | ||
</pre> | </pre> | ||
Su tutte le Debian | 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 233: | ||
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/ | /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 262: | ||
e riavviando il server: | e riavviando il server: | ||
<pre> | <pre> | ||
# /etc/ | # 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 303: | ||
</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 | 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. | ||
== | |||
==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> | <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> | </pre> | ||
E installiamo PHP 5.6: | |||
<pre> | <pre> | ||
# apt-get install dh-php5 libapache2-mod- | # apt-get install php5.6-cli php5.6-fpm libapache2-mod-php5.6 | ||
</pre> | |||
<pre> | |||
# apt install dh-php5.6 libapache2-mod-php5.6filter libexpect-php5.6 libgv-php5.6 libow-php5.6 libphp5.6-embed php5.6-adodb php5.6-apcu php5.6-cgi php5.6-curl php5.6-dbg php5.6-enchant php5.6-exactimage php5.6-ffmpeg php5.6-fpm php5.6-gd php5.6-gdcm php5.6-geoip php5.6-gmp php5.6-imagick php5.6-idn php5.6-imap php5.6-interbase php5.6-intl php5.6-json php5.6-ldap php5.6-librdf php5.6-mapscript php5.6-mcrypt php5.6-memcache php5.6-memcached php5.6-mhash php5.6-ming php5.6-mongo php5.6-mssql php5.6-mysql php5.6-odbc php5.6-pgsql php5.6-ps php5.6-pspell php5.6-radius php5.6-recode php5.6-remctl php5.6-rrd php5.6-sasl php5.6-snmp php5.6-sqlite php5.6-svn php5.6-sybase php5.6-tidy php5.6-xcache php5.6-xmlrpc php5.6-xsl | |||
</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> | |||
# php -v | |||
PHP 7.0.15-1 (cli) | |||
</pre> | |||
ma possiamo cambiarla in maniera molto veloce: | |||
<pre> | |||
# update-alternatives --config php | |||
</pre> | </pre> | ||
Riga 269: | Riga 344: | ||
L'installazione del RDBM MySQL è semplice: | L'installazione del RDBM MySQL è semplice: | ||
<pre> | <pre> | ||
# | # apt install mysql-server mysql-client | ||
</pre> | </pre> | ||
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> | ||
mysql -u root | |||
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 370: | ||
</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> | ||
# | # 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 378: | ||
Web server to reconfigure automatically: <-- apache2 | Web server to reconfigure automatically: <-- apache2 | ||
</pre> | </pre> | ||
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. | |||
<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/> | ||
Per risolvere questo problema è sufficiente aggiungere un nuovo utente "amministratore" in MySQL e utilizzare quello per le future connessioni tramite PHPMyAdmin: | |||
<pre> | <pre> | ||
# | # 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> | ||
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 418: | ||
</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 468: | ||
# 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 479: | ||
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>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> | |||
Riga 361: | Riga 495: | ||
</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 === | |||
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 518: | ||
==== 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 === | ||
Riga 434: | Riga 570: | ||
</pre> | </pre> | ||
Descrive il tempo in secondi in cui ogni connessione persistente attiva aspetta per la prossima richiesta, prima di chiudersi definitivamente. | Descrive il tempo in secondi in cui ogni connessione persistente attiva aspetta per la prossima richiesta, prima di chiudersi definitivamente. | ||
==== ServerName ==== | ==== ServerName ==== | ||
Default: Non impostato | Default: Non impostato |