Configurazione Apache2 - lordhack.altervista.org

Transcript

Configurazione Apache2 - lordhack.altervista.org
============================================================
== [Niubbi inside] Un Apache per amico (e per server Web) ==
============================================================
Proviamo ad inaugurare la (spero lunga) serie di articoli del Lug con una piccola
guida destinata a chi, come me, sta muovendo i primi passi col Pinguino, ma ha
voglia di pensare in grande... :)
In questo articolo provero' a scrivere come mettere in piedi un serverino web con
supporto per PHP e MySQL: non sara' certo un server di quelli coi contro-fiocchi,
ma per l'uso in LAN o per lavorare in locale va piu' che bene... :)
Prima di inziare, avviso che le procedure e gli esempi che seguiranno fanno
riferimento alla mia distro (Debian Sid) e che in altre distro le cose potrebbero
essere differenti. Che volete farci, io sono un Debianista convinto... ;)
Dunque, per fare quello che ci siamo preposti abbiamo bisogno di tre cose:
- Un server web: useremo Apache2 (sul mio sistema ho la versione 2.0.49), che e'
stato totalmente riscritto rispetto alle versioni 1.3.x
- PHP (versione 4) e il relativo modulo per MySQL
- MySQL (versione 4 anch'esso)
--------------------- Ok, procedamus --------------------Come recuperiamo il materiale? Semplicissimo: con apt-get! Innanzitutto facciamo un
update della lista dei pacchetti della nostra distro con
# apt-get update
Una volta fatto, scarichiamo e installiamo queste quattro cose:
#
#
#
#
apt-get
apt-get
apt-get
apt-get
install
install
install
install
apache2-common
apache2-mpm-prefork
libapache2-mod-php4
apache2-doc
Breve spiegazione di cosa si e' installato in dettaglio: col primo pacchetto
abbiamo tutti i moduli standard per Apache2 (incluso il supporto SSL, per
connessioni sicure), ma NON il server web vero e proprio, che abbiamo installato
col secondo pacchetto.
Col terzo pacchetto abbiamo installato i moduli per far funzionare PHP sul nostro
server.
Per maggiori informazioni, lanciate questo comando
# apt-cache show nome_pacchetto
Installiamo ora PHP e i moduli relativi per MySQL
# apt-get install php4
# apt-get install php4-mysql
e infine il nostro DBMS, MySQL
# apt-get install mysql-server
Ricordo che le eventuali dipendenze con altri pacchetti vengono gestite
direttamente da apt-get, quindi andate tranquilli... :)
Visto che la gestione di MySQL da riga di comando non e' proprio semplicissima, vi
consiglierei vivamente di scaricare anche PhpMyAdmin, un'interfaccia web per la
gestione dei database MySQL:
# apt-get install phpmyadmin
A questo punto potete provare a vedere se il vostro server funziona. Se non lo e'
gia', avviate il demone Apache2 con
# /etc/init.d/apache2 start
aprite una finestra del vostro browser e digitate nella barra degli indirizzi
"http://127.0.0.1" (senza i doppi apici). Vi dovrebbe comparire la cosiddetta
"Placeholder page", una paginetta con alcuni avvisi. Se la vedete, significa che
tutto e' andato liscio. Stoppate il demone con
# /etc/init.d/apache2 stop
Non preoccupatevi se vedete questo messaggio di errore
apache2: Could not determine the server's fully qualified domain name,
using 127.0.0.1 for ServerName
perche' lo risolveremo subito... :)
--------------------------------------------- Andiam, andiam, andiamo a smanettar... --------------------------------------------Ora vediamo di configurare un po' meglio il tutto. Cominciamo da Apache.
Spostatevi in /etc/apache2 e date un'occhiata ai file che ci sono all'interno di
questa directory. Dovreste trovarvi di fronte a questa roba:
LoHacker:/etc/apache2# ls -la
total 76
drwxr-xr-x
9 root
root
drwxr-xr-x
98 root
root
-rw-r--r-1 root
root
-rw-r--r-1 root
root
drwxr-xr-x
2 root
root
drwxr-xr-x
2 root
root
-rw-r--r-1 root
root
-rw-r--r-1 root
root
drwxr-xr-x
2 root
root
drwxr-xr-x
2 root
root
-rw-r--r-1 root
root
drwxr-xr-x
2 root
root
drwxr-xr-x
2 root
root
drwxr-xr-x
2 root
root
4096
4096
2134
12449
4096
4096
0
12441
4096
4096
66
4096
4096
4096
May
May
Apr
May
Apr
May
Apr
Apr
Apr
May
May
Apr
Apr
Apr
8
20
4
1
4
15
28
4
29
15
8
12
15
4
15:05
18:45
16:48
20:50
15:20
20:41
11:36
16:48
12:35
20:41
15:05
21:38
16:27
16:47
.
..
README
apache2.conf
build
conf.d
httpd.conf
magic
mods-available
mods-enabled
ports.conf
sites-available
sites-enabled
ssl
Non entro nel dettaglio (anche perche' non lo conosco nemmeno io ^^;;), comunque ci
interessano due file, per adessO: apache2.conf e ports.conf.
Il primo e', di fatto, l'equivalente di httpd.conf (il nome viene mantenuto in
tutte le altre distro, solo in Debian e' differente), mentre il secondo serve a
configurare l'indirizzo IP e la porta sulla quale il server se ne stara' in
ascolto.
Guardiamo quello che puo' servirci in apache2.conf, quindi editate il file in
questione con Vi o col vostro editor di fiducia. Vi ricordate l'errore che vi ho
descritto nel paragrafo precedente, no? Bene, rattoppiamolo decommentando o
aggiungendo, nel caso non ci fosse, la seguente riga ad inizio file
ServerName localhost
Niente di piu' semplice... :)
Tornando a noi, dobbiamo fare in modo che il nostro server riesca a far girare le
pagine in PHP, abbiamo detto: scorrete il file fino ad arrivare a questa riga
DirectoryIndex index.html index.cgi index.pl index.php index.xhtml
Se non c'e', aggiungete alla lista "index.php" (sempre senza doppi apici)
Vi do un consiglio del tutto spassionato: io ho trovato molto comodo abilitare
anche queste righe, che si trovano appena sotto quella descritta
UserDir public_html
<Directory /home/*/public_html>
#
AllowOverride FileInfo AuthConfig Limit
Options Indexes SymLinksIfOwnerMatch IncludesNoExec
</Directory>
A cosa servono? Beh, semplice: create nella vostro home una directory chiamata
"public_html" con
$ mkdir public_html
se volete metteteci dentro qualche file e poi provate a digitare sul vostro browser
http://127.0.0.1/~nomeutente
e lo scoprirete da soli. IMHO e' decisamente piu' comodo del mettere le pagine in /
var/www, che e' la DocumentRoot predefinita di Apache... :)
Continuando con la nostra configurazione di Apache per abilitare il PHP, scorrendo
ulteriormente il file apache2.conf vi troverete di fonte a queste righe
#AddType application/x-httpd-php .php
#AddType application/x-httpd-php-source .phps
che definiscono i tipi di applicazione che il nostro Apache e' in grado di gestire.
Decommentate quindi la prima delle due righe di cui sopra, nel caso lo fosse,
altrimenti le vostre pagine in php non verranno visualizzate.
Con apache2.conf abbiamo finito. Non abbiamo ancora finito, pero', di abilitare PHP
su Apache: dobbiamo installare i moduli. Come fare? Nell'elenco dei file contenuti
in /etc/apache2 avrete sicuramente visto due cartelle: mods-avaiable/ e modsenabled/. La prima contiene tutti i moduli che si trovavano nel pacchetto apache2common e nel pacchetto libapache2-mod-php4 e che sono disponibili all'abilitazione,
la seconda contiene i moduli gia' abilitati e funzionanti.
Per abilitare i moduli e' sufficiente creare un link simbolico ai file .load e .
conf del modulo voluto nella directory mods-enabled, in questo modo (io specifico
sempre i path, onde evitare casini)
# ln -s /etc/apache2/mods-avaiable/miomodulo.conf /etc/apache2/mods-
enabled/miomodulo.conf
# ln -s /etc/apache2/mods-avaiable/miomodulo.load /etc/apache2/modsenabled/miomodulo.load
I moduli per il PHP hanno nome "php4.load" e "php4.conf". i raccomando di dare al
link lo stesso nome del file originale!
Ovviamente questa e' la via piu' complicata, tanto perche' sono sadico! =P
Esiste un altro metodo per caricare velocemente i moduli, senza creare il link
simbolico a manina:
# a2enmod miomodulo
che fara' da solo tutte le operazioni descritte in precedenza. Esiste, ovviamente,
anche il comando per disabilitare un modulo:
# a2dismod miomodulo
Volevo farvi notare un'altra cosa: io, per abitudine, avvio e stoppo il demone
Apache nel modo che ho fatto vedere sopra, ma questo non e' il solo modo. Esiste
infatti un comando, chiamato "apache2ctl" che non solo vi permette di
stoppare/avviare/riavviare Apache2, ma permette altre operazioni, che vi invito a
guardare lanciando semplicemente il comando sopracitato... :)
Ora tocca a ports.conf che, come detto prima, definisce su quali indirizzi e porte
il server deve restare in ascolto. Il file in questione si presenta con una sola
riga, contenente questa stringa
Listen 80
che sta ad indicare che Apache e' in ascolto sulla porta 80 e che tutti,
dall'esterno, possono accedere al vostro webserver. Se non volete cio', potete
configurare Apache in modo tale che se ne resti in ascolto esclusivamente su
indirizzi locali, modificando ports.conf come segue
Listen 127.0.0.1:80
(questo per il loopback, se siete in una LAN e avete bisogno di un server web
aziendale potreste mettere, ad esempio, "Listen 192.168.0.1:80").
A meno di sviste clamorose, Apache e il PHP *dovrebbero* essere a posto. Avviate il
demone, provate a scrivere una pagina di prova in php che contiene esattamente
queste righe di codice
<?php
phpinfo();
?>
Salvate la pagina (chiamatela, per esempio, "test.php") e lanciatela con il vostro
browser. Se riuscite a visualizzare una tabella significa che PHP e' stato
configurato a dovere... :)
----------------------------------------- Un lucchetto per il nostro Indiano ----------------------------------------A differenza della versione 1.3.x, non esiste un pacchetto similare a "apache-ssl",
quindi il supporto per le connessioni cifrate deve essere impostato a manina.
Ahime', oserei dire... -___Il modulo SSL da solo non e' sufficiente, ma abbiamo bisogno anche di OpenSSL,
scaricabile sempre con apt-get
# apt-get install openssl
che ci permettera' di creare i certificati per i nostri server web.
Se non l'avete gia' fatto, inoltre, installate il modulo SSL per Apache con
# a2enmod ssl
Ora dobbiamo creare i certificati, per l'appunto: qui Apache ci viene in aiuto con
un altro comando, "apache2-ssl-certificate". Lanciatelo
# apache2-ssl-certificate
Dovrete riempire una serie di campi, fatelo. A opera finita dovreste ritrovarvi,
nella directory ssl/, due file, di cui uno e' "apache2.pem", che se non erro
contiene la chiave privata che serve a crittare le nostre connessioni e il
certificato vero e proprio.
[Warning: tutto quello che seguira' in questo paragrafo e' un mio "smanettamento"
personale: funziona, ma esistono sicuramente metodi migliori di quello che ho usato
io!]
Fatto questo, dobbiamo mettere mano a due file: il solito "ports.conf" e "default",
contenuto nella directory sites-enabled/ (vi sono contenute le varie configurazioni
per i domini virtuali presenti sul server).
Cominciamo dal primo: editatelo e aggiungete questa riga a quello che gia' c'e'
Listen 127.0.0.1:443
(sempre per il loopback, per la LAN sapete gia' cosa fare ;)) dove la porta 443 e'
quella predefinita per le connessioni https. Se non ci credete, lanciate Nmap per
fare un portscan della vostra macchina e ve ne accorgerete da soli.
Fin qui tutto facile, no? Il difficile viene qui: editate il file "default" e
aggiungete una cosa come questa a quello che gia' esiste:
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile
/etc/apache2/ssl/apache.pem
SSLCertificateKeyFile /etc/apache2/ssl/apache.pem
BrowserMatch "MSIE [1-4]" nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
BrowserMatch "MSIE [5-9]" ssl-unclean-shutdown
SSLCipherSuite
ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
ServerAdmin webmaster@yourdomain
ServerName yourhost.yourdomain
DocumentRoot /var/www/apache2-default
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/apache2-default>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</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
Order allow,deny
Allow from all
</Directory>
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
ErrorLog /var/log/apache2/error.log-443
LogLevel warn
CustomLog /var/log/apache2/access.log-443 combined
ServerSignature On
Alias /icons/ "/usr/share/apache2/icons/"
Alias /manual/ "/usr/share/doc/apache2-doc/manual/"
<Directory "/usr/share/apache2/icons">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Riavviate il demone Apache e provate a digitare sul vostro browser
https://127.0.0.1
Se vi viene chiesto di accettare il certificato allora cio' significa che avete
fatto tutto per bene e che la connessione al vostro server web e' cifrata e sicura.
A riprova di questo, una volta accettato il certificato dovreste visualizzare un
lucchetto in basso a destra del vostro browser.
Perdonate l'ignoranza sui Virtual Host, ma sono alle prime armi anche io, con il
Pinguino, quindi portate pazienza, colmero' le lacune, prima o poi... :)
--------------------------------------------------------------------- Il matrimonio del secolo: Carlo e Diana? No, Php e MySQL... =P --------------------------------------------------------------------PHP, pero', mostra tutte le sue potenzialita' se associato a MySQL. L'installazione
di php4-mysql dovrebbe aver provveduto da sola a fare tutto il necessario, ma per
scrupolo provate a connettervi a un database MySQL da una pagina PHP.
Come fare? Beh, io posso provare a spiegarvelo, ma non sono ferratissimo con MySQL,
quindi prendete tutto con le pinze. Dunque, innanzitutto dovete "mettervi a posto"
MySQL: lanciate il demone nel caso fosse inattivo
# /etc/init.d/mysql start
All'atto dell'installazione, MySql crea due DB di default: il database chiamato
"mysql", che contiene tutto ciò che riguarda l'utenza MySQL e i permessi degli
stessi utenti, e "test", al quale si può accedere tranquillamente senza utente e
password e sul quale si puo' tranquillamente scrivere. Sara' questo il DB sul quale
faremo la prova di funzionamento: io non usero' PhpMyAdmin per le prossime
operazioni, vi avverto: preferisco la riga di comando... ;)
Dunque, bisogna intanto accedere al database "test", e lo si fa cosi':
$ mysql test
Dato questo comando (che potete lanciare anche dalla vostra shell utente, non e'
per nulla necessario essere root di sistema) vi ritroverete di fronte al prompt di
MySQL, che ha una forma di questo tipo:
mysql>
Il database non contiene nessuna tabella, come potete verificare con la seguente
operazione (occhio al punto e virgola, e' necessario per concludere ogni
istruzione, come in C)
mysql> SHOW TABLES;
(MySQL _non_ e' case-sensitive, metto il maiuscolo solo per evidenziare le parole
chiave)
Senza tabelle non potete fare un emerito tubo, mettiamola cosi'. Dobbiamo quindi
crearcene una, e la faremo in un modo semplicissimo
mysql> CREATE TABLE prova(voce1 INTEGER, voce2 VARCHAR(255));
nella quale andremo a mettere due campi, "voce1", che e' un intero, e "voce2", che
e' una variabile di tipo stringa di 255 caratteri, per dirla brutalmente.
Controllate con "SHOW TABLES;" l'avvenuta creazione della tabella (l'output sara'
una vera e propria tabella disegnata) e successivamente controllate che anche i
campi siano stati creati, utilizzando
mysql> DESC prova;
Ora inseriremo un record, tanto per non avere il DB vuoto
mysql> INSERT INTO prova VALUES (1, 'Ciao a tutti')
Per verificare che i dati siano stati inseriti correttamente, fate una select
mysql> SELECT * FROM prova;
Ci manca solo la verifica con PHP, vero? Bene, scrivete una paginetta come questa
<?php
al DB");
mysql_connect("localhost", "", "") or die("Impossibile connettersi
mysql_select_db("test") or die("Impossibile selezionare il DB");
$query="select * from prova";
$ris = mysql_query($query) or die(mysql_error());
$num_colonne=mysql_num_fields($ris);
for($i=0; $i<$num_colonne; $i++)
echo "<p>".mysql_field_name($ris, $i)."</p>\n";
while($riga=mysql_fetch_row($ris))
{
for($i=0; $i<$num_colonne; $i++)
echo $riga[$i]."<br>\n";
}
?>
Salvatela e provate a visualizzarla col vostro browser.
Se riuscite a visualizzare i dati significa che il DBMS funziona e non avete
bisogno di fare altro. In caso di errore consiglio di riconfigurare il modulo MySQL
per PHP con un bel
# dpkg-reconfigure php4-mysql
e rispondete sempre "Yes" alla domande che vi vengono poste. Per scrupolo,
riavviate Apache, operazione che comunque va fatta ogni volta che modificate i file
di configurazione inerenti al webserver.
Le operazioni di creazione database/tabelle e di inserimento dati si possono fare
anche con PhpMyAdmin, del quale gia' vi avevo accennato all'inizio di questo
articolo. Per accedere all'interfaccia web e' sufficiente digitare questo indirizzo
sul vostro browser
http://127.0.0.1/phpmyadmin
Vi ritroverete davanti a un form di autenticazione. Si dovrebbe riuscire a entrare
senza user e senza pwd, ma da me l'accesso "anonimo" funziona solamente se nel
campo "Nome utente" metto uno spazio bianco. E' molto probabile, cmq, che abbia
sbagliato qualcosa io, voi pero' provate lo stesso, per scrupolo... :)
Dovrebbe essere veramente tutto. Spero che questo articolo sia risultato abbastanza
comprensibile ai piu', di non aver fatto troppi errori e/o imprecisioni e che
quanto ho scritto sia stato utile... :)
Marco