Una volta scaricata la ISO di Ubuntu Server 14.04 dal sito ufficiale, procediamo all’installazione. Per semplicità, accettiamo tutte le impostazioni di default che ci vengono proposte, con due eccezioni:
Selezionando i software in figura, saremo sicuri di installare Apache, PHP e MySQL, che ci serviranno per i passi successivi.
Poiché si tratta di un server, si ritiene opportuno installare automaticamente gli aggiornamenti.
Installazione del server HTTP/2
Per prima cosa è necessario installare alcune dipendenze.
$ sudo apt-get install build-essential autotools-devlibtoolpkg-config \
zlib1g-dev libcunit1-dev libssl-dev libxml2-dev libev-devlibevent-devlibjansson-dev \
libjemalloc-devcython python3.4-dev gitlibboost-devlibboost-thread-dev apache2-dev
Spdylay
Se vogliamo che nghttpx funga anche da proxy per SPDY, è necessario installare un’apposita libreria di supporto, chiamata spdylay, sviluppata da Tatsuhiro Tsujikawa. Per installarla è sufficiente eseguire i comandi che seguono:
$ git clone https://github.com/tatsuhiro-t/spdylay
$ cd spdylay
$ autoreconf -i
$ automake
$ autoconf
$ ./configure –prefix=/usr/local
$ make
$ sudo make install
$ sudo ldconfig
Nghttp2
Nghttp2 è la libreria C che utilizzeremo per fornire il supporto al nuovo protocollo, creata anch’essa da Tatsuhiro Tsujikawa. Per compilarla ed installarla occorre eseguire i seguenti comandi:
git clone https://github.com/tatsuhiro-t/nghttp2
$ cd nghttp2
$ autoreconf -i
$ automake
$ autoconf
$ ./configure –enable-asio-lib –prefix=/usr/local
$ make
$ sudo make install
$ sudo ldconfig
Configurazione di nghttpx
Una volta installato nghttpx, è possibile procedere alla configurazione del proxy. Sebbene sia possibile utilizzarlo in maniera interattiva, nghttpx può funzionare in modalità daemon, restando in background in attesa di richieste da soddisfare.
Per eseguire nghttpx in quest’ultima modalità è necessario:
- creare un utente non privilegiato nghttpx, dedicato e con gli accessi disabilitati;
- creare un file di configurazione, /usr/local/etc/nghttpx/nghttpx.conf;
- creare un job file per Upstart, /etc/init/nghttpx.conf, per la gestione del ciclo di vita del daemon.
Possiamo creare l’utente nghttpx con i comandi seguenti:
$ sudo useradd nghttpx
$ sudo passwd –l nghttpx
Il file di configurazione di nghttpx può essere così creato:
sudo nano /etc/init/nghttpx.conf
I parametri usati per questa guida sono i seguenti:
#
# Configuration file for nghttpx.
#
# * Line staring '#' is treated as comment.
#
# * The option name in the configuration file is the long command-line
# option name with leading '--' stripped (e.g., frontend). Put '='
# between option name and value. Don't put extra leading or trailing
# spaces.
#
# * The options which do not take argument in the command-line *take*
# argument in the configuration file. Specify 'yes' as argument
# (e.g., http2-proxy=yes). If other string is given, it disables the
# option.
#
# * To specify private key and certificate file, use private-key-file
# and certificate-file. See the examples below.
#
# * conf option cannot be used in the configuration file. It will be
# ignored.
#
# Examples:
#
frontend=0.0.0.0,3000
backend=127.0.0.1,80
private-key-file=/usr/local/etc/nghttpx/nghttpx.key
certificate-file=/usr/local/etc/nghttpx/nghttpx.crt
accesslog-file=/var/log/nghttpx/access.log
errorlog-file=/var/log/nghttpx/error.log
http2-proxy=no
workers=1
Analizziamo brevemente le chiavi di configurazione:
Opzione | Descrizione |
---|---|
frontend |
Indirizzo e porta di ascolto di nghttpx |
backend |
Indirizzo e porta di ascolto di Apache |
private-key-file |
File della chiave privata usata per generare il certificato SSL |
certificate-file |
File del certificato TLS |
accesslog-file |
File di log degli accessi |
errorlog-file |
File di log degli errori |
http2-proxy |
Abilita, se posta a yes , la modalità secureproxy |
workers |
Numero di workerthread da utilizzare per gestire le richieste |
Dopo aver salvato il file ed essere usciti dall’editor di testo, occorre creare la cartella e i file vuoti di log, ed impostare i permessi corretti per tutti i file
sudo chownroot:root /usr/local/etc/nghttpx/nghttpx.conf
sudo chmod 0600 /usr/local/etc/nghttpx.conf
sudo mkdir –p /var/log/nghttpx /usr/local/etc/nghttpx
sudo touch /var/log/nghttpx/access.log
sudo touch /var/log/nghttpx/error.log
sudo chown –R nghttpx::nghttpx /var/log/nghttpx
Come si anticipava precedentemente, le comunicazioni saranno cifrate con TLS. Se li abbiamo già a disposizione, ad esempio perché già acquistati, possiamo porre la chiave privata ed il certificato nei percorsi indicati nel file di configurazione.
In alternativa si può pensare di generare un certificato self-signed come mostrato fra breve.
Creazione del job file
È possibile creare il job file per Upstart aprendo nano:
$ sudo nano /etc/init/nghttpx.conf
e scrivendo quanto segue:
# nghttpx - nghttpx job file
# For reference, see:
# https://help.ubuntu.com/community/UbuntuBootupHowto
# http://upstart.ubuntu.com/cookbook/
# man 5 init
description "nghttpx HTTP/2 proxy"
author "EmanueleCipolla<emanuele@emanuelecipolla.net>"
# Stanzas
#
# Stanzas control when and how a process is started and stopped
# See a list of stanzas here: http://upstart.ubuntu.com/wiki/Stanzas#respawn
env USER=nghttpx
# When to start the service
start on runlevel [2345]
# When to stop the service
stop on runlevel [016]
# Automatically restart process if crashed
respawn
# Essentially lets upstart know the process will detach itself to the background
expect fork
script
exec /usr/local/bin/nghttpx -D --conf=/usr/local/etc/nghttpx/nghttpx.conf --pid-file=/var/run/ng
httpx.pid
end script
Dopo aver salvato il file e chiuso nano, si possono impostare proprietario e permessi corretti per il file appena creato, e provare ad avviare nghttpx:
$ sudo chown root:root /etc/init/nghttpx.conf
$ sudo chmod 0600 /etc/init/nghttpx.conf
$ sudo initctl reload-configuration
$ sudo service nghttpx start
Generare un certificato self-signed
Per generare un certificato self-signed, abbiamo innanzitutto bisogno di ottenere una chiave privata:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /usr/local/etc/nghttpx/nghttpx.key -out /usr/local/etc/nghttpx.crt
Dovremo inserire le informazioni della nostra organizzazione e un “common name”, che dovrebbe corrispondere al nome dell’host su cui viene installato il certificato. Riempire gli altri campi è facoltativo, con l’eccezione della password, che non andrebbe inserita, in quanto verrebbe richiesta a ogni avvio del server.
Test di funzionamento
Supponendo che l’indirizzo IP del server HTTP/2 sia 10.211.55.17, è possibile verificare il suo corretto funzionamento collegandosi all’indirizzo https://10.211.55.17:3000.
Effettuando una connessione di test si potrà notare che, se è stato scelto l’utilizzo di un certificato self-signed, Firefox chiederà all’utente di assumersi la responsabilità di accettare un certificato non affidabile.
Rispondendo affermativamente, la pagina di test di Apache di Ubuntu viene visualizzata.
Si può verificare dal file /var/log/nghttpx/access.log che l’accesso è avvenuto usando il protocollo HTTP/2:
10.211.55.2 - - [20/Apr/2015:00:42:50 +0200] "GET / HTTP/2" 200 3256 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:37.0) Gecko/20100101
Firefox/37.0"
10.211.55.2 - - [20/Apr/2015:00:42:51 +0200] "GET /icons/ubuntu-logo.png HTTP/2" 404 294 "https://10.211.55.17:3000/" "Mozilla/5.0 (Macintosh; Intel Mac OS
X 10.9; rv:37.0) Gecko/20100101 Firefox/37.0"
10.211.55.2 - - [20/Apr/2015:00:42:51 +0200] "GET /favicon.ico HTTP/2" 404 284 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:37.0) Gecko/20100101
Firefox/37.0"
10.211.55.2 - - [20/Apr/2015:00:44:07 +0200] "GET /favicon.ico HTTP/2" 404 284 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:37.0) Gecko/20100101
Firefox/37.0"
10.211.55.2 - - [20/Apr/2015:00:44:11 +0200] "GET /icons/ubuntu-logo.png HTTP/2" 404 294 "https://10.211.55.17:3000/" "Mozilla/5.0 (Macintosh; Intel Mac OS
X 10.9; rv:37.0) Gecko/20100101 Firefox/37.0"