问题;在 nginx (centos 6) 上启用 http2 协议

问题;在 nginx (centos 6) 上启用 http2 协议

我有一个负载均衡服务器(nginx)。流量到达负载平衡服务器并将其转发到内部 Web 服务器(带上游)。 (我的内部网络服务器也是 nginx。)

我有一个配置文件如下。我在负载均衡器上有很多配置文件,例如这个配置文件。 (针对不同的子域。)

我想运行符合“http2”协议的80和443流量。我想在我的网络服务器上启用 http2 协议。我在“listen 80”或“listen 443”命令之后添加“http2”参数。直到这部分一切都很正常。 (也许这对我来说很正常..)

在本节之后我有几个问题。

  • 1:网上所有的文章都是针对443端口做的。这是否有特殊原因而我不能为80端口做?

  • 2:当我将“http2”参数添加到“/etc/nginx/conf.d”目录中的几个配置文件时,如下所示,网站无法打开。每当我刷新网站时,它都会尝试下载页面。但是当我删除http2参数时,问题就解决了。它为什么要这样做?另外,nginx configtest 不会给出错误。

  • 3:这方面有什么资料可以推荐给我吗?

#

[root@lbserver1 ~]# nginx -v

nginx版本:nginx/1.12.0

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

红帽企业 Linux 服务器版本 6.7(圣地亚哥)

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";
    }
}

答案1

您应该有一个使用包含 ALPN 协议的 OpenSSL 版本编译的 Nginx 版本。 (NPN 仍然适用于 Firefox)。您可以使用以下命令检查使用 nginx 编译的 OpenSSL 版本nginx -V。您至少需要 OpenSSL 1.0.2d 才能与 HTTP/2 兼容。

如果您的 OpenSSL 版本是好的,您还可以--with-http_v2_module检查nginx -V.

如果您不遵守这些先决条件,您将必须自己重新编译 nginx 或使用预构建的二进制文件以与 HTTP/2 兼容。

关于端口 443:大多数浏览器(以及 nginx 实现本身)实际上并不支持 HTTP/2 的端口 80。

相关内容