Debian jessie nginx com openssl 1.0.2 para usar ALPN ao invés de NPN

14

Estou executando o debian jessie no meu servidor e atualizei recentemente para o novo servidor web nginx com suporte a http / 2 (nginx 1.10). Como hoje, ele funciona muito bem e o servidor da web está fornecendo conteúdo com o protocolo http2.

Eu li que o chrome está descartando o suporte a NPN e só permite o ALPN após 15.5.2016. ALPN é uma extensão, que requer o openssl 1.0.2 instalado, mas no debian jessie é apenas o openssl 1.0.1 (também nos backports do debian e em outros repositórios, não há versão do openssl 1.0.2 para este debian).

E existe o problema - eu atualizei do SPDY para o http2 e, em alguns dias, terei que desativar o http2 e não poderá usar o SPDY porque esta versão do nignx possui apenas http2. Eu também li que esta versão do debian continuará com o openssl 1.0.1 e somente o debian stretch terá o openssl 1.0.2. Mas, para a data de lançamento, há quase um ano e o chrome estará desativando o suporte em breve, então não quero perder o benefício do protocolo http2.

Existe alguma solução, como instalar o openssl 1.0.2 neste sistema, sem criar uma compilação própria (manutenção incorreta) ou esperar pelo repositório de backports? Também não quero duas versões do openssl no meu sistema se uma delas precisar ser vinculada e mantida manualmente.

Obrigado por qualquer ajuda.

Juraj Nemec
fonte
Você poderia usar apt pinninge usar opensslfora de Debian stretch.
gf_
@gf_ Com um risco muito alto de danificar seu sistema. Muitas coisas dependem do OpenSSL.
Michael Hampton
@ MichaelHampton Bem, não posso julgar sobre o nível de risco, duvido que seja muito alto. Eu estou indo com Kurt Roeckx, um dos mantenedores, que tentou obter 1.0.2em jessieapenas logo após o congelamento (que foi rejeitada na época): ". Esta versão deve ser compatível com a versão 1.0.1 Eu não espero nada para passar de 1.0.1 para 1.0.2. " (Eu seria mais conscientes de libc6.)
gf_
@gf_ "Entrá-lo" nesse contexto exigiria recompilar tudo o que usa o OpenSSL. Não estou surpreso que isso tenha sido rejeitado; O Debian gosta de velho e estável. No contexto de sua sugestão, significa também incluir todos os pacotes extensíveis que usam OpenSSL, e isso é muita coisa.
Michael Hampton
@MichaelHampton Estou bastante ciente das políticas do Debian e também não estou surpreso que isso tenha sido rejeitado na época (não queria dizer isso ou criar essa impressão). Mas: (talvez o meu texto estava incorreto): Fazer apt-get install -t stretch nginx(em uma de baunilha Debian jessiecom nginxinstalado) vai puxar em: nginx nginx-common nginx-full libnginx-mod-http-auth-pam libnginx-mod-http-geoip libnginx-mod-http-image-filter libnginx-mod-http-xslt-filter libnginx-mod-mail libnginx-mod-stream libssl1.0.2. (Estes são os dez pacotes ..)
gf_

Respostas:

16

Atualização 08/08/2016: nginx in jessie-backports(a versão 1.9.10-1~bpo8+3foi criada openssl >= 1.0.2~. Começar a ALPNtrabalhar agora se a execução jessieexigir apenas os pacotes jessie-backports, não há mais necessidade de extrair pacotes stretch.

-

Resposta original: Bem, aqui está a minha resposta, de acordo com os comentários: Na minha opinião, não existem muitas maneiras de resolver isso até hoje, 09/05/2016. Basicamente, você deve tentar, de alguma forma, criar um nginxsistema moderno em seu sistema, compilado >= openssl 1.0.2~.

As únicas duas opções que vejo atualmente: Ou você compila por si mesmo, o que não deseja, o que é bastante compreensível, ou extrai pacotes modernos do Debian stretchseu sistema. Isso envolve alguns riscos, porque você está misturando um ambiente estável com outro, mas, na minha opinião, esses riscos são bastante baixos, porque você está usando Debian.

Então, vamos tentar isso:

  • Adicione o Debian stretchrepositório ao seu apt sources. Não use /etc/apt/sources.listpara isso, mas use um arquivo dedicado /etc/apt/sources.list.d/para mantê-lo limpo, pessoalmente, estou usando stretch.list.

    Coloque estas linhas lá dentro:

    deb http://httpredir.debian.org/debian/ stretch main contrib non-free
    deb-src http://httpredir.debian.org/debian/ stretch main contrib non-free
    
    deb http://security.debian.org/ stretch/updates main contrib non-free
    deb-src http://security.debian.org/ stretch/updates main contrib non-free
    
    # stretch-updates, previously known as 'volatile'
    deb http://httpredir.debian.org/debian/ stretch-updates main contrib non-free
    deb-src http://httpredir.debian.org/debian/ stretch-updates main contrib non-free
    
  • Configure o apt pinning para garantir que você apenas puxe pacotes dos Debian stretchquais você está especificando. O arquivo a ser usado para isso é /etc/apt/preferences, lá dentro, coloque:

    Package: *
    Pin: release n=jessie
    Pin-Priority: 900
    
    Package: * 
    Pin: release a=jessie-backports
    Pin-Priority: 500
    
    Package: *
    Pin: release n=stretch
    Pin-Priority: 100
    

    (Pode ser necessário alterar os pacotes e as prioridades para se adequar ao seu ambiente.)

  • Execute apt-get update(via sudo/ as root) para atualizar o cache do pacote.

  • Instale nginxde Debian stretch: apt-get install -t stretch nginx(faça isso por sudo/ as root). Lucro!

  • Como descrevi no (s) meu (s) comentário (s), para reduzir ainda mais os riscos envolvidos, você pode usar algo como um chroot ou uma solução de contêiner como o LXC . Caso você queira seguir o chrootcaminho, é necessário configurar uma interface de rede lá dentro: Para fazer isso, dê uma olhada neste post do blog, por exemplo , que fornece uma introdução ao network namespaces.

  • Espero que isto ajude; Caso tenha mais dúvidas, entre em contato comigo. Gostaria de receber feedback e estou interessado em como vai.

gf_
fonte
Instalei o nginx hoje pela descrição da sua resposta e tudo parece funcionar muito bem! A única coisa que eu precisava fazer foi extrair a instalação antiga do nginx, porque eu tinha o nginx 1.10 do repositório nginx e essa versão não é compatível com o pacote de repositórios debian (mas fiz isso também quando estava atualizando o debian nginx para 1,10, por isso não foi problema). Obrigado pelo seu esforço e ajuda!
Juraj Nemec
@JurajNemec Great! Muito obrigado pelo feedback! Você ALPNjá procurou por suporte?
Gf_ # 15/16
Sim. Verificado pelos testes http2 e SSL Labs , nos dois estados, que há suporte ao ALPN. Também nginx -Vfornece informações de que a versão é compilada com o openssl 1.0.2+. Então, eu acho que está funcionando corretamente.
Juraj Nemec
@JurajNemec Ótimo, parece bom! Se possível, eu estaria interessado em obter uma pequena atualização depois que você executou essa configuração por um tempo, talvez quatro ou oito semanas. Obrigado!
Gf_ # 15/16
@JurajNemec Parece que o Google fez a troca e removeu o NPN. Sua configuração ainda funciona conforme o esperado?
gf_ 29/05
11

Outro método é instalar o OpenSSL 1.0.2 a partir do jessie-backports e usar as versões Ubuntu 16.04 LTS do próprio repositório do nginx. Dessa forma, você está usando pelo menos um pacote OpenSSL criado para Jessie.

Adicionar a /etc/apt/sources.list:

# jessie-backports, from stretch-level but with no dependencies
deb http://httpredir.debian.org/debian/ jessie-backports main contrib non-free
deb-src http://httpredir.debian.org/debian/ jessie-backports main contrib non-free

# Nginx repository - use Ubuntu 16.04 LTS Xenial to get packages compiled with OpenSSL 1.0.2
deb http://nginx.org/packages/mainline/ubuntu/ xenial nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ xenial nginx

Então corra:

apt-get update
apt-get install -t jessie-backports openssl
apt-get install nginx

Obviamente, isso coloca você em uma configuração oficialmente não suportada, mas talvez seja melhor do que não ter um pacote - e funcionou para mim. Além disso, o uso do repositório nginx significa que você recebe atualizações novas.

GreenReaper
fonte
Você poderia elaborar / esclarecer por que alguém seguiria esse caminho? Em relação a "Além disso, o uso do repositório nginx significa que você recebe novas atualizações.": Você está recebendo "novas atualizações" também da maneira que descrevi.
gf_ 12/07
Os pacotes do nginx são atualizados no mesmo dia do lançamento, porque fazem parte do processo de lançamento, não do processo de lançamento do Debian. Eu incluí os pacotes da linha principal, não os pacotes estáveis, mas você pode ficar estável apenas removendo / linha principal nos caminhos acima. Qual você prefere é com você.
GreenReaper
Para expandir o exposto acima: stretch é a versão atual de 'testing' e, portanto, possui um atraso mínimo com base em quanto tempo leva para sair dos testes ; e isso pressupõe que ele se torne instável imediatamente - por exemplo, a 1.10.0 foi lançada em 26 de abril , mas empurrada para instável em 29 de abril e migrada para estender em 5 de maio ( consulte PTS ).
GreenReaper
1
Estou bastante ciente desses fatos, obrigado. :) Acho que a pergunta se resume a se é necessário "novos pacotes" (apenas porque (?)) Se você estiver tentando fornecer serviços estáveis. AFAIK, muitas pessoas escolhem o Debian (e este é o sistema operacional sobre o qual a questão se refere) porque é estável. Existe algum risco envolvido na execução de novas versões de software. De qualquer forma, acho que não há regra geral de como lidar com isso, porque ambientes, expectativas e necessidades diferem. Além disso: obrigado pela sua opinião, tenho certeza que é de valor para as pessoas; minhas falas antes não significam nenhum tipo de ofensa.
gf_ 13/07/2016
1
Como você diz, é uma questão de grau. Se você quer estar no limite, pode compilar builds diariamente. No meu caso, sendo pelo menos no líder borda tecnologia-wise é um plus. O ALPN em si provavelmente não é uma necessidade para a maioria dos sites - mas é altamente desejado por aqueles que desejam usar o HTTP / 2 (especialmente se você já o tiver usando enquanto usa o NPN); e é mais provável que esse grupo-alvo se interesse pelo tipo de recurso que aparece no nginx da linha principal antes do stable. Eu gerencio dez nós de cache e geralmente o teste em um menor para testar sob carga antes de implementá-lo ainda mais.
GreenReaper
0

Outro método é usar o jessie-backports e reconstruir facilmente o nginx

adicione ao /etc/apt/sources.list backports

deb http://ftp.debian.org/debian jessie-backports main

e depois execute como root

apt-get update
apt-get install -t jessie-backports openssl

e depois recrie o nginx. Siga as instruções em https://wiki.debian.org/BuildingAPackage

StanleyD
fonte
"[...] ou você compila para si mesmo, o que não quer fazer [...]"
gf_ 26/07
0

Para mim, a maneira mais fácil de corrigir isso era usar uma imagem diferente do Nginx Docker, consulte a compilação oficial do Nginx no Docker Hub . A versão padrão do Docker Nginx usa o Debian Jessie para que não resolva o problema, mas eles também oferecem uma versão alternativa baseada no Alpine Linux . Suas versões mais recentes usam o OpenSSL 1.0.2!

Portanto, esta solução pressupõe que você instalou o Docker e que está bem ao executar o Nginx em Alpine Linuxvez de Debian Jessie.

Para iniciar seu contêiner Nginx:

sudo docker run --name nginx-container -p 80:80 -p 443:443 -v /path/to/your/nginx/directory/:/etc/nginx/ /path/to/your/files/to/serve/:/usr/share/nginx/html/ -d nginx:1.11-alpine

Breve explicação para você começar com o Docker:

  • docker run: baixa a imagem do Docker (neste caso nginx:1.11-alpine) se você ainda não a possui e inicia um contêiner do Docker com base nessa imagem
  • --name nginx-container: nomeia o contêiner do Docker (você pode exibir todos os contêineres do Docker em execução usando sudo docker psou use sudo docker ps -atambém para exibir os contêineres parados)
  • -p 80:80 -p 443:443: liga as portas 80 e 443 na máquina host às portas 80 e 443, respectivamente, no contêiner do Docker
  • -v /path/to/your/nginx/directory/:/etc/nginx/: monta o diretório em seu sistema host que contém sua configuração do Nginx no /etc/nginx/diretório no contêiner do Docker
  • /path/to/your/files/to/serve/:/usr/share/nginx/html/: monta um diretório em seu sistema host que contém arquivos que você deseja que o Nginx sirva
  • -d: inicia o contêiner em segundo plano (você pode parar o contêiner usando docker stop nginx-container)
  • nginx:1.11-alpine: use esta imagem para iniciar seu contêiner (as imagens oficiais do Nginx Docker estão listadas aqui )

Também é útil:

  • use sudo docker exec nginx-container <command>para executar um comando no contêiner, por exemplo, sudo docker exec nginx-container nginx -s reloadpara recarregar o Nginx depois de alterar os arquivos de configuração no sistema host
  • Ou use sudo docker exec -it nginx-container bashpara inserir um shell bash no contêiner para que você possa trabalhar diretamente lá (não recomendado, mas às vezes útil)
Sicco
fonte
0

Na minha situação, usei o repositório apt do Dotdeb. As instruções deste site oferecem a opção de adicionar um repositório que permite instalar o Nginx com suporte HTTP2 "completo". A versão atual é a 1.14, que é um pouco menor do que a última versão, portanto você não ficará muito atrás (o backport atual é a 1.10).

HarmenB
fonte