Quando viene avviato il demone httpd, una delle prime operazioni che svolge consiste nel mettersi in ascolto delle richieste in arrivo ad un dato hostname o indirizzo IP, ad una data porta.
Se il file di configurazione non viene alterato, per impostazione predefinita l'ascolto avviene su tutti gli indirizzi della macchina, ad una data porta, che di default è la porta 80, assegnata dall'IANA (Internet Assigned Numbers Authority) come porta standard per le connessioni HTTP. Questo comportamento può essere cambiato attraverso il file di configurazione, e sono possibili diverse combinazioni. Inoltre, se si utilizzano i virtual host (che tratteremo più appronditamente nel seguito di questa guida), una stessa istanza di httpd può servire contenuti diversi se le connessioni sono dirette a particolari indirizzi IP, hostname e porte.
La direttiva Listen
indica al server di accettare richieste in arrivo solo sulle porte o sulle combinazioni indirizzo-porta specificate. Se viene specificata solo la porta, il server ascolterà su tutte le interfacce di rete a disposizione a quella porta; se viene specificato anche l'indirizzo IP, il server ascolterà sull'interfaccia corrispondente. Vi possono essere diverse direttive Listen
. Per esempio, se si specificano le seguenti righe, httpd ascolterà sia sulla porta 80 che sulla porta 8000 su tutte le interfacce:
Listen 80
Listen 8000
Se invece si vuole che httpd stia in ascolto sulla porta 80 per un'interfaccia, e sulla porta 8000 per un'altra, si specificheranno i relativi indirizzi IP:
Listen 192.0.2.1:80
Listen 192.0.2.5:8000
Fin'ora si è supposto di utilizzare indirizzi IPv4. Nel caso in cui si voglia specificare un indirizzo IPv6, esso va racchiuso tra parentesi quadre.
Listen [2001:db8::a00:20ff:fea7:ccea]:80
Chiaramente, se due direttive Listen
, anche non consecutive, si sovrappongono, httpd non potrà essere avviato e verrà generato il seguente errore:
(48)Address already in use: make_sock: could not bind to address [::]:80
È opportuno ricordare come le porte inferiori a 1024 siano dette riservate: nei sistemi di tipo UN*X, questo significa che l'applicazione che intenda ricevere connessioni attraverso di esse deve essere eseguita con i privilegi di root; tutte le altre porte (fino alla 65536) possono essere aperte da qualunque utente. Tuttavia, la documentazione specifica che, per motivi di sicurezza, httpd si rifiuterà di essere eseguito con i privilegi di root. La prossima lezione renderà più chiara quest'apparente contraddizione.
Specificare il protocollo di comunicazione
È possibile specificare il protocollo da utilizzare per l'ascolto delle richieste su una data porta mediante l'argomento opzionale protocol
, che segue la porta o la coppia indirizzo:porta, in modo tale che possa essere determinato quale modulo di httpd debba gestire la richiesta ed eventualmente applicare ottimizzazioni particolari con la direttiva AcceptFilter
.
Si noti che spesso non è necessario specificare il protocollo: ciò è facoltativo se le porte scelte sono quelle standard IANA, e diventa obbligatorio farlo solo nel caso in cui si usino porte non standard. Se il protocollo non viene specificato, si presume che si voglia utilizzare il protocollo http
per tutte le porte tranne la 443, per la quale si presume che si voglia usare https
. Per esempio, se si vogliono accettare connessioni HTTPS sulla porta 8443, si specificherà:
Listen 192.170.2.1:8443 https
Porte e VirtualHost
Come si anticipava poc'anzi, una caratteristica interessante di httpd è quella di poter servire contenuti diversi in base all'indirizzo Internet e alla porta a cui viene indirizzata la richiesta, a parità di indirizzo IP. Questa caratteristica, che simula la presenza di diversi host fisici, è detta virtual hosting e viene implementata con l'omonima direttiva <VirtualHost>
che sarà oggetto di una trattazione specifica.
In questa sede è importante notare che, per rendere un VirtualHost accessibile, la porta o la combinazione indirizzo:porta cui fa riferimento dev'essere preventivamente riservata attraverso una direttiva Listen
. Se ciò non avviene, le connessioni all'host virtuale, per quanto correttamente configurato, saranno rifiutate.