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.info
comprado 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/