HTTP/2
No se me ocurre mejor forma de estrenar el reciente Ubuntu Server 16.04 LTS, que probar la nueva versión de Nginx, que acaba de incorporar la compatibilidad con el protocolo HTTP/2.
HTTP/2 no es el futuro; es el presente. Sin embargo, la desidia y el conservadurismo de los administradores de sistemas demorarán su adopción como ya sucedió con SPDY. No voy a comentar las bondades del nuevo protocolo porque son conocidas por todos desde hace tiempo aunque el lanzamiento de la versión estable de Nginx con soporte se ha producido esta semana, coincidiendo con la actualización de la LTS de Ubuntu. para demostrar la facilidad de configuración del servidor web con HTTP/2, voy a montar un mirror estático de este blog en una máquina virtual.
Los prerrequisitos para este tutorial son:
- Ubuntu 16.04 Server
- Nginx 1.10.0
- OpenSSL
Por ahora, los repositorios oficiales no tienen la última (y necesaria) versión de Nginx, por lo que vamos a añadirla.
Descargamos e importamos la clave
wget http://nginx.org/keys/nginx_signing.key
sudo apt-key add nginx_signing.key
Editamos /etc/apt/sources.list con las correspondientes fuentes
Ya podemos actualizar APT y proceder a la instalación de Nginx.
deb http://nginx.org/packages/ubuntu/ xenial nginx
deb-src http://nginx.org/packages/ubuntu/ xenial nginx
Posteriormente, debemos crear la carpeta para alojar el blog en /var/www y descargar allí una copia de la versión de blogger, tal y como explico en esta otra entrada.
HTTP/2 sólo acepta conexiones seguras. Esto nos va a complicar más el trabajo, pero por otra parte, se agradece que los diseñadores de HTTP/2 hayan impuesto la utilización de SSL y TLS para dejar atrás las malas prácticas de algunos programadores web, que publican sus webs sin ningún tipo de protección. En mi caso, voy a crear mi propio certificado con OpenSSL porque la finalidad de este post es puramente informativa. Para hacerlo en un servidor real, recomiendo encarecida y exclusivamente el uso de Let's Encrypt, que también ha abandonado la beta hace relativamente poco tiempo. La seguridad que proporcionan nuestros propios certificados es la misma. El problema es que al no haber una CA que los distribuya, deberíamos encargarnos de pasar el certificado a todos los lectores del blog para que no les apareciera el apocalíptico mensaje de conexión insegura.
Empleamos el comando
sudo OpenSSL req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/lunaticgeek.key -out /etc/ssl/lunaticgeek.crt
que generará la clave privada y el certificado (clave pública) con una caducidad de un año, empleando un cifrado de 2048b con el algoritmo Rivest-Shamir-Adleman. Cuando lo ejecutemos, tendremos que rellenar algunos datos. El más importante es el último, el Common Name, que debe coincidir con nuestro dominio o IP. Las claves también pueden almacenarse en otros sitios, como /usr/local/ssl, si se prefiere.
Por último hay que configurar el servidor web, editando /etc/nginx/nginx.conf
server {
listen 443 default_server ssl http2;
ssl_certificate /etc/ssl/lunaticgeek.crt;
ssl_certificate_key /etc/ssl/lunaticgeek.key;
root /var/www/lunaticgeek;
index index.html;
}
Reiniciamos Nginx
sudo service nginx reload
Ya lo podemos probar! La forma más sencilla de comprobar que una web transmite en HTTP/2 es instalar una extensión para Chrome llamada HTTP/2 and SPDY indicator que muestra un pequeño rayo azul en caso de que todo funcione correctamente.
Como hemos visto, implantar HTTP/2 en nuestro servidor web es sencillo y rápido, así que la única excusa para no adoptarlo es que dependamos de los servicios (CMS) de terceros que no hayan incorporado todavía esta mejora tan necesaria y beneficiosa.