Problema; habilitar o protocolo http2 no nginx (centos 6)

0

Eu tenho um servidor loadbalancer (nginx). O tráfego chega aos servidores de balanceamento de carga e os encaminha para os servidores da web internos (com upstream). (Meus servidores internos da web também são nginx.)

Eu tenho um arquivo de configuração como abaixo. Eu tenho muitos arquivos de configuração como este arquivo de configuração em loadbalancers. (Para diferentes subdomínios).

Eu quero executar o tráfego 80 e 443 compatível com o protocolo "http2". Gostaria de ativar o protocolo http2 no meu servidor web. Eu adiciono o parâmetro "http2" após o comando "listen 80" ou "listen 443". Tudo é normal até esta parte. (Talvez seja normal para mim ..)

Eu tenho algumas perguntas depois desta seção.

  • 1: Todos os artigos na internet, feitos para a porta 443. Isso tem uma causa especial e eu não posso fazê-lo pela porta 80?

  • 2: Quando eu adiciono o parâmetro "http2" a vários arquivos de configuração no diretório "/etc/nginx/conf.d" como abaixo, o site não abre. Sempre que atualizo o site, ele está tentando fazer o download da página. Mas quando eu removo os parâmetros http2, o problema é resolvido. Por que isso está acontecendo? Além disso, o nginx configtest não fornece um erro.

  • 3: Existe alguma informação que você possa me recomendar a esse respeito?

#

[root@lbserver1 ~]# nginx -v

nginx version: nginx/1.12.0

[root@lbserver1 ~]# cat /etc/redhat-release

Red Hat Enterprise Linux Server release 6.7 (Santiago)

upstream k-testserver-pool  {
   # ip_hash;
   server testserver.k.local;
}

server {
   listen 80 http2;
   server_name test.www.example.com test.example.com;
   error_log /var/log/nginx/test.www.example.com.80.error.log;

   set $mobile_rewrite_status D;

   large_client_header_buffers 4 16k;

   add_header Set-Cookie "device_type=desktop; Path=/; Domain=test.www.example.com";

   location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $remote_addr;
      proxy_set_header Host $host;
      proxy_pass http://k-testserver-pool;
      proxy_intercept_errors on;

      fastcgi_read_timeout 600;
      proxy_connect_timeout 600;
      proxy_send_timeout 600;
      proxy_read_timeout 600;
      send_timeout 600;
   }

   location ~* \.(pdf|css|js|png|gif|jpg|jpeg|ico|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx)$ {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $remote_addr;
      proxy_set_header Host $host;
      proxy_pass http://k-testserver-pool;
      expires 7d;
      add_header Cache-Control "public";
   }

   location ~ /\.ht {
      deny all;
   }
}


server {
   listen 80 http2;
   server_name test.m.example.com test.webapp.example.com;
   error_log /var/log/nginx/test.www.example.com.80.error.log;

   large_client_header_buffers 4 16k;
   add_header Set-Cookie "device_type=mobile; Path=/; Domain=test.m.example.com";

   location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $remote_addr;
      proxy_set_header Host $host;
      proxy_pass http://k-testserver-pool;
      proxy_intercept_errors on;
      fastcgi_read_timeout 300;
   }

   location ~* \.(pdf|css|js|png|gif|jpg|jpeg|ico|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx)$ {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $remote_addr;
      proxy_set_header Host $host;
      proxy_pass http://k-testserver-pool;
      expires 7d;
      add_header Cache-Control "public";
   }

   location ~ /\.ht {
      deny  all;
   }
}

server {
    listen 443 ssl http2;
    server_name test.www.example.com test.example.com;

    ssl on;
    ssl_certificate /etc/nginx/ssl/www.example.com.crt;
    ssl_certificate_key etc/nginx/ssl/www.example.com.key;
    ssl_ciphers  ...+3DES:DH+3DES:RSA+AES:RSA:!aNULL:!MD5:!DSS;....
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

    large_client_header_buffers 4 16k;

    location / {
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-Proto https;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_pass http://k-testserver-pool;
       proxy_intercept_errors on;
       fastcgi_read_timeout 300;
    }

    location ~* \.(pdf|css|js|png|gif|jpg|jpeg|ico|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx)$ {
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $remote_addr;
       proxy_set_header Host $host;
       proxy_pass http://k-testserver-pool;
       expires 7d;
       add_header Cache-Control "public";
    }
}
    
por spala 19.07.2017 / 14:35

1 resposta

1

Você deve ter uma versão Nginx compilada com uma versão do OpenSSL que inclua o protocolo ALPN. (NPN ainda funcionará para o Firefox). Você pode verificar a versão do OpenSSL compilada com o seu nginx com o comando nginx -V . Você precisará do OpenSSL 1.0.2d pelo menos para ser compatível com o HTTP / 2.

Se a sua versão do OpenSSL for boa, você também pode verificar o sinalizador --with-http_v2_module no resultado de nginx -V .

Caso você não esteja de acordo com estes pré-requisitos, você terá que recompilar o nginx sozinho ou usar um binário pré-construído para ser compatível com o HTTP / 2.

Sobre a porta 443: A maioria dos navegadores (e a própria implementação do nginx) não suportam a porta 80 para HTTP / 2, na verdade.

    
por 19.07.2017 / 15:23

Tags