Configurar HTTP/2 en Nginx, Apache HTTPD, WildFly o Jetty

Escrito por el .
blog-stack planeta-codigo planeta-linux
Comentarios

HTTP/2 se puede usar ya, los principales navegadores web, servidores web y de aplicaciones ya han añadido el soporte necesario ofreciendo varias ventajas para los usuarios, desarrolladores, dispositivos cliente y los servidores. En varios de los servidores más ppulares la configuración necesaria no es complicada.

HTTP/2 es el protocolo que ha surgido para mejorar la experiecia de navegación de la web, proporcionará menos latencia y más velocidad siendo más eficiente. En la introducción al protocolo HTTP/2 comentaba de que necesidad surge, sus ventajas, alguna diferencia con HTTP 1.1, varias cosas que los desarrolladores hacíamos que quedarán obsoletas y otras varias que deberemos seguir haciendo. Se pubicó oficialmente en 2015 y los principales navegadores como Mozilla Firefox, Google Chrome y Microsoft Edge ya lo soportan.

En el lado del servidor varios servidores web también han incluido el soporte para HTTP/2, entre ellos Nginx, Apache HTTPD, WildFly y Jetty. Tomcat añadirá el soporte en la versión 9 cuando se publique las especificación de Servlets 4.0 con el soporte de HTTP/2, este soporte necesitará de ALPN que se incluirá en la versión 9 del JDK con lo que en el momento de publicar este artículo todavía quedarán varios meses. Para usar HTTP/2 en Nginx, Apache HTTPD, WildFly y Jetty debemos hacer algunos cambios en sus configuraciones.

Para usar HTTP/2 los navegadores Mozilla Firefox, Google Chrome y Microsoft Edge han anunciado que se necesitará cifrado, por lo tanto deberemos añadir el soporte para TLS/SSL en el servidor previamente.

Nginx

En Nginx es muy sencillo, deberemos modifificar el archivo de configuración default.conf para que quede de forma similar a la siguiente.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
server {
    listen       80;
    server_name  localhost;

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl http2 default_server;

    ssl_certificate    localhost.crt;
    ssl_certificate_key localhost.key;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

Apache HTTPD

En Apache HTTPD deberemos instalar el paquete nghttp2 de nuestra distribución. y usar el módulo mod_http2.so junto con mod_ssl.so para el cifrado.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
LoadModule http2_module modules/mod_http2.so
LoadModule ssl_module modules/mod_ssl.so

...

Listen 443

<VirtualHost *:443>
    ServerName localhost

    SSLEngine on
    SSLCertificateFile localhost.crt
    SSLCertificateKeyFile localhost.key
    Protocols h2 http/1.1
</VirtualHost>

WildFly

El WildFly deberemos descargar un archivo jar que ofrece el soporte para la negociación de protocolo, ALPN, según la versión del JDK que usemos de Maven Central. Modificamos el archivo de configuración bin/standalone.conf.

1
2
3
4
5
6
if [ "x$JAVA_OPTS" = "x" ]; then
   JAVA_OPTS="-Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Xbootclasspath/p:./alpn-boot-8.1.7.v20160121.jar"
   JAVA_OPTS="$JAVA_OPTS -Djboss.modules.system.pkgs=$JBOSS_MODULES_SYSTEM_PKGS -Djava.awt.headless=true"
else
   echo "JAVA_OPTS already set in environment; overriding default settings with values: $JAVA_OPTS"
fi

Y el archivo standalone/configuration/standalone.xml añadimos un nuevo listener para el subsistema de undertow con HTTP/2 habilitado y un Realm asociado para usar TLS/SSL.

1
2
3
4
5
6
7
...
      <subsystem xmlns="urn:jboss:domain:undertow:3.0">
            <buffer-cache name="default"/>
            <server name="default-server">
                <http-listener name="default" socket-binding="http" redirect-socket="https"/>
                <https-listener name="default-https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true"/>
...

Jetty

Dependiendo de la versión de Java, usaremos el módulo alpn adecuado, en el momento de escribir este artículo con la versión 1.8.0_74 del OpenJDK, modules/alpn-impl/alpn-1.8.0_74.mod.

1
2
3
4
5
6
7
8
[name]
protonego-boot

[files]
http://central.maven.org/maven2/org/mortbay/jetty/alpn/alpn-boot/8.1.7.v20160121/alpn-boot-8.1.7.v20160121.jar|lib/alpn/alpn-boot-8.1.7.v20160121.jar

[exec]
-Xbootclasspath/p:lib/alpn/alpn-boot-8.1.7.v20160121.jar
1
2
$ java -jar start.jar --add-to-startd=https,http2
$ java -jar start.jar