Activar HTTP/2 en Nginx con CentOS 7

HTTP/2 es la nueva versión para el procotolo de HyperText Transfer y que viene a cambiar la semántica de la aplicaciones HTTP. HTTP/2 significa una mejora para la actual versión 1.1. Una mejora y la mas notable es que crea una única conexión, en vez de crear multiples conexiones distintas para enviar toda la información. Otro agregado importante es que permite la compresión de cabeceras evitando enviar datos repetidos durante la conexión.

Para habilitarlo en Nginx, es necesario contar con la version 1.9.5 o superior. Para la distribución CentOS7 podemos encontrar la ultima versión de Nginx estable para la arquitectura x86_64 siguiendo este enlace.

Es importante mencionar que HTTP/2 solamente esta soportado con SSL por lo que sera necesario indicarlos en nuestro archivo de configuración de Nginx y crear (o bien comprar) los certificados SSL

Algo muy importante y es que tendremos que tener instalada la ultima versión de OpenSSL, en mi caso he usado la version 1.0.2h, por lo que primero descargaremos las fuentes y luego compilaremos esta versión. Las fuentes a utilizar la obtenemos en el siguiente enlace.

#yum -y groupinstall 'Development Tools' && yum -y install wget openssl-devel libxml2-devel libxslt-devel gd-devel perl-ExtUtils-Embed GeoIP-devel
#cd /opt
#wget -c https://www.openssl.org/source/openssl-1.0.2-latest.tar.gz -O /opt/openssl-1.0.2-latest.tar.gz

Despues de extraer, configuramos y compilamos:

# cd openssl-1.0.2h/
#./config
# make
# make test
# make install

Por ultimo, reemplazamos la actual version de OpenSSL con la recíen compilada:

# mv /usr/bin/openssl /root/
# ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
# openssl version
OpenSSL 1.0.2h  3 May 2016

Despues de tener la ultima versión de OpenSSL, es necesario descargar la ultima version de los SRPMS (Source RPM) de Nginx, lo puedes encontrar desde su repositorio.

# rpm -ivh http://nginx.org/packages/centos/7/SRPMS/nginx-1.10.1-1.el7.ngx.src.rpm
# sed -i "s|--with-http_ssl_module|--with-http_ssl_module --with-openssl=/opt/openssl-1.0.2h|g" /root/rpmbuild/SPECS/nginx.spec
# rpmbuild -ba /root/rpmbuild/SPECS/nginx.spec
# rpm -Uvh /root/rpmbuild/RPMS/x86_64/nginx-1.10.1-1.el7.centos.ngx.x86_64.rpm

Lo anterior ejecutado en la línea de comandos, le indicamos que descargue los SRPMS de Nginx, en mi caso, utilice la versión 1.10.1 , luego al archivo nginx.spec le indicamos el directorio con el que reconstruirá esa versión de Nginx con soporte para OpenSSL 1.0.2h por ultimo cionstruimos el RPM para Nginx, y posterior a ello, lo instalamos.

Luego de instalada la nueva versión, tan solo deberemos agregar a nuestro archivo de configuración nginx.conf o donde se encuentre el virtualhost , lo siguiente:

#IPv4 support:
listen 443 ssl http2;
#IPv6 support
listen [::]:443 ssl http2;

Con solo agregar http2 al listen de la configuración de Nginx tendremos habilitado la nueva versión del protocolo HTTP. Adicional a esto, deberíamos agregar algunos parámetros para incrementar la seguridad en el servidor web, como utilizar los cifrados populares y relativamente seguros, deshabilitar SSLv3 y TLSv1.0, habilitar TLSv1.2 TLSv1.1.

En la configuración agregaremos lo siguiente:

ssl_session_cache shared:SSL:10m;

ssl_prefer_server_ciphers on;
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";

Listo, comprobamos con el comando nginx -t que la configuración es correcta y pasamos a reiniciar el servicio de Nginx.

Puedes encontrar mas información en los siguientes enlaces:

7 tips for faster HTTP/2 performance

Nginx Documentation: Modules

Si tienes alguna duda, dejala en la caja de comentarios.