Nginx es un servidor web de código abierto robusto, rápido, confiable y dinámico popular para servir sitios de alto tráfico. Además, es bien conocido por su facilidad de configuración, alta escalabilidad y compatibilidad con una gran variedad de protocolos.
Entre los protocolos admitidos por Nginx se encuentra el nuevo protocolo HTTP/2, cuya principal ventaja sobre su predecesor HTTP 1.1 es la alta velocidad de transferencia requerida para sitios web ricos en contenido.
En esta guía, profundizaremos en la instalación y configuración de un servidor Nginx seguro con soporte HTTP/2:
Requisitos
Para comenzar, revisemos la verificación de vuelo y veamos si tenemos lo siguiente
- Una instancia de servidor de Ubuntu 18.04 LTS
- Nginx versión 1.9.5 o superior (para verificar la versión de Nginx, ejecute
nginx -v), lea Instalar Nginx en Ubuntu 18.04. - OpenSSL versión 1.0.2 o superior (verifique la versión usando la versión de openssl)
- Un usuario normal, no root, con privilegios sudo
- Un nombre de dominio completo (FQDN) En este caso, vamos a utilizar
crazytechgeek.infocomprado en GoDaddy.El registro A del nombre de dominio debe apuntar a la dirección IP del servidor. crazytechgeek.info ha sido apuntado a 216.200.116.207.

- Un certificado SSL (ya sea un certificado autofirmado o uno de Let's encrypt SSL. Del mismo modo, puede comprar uno de un proveedor diferente.
Paso 1:habilitar la compatibilidad con HTTP/2.0
Para empezar, se supone que ha configurado el bloqueo del servidor Nginx en
/etc/nginx/sites-available/your_domain
En nuestro caso, el bloque del servidor es /etc/nginx/sites-available/crazytechgeek.info .
Usando su editor de texto favorito, abra el archivo de bloqueo del servidor y localice el listen directiva como se muestra

La primera directiva indica conexiones IPv6 mientras que la segunda es para conexiones IPv4
Ahora, vamos a modificar cada directiva para incluir un http2 bandera como se muestra

Esto le indicará a Nginx que use HTTP/2 en navegadores compatibles
Guarde el archivo de configuración y salga de su editor.
A continuación, abra /etc/nginx/sites-available/default archivo y hacer los mismos cambios
Guarde y salga del editor de texto.
Solo para asegurarse de que no haya errores de sintaxis en ninguno de los archivos Nginx, ejecute el siguiente comando
$ sudo nginx -t Salida

Paso 2:depuración de cifrados antiguos e inseguros
Para que HTTP/2 funcione como se espera, debemos evitar el uso de cifrados antiguos e inseguros que han estado en la lista negra de HTTP/2. Los conjuntos de cifrado son algoritmos criptográficos que dictan cómo se debe cifrar el tráfico.
Si se usó certbot para obtener los certificados, entonces los cifrados en la ruta /etc/letsencrypt/options-ssl-nginx.conf no son lo suficientemente seguros para HTTP/2. Sin embargo, la modificación de este archivo solo causará errores y evitará que certbot aplique actualizaciones. Esto significa que debemos especificar nuestra lista de cifrados e indicarle a Nginx que ignore el archivo
Abra el archivo de configuración para el bloque del servidor de dominio de Nginx
$ vim /etc/nginx/sites-available/crazytechgeek.info Comenta esta línea
# include /etc/letsencrypt/options-ssl-nginx.conf; Debajo de esa línea, agregue la línea a continuación para definir los cifrados permitidos
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; Guarde el archivo y salga del editor de texto
Si se utilizó un certificado autoasignado o un certificado de terceros, abra el archivo
/etc/nginx/snippets/ssl-params.conf $ sudo vim /etc/nginx/snippets/ssl-params.conf Localice la línea como se muestra a continuación
...
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
...
Modifique el archivo como se muestra a continuación
...
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
Finalmente guarde y salga del archivo de configuración
Una vez más, verifique si hay errores de configuración de Nginx
$ sudo nginx -t Si todo salió bien, debería ver el resultado a continuación como se muestra anteriormente

Reiniciar Nginx
$ sudo systemctl reload nginx En el siguiente paso, vamos a probar si nuestro servidor puede servir páginas HTTP/2
Paso 3:probar si HTTP/2 está habilitado
Ahora probemos si HTTP se está ejecutando y habilitado en nuestro servidor web Nginx
En su terminal, ejecute el siguiente comando
curl -I -L https://your_domain En nuestro caso, será
curl -I -L https://crazytechgeek.info Salida

Alternativamente, puede verificar HTTP/2 abriendo las herramientas de desarrollo de Google presionando
Ctrl + Shift + I
A continuación, haga clic en Network Pestaña
En el Protocol columna, asegúrese de encontrar la etiqueta h2

Paso 4:implementación de seguridad de transporte estricta de HTTP
Por último, aunque sabemos muy claramente que nuestro servidor puede redirigir solicitudes HTTP a HTTPS, queremos habilitar HSTS HTTP Strict Transport Security para eliminar dichos redireccionamientos. Si un navegador encuentra un encabezado HSTS, no intentará conectarse al servidor nuevamente durante un cierto período de tiempo. TI solo intercambiará datos a través del protocolo HTTPS seguro y encriptado.
Para lograr esto, abra el archivo de configuración de Nginx
$ vim /etc/nginx/nginx.conf Agregue la línea a continuación
add_header Strict-Transport-Security "max-age=15768000" always;
max-age se establece en segundos
Si su sitio tiene subdominios y desea aplicar HSTS a todos ellos, agregue el includeSubDomains bandera al final de la línea
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always; Guarde y salga del archivo de configuración.
Como siempre, comprueba si hay algún error
$ sudo nginx -t

Finalmente, reinicie Nginx
$ sudo systemctl restart nginx Conclusión
En este punto, su servidor Nginx ahora está sirviendo páginas HTTP/2.
También puede visitar https://tools.keycdn.com/http2-test para probar el estado HTTP/2 de su sitio como se muestra
Alternativamente, también puede visitar este sitio
https://http2.pro/

Para obtener resultados más detallados, use
https://www.ssllabs.com/ssltest/
