DevSecOps

15 dez, 2015

Habilitando HTTP/2 no Nginx

Publicidade

A partir do nginx 1.9.5, há suporte experimental para HTTP/2. Este artigo irá mostrar-lhe como ativar o HTTP/2 na sua configuração Nginx. Isso pode ser ativado ou desativado por vhost, ele não tem que ser ativado em todo o servidor.

Atenção: por um breve período, o Chrome deixou de suportar HTTP/2 no ALPN. Mas agora suporta NPN novamente, e o HTTP/2 vai funcionar em uma instalação recente de CentOS, Debian ou Ubuntu. Mais detalhes aqui.

HTTP/2 em Nginx no CentOS/Red Hat

Se você estiver em Red Hat ou CentOS, certifique-se de habilitar o repositório da linha principal para nginx. Essa é considerada uma versão experimental, o que poderia quebrar as coisas.

O seu repositório yum deve ser parecido com isto:

$ cat /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

Se você já tiver nginx instalado, atualize via yum clean all && yum update nginx ou instale nginx (se você já não o tiver) por meio de yum install nginx.

HTTP/2 em Nginx no Ubuntu/Debian

Se você estiver trabalhando com Debian ou Ubuntu, certifique-se as fontes de linha principal estão adicionadas ao seu arquivo /etc/apt/sources.list.

$ cat /etc/apt/source.list
...
deb http://nginx.org/packages/mainline/debian/ codename nginx
deb-src http://nginx.org/packages/mainline/debian/ codename nginx

Em seguida, atualize sua instalação nginx com apt-get clean && apt-get install nginx.

HTTP/2 no Nginx requer pelo menos a versão 1.9.5

Verifique se a sua versão nginx é pelo menos a 1.9.5.

$ nginx -v
nginx version: nginx/1.9.5

Qualquer coisa abaixo disso ainda não terá suporte para HTTP/2, e você será saudado com a seguinte mensagem de erro.

nginx: [emerg] invalid parameter "http2" in /etc/nginx/conf.d/ssl.conf:2
nginx: configuration file /etc/nginx/nginx.conf test failed

Habilitar HTTP/2 no Nginx

Agora, a fim de habilitar HTTP/2, você precisa ter um vhost SSL/TLS habilitado. Em outras palavras: você precisa de um certificado SSL, já que HTTP/2 só é aplicado sobre TLS.

Tornar o HTTP/2 habilitado é tão simples como permitir SPDY, é uma bandeira na diretiva listen na sua configuração de host virtual.

Adicione as palavras-chave http2 à sua configuração virtualhost.

server {
  listen        443 ssl http2;
  server_name   your.fqdn.tld;

  access_log    access.log main;
  error_log     error.log error;

  # Start the SSL configurations
  ssl                   on;
  ssl_certificate       /etc/nginx/conf.d/certificate.crt;
  ssl_certificate_key   /etc/nginx/conf.d/certificate.key;

  # Add any other TLS optimisations like strong ciphers etc ... 
  # ...
}

A habilitação é realmente simples assim, basta mudar a sua linha SSL disto:

server {
  listen        443 ssl;
  ...
}

para isto:

server {
  listen        443 ssl http2;
  ...
}

Atenção: você não pode misturar SPDY e HTTP/2. Se você tentar ativar ambos, você obterá um erro na inicialização do nginx.

nginx: [warn] invalid parameter "spdy": ngx_http_spdy_module was superseded by ngx_http_v2_module in /etc/nginx/conf.d/vhost.conf:12

Se você só quer brincar com HTTP/2, você pode criar um certificado SSL autoassinado, e implementar isso no seu vhost.

Falta de push do lado do servidor

Até agora, Nginx não suporta um dos recursos mais poderosos do HTTP/2: fazer push no lado do servidor. Apenas nghttp2 parece ter esse suporte neste momento.

Mas HTTP/2 traz uma série de melhorias, como multiplexação TCP, compressão de cabeçalho, menos sharding do domínio…, o que faz com que esse upgrade valha muito a pena.

Testando HTTP/2

Já há alguns benchmarks de HTTP/1.1 vs HTTP2 lá fora, mas o melhor teste é o que você pode fazer sozinho.

Já que Nginx agora torna realmente fácil habilitar HTTP/2, ativamos isso também em nosso site corporativo: www.nucleus.be. Quer testar o HTTP/2? Basta navegar em nucleus.be.

Se você está curioso para saber como detectar se você está em HTTP/1.1 ou HTTP2, você pode visualizar o protocolo HTTP/2 no seu Chrome Inspector.

Mais material de leitura sobre HTTP/2

Quer saber mais sobre HTTP/2? Aqui estão algumas sugestões:

***

Mattias Geniar faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: https://ma.ttias.be/enable-http2-in-nginx/