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