NGINX大全 第八章 HTTP/2

NGINX大全 第八章 HTTP/2

第八章 HTTP/2

8.0 介绍

HTTP/2是HTTP协议的一个主要修订版。此版本中完成的大部分工作都集中在传输层,例如通过单个TCP连接启用完整请求和响应多路复用。在HTTP头字段上采用压缩的做法获得了效率,并且添加了对请求优先级的支持。协议的另一个重要补充是服务器将消息推送到客户端的能力。本章详细介绍了在NGINX中启用HTTP/2以及配置gRPC和HTTP/2服务器推送支持的基本配置。

8.1 基本配置

问题

您想使用HTTP/2。

解决方案

在NGINX的server上开启HTTP/2:

server {
    listen 443 ssl http2 default_server;

    ssl_certificate server.crt;
    ssl_certificate_key server.key;
    ...
}

讨论

要打开HTTP/2,只需将http2参数添加到listen指令即可。但问题是,尽管协议不要求将连接包裹在SSL/TLS中,但HTTP/2客户端的某些实现仅支持通过加密连接的HTTP/2。另一个需要注意的是,HTTP/2规范将许多TLS 1.2的密码套件列入黑名单,因此导致握手失败。NGINX默认使用的密码不在黑名单中。要测试您的设置是否正确,您可以为Chrome和Firefox浏览器安装一个插件,用于指示网站何时使用HTTP/2,或者在命令行中使用nghttp实用程序。

8.2 gRPC

问题

您需要终止,检查,路由或负载平衡gRPC方法调用。

解决方案

使用NGINX代理gRPC连接。

server {
    listen 80 http2;

    location / {
        grpc_pass grpc://backend.local:50051;
    }
}

在此配置中,NGINX正在端口80上侦听未加密的HTTP/2流量,并将该流量代理到端口50051上名为backend.local的机器。grpc_pass指令指示NGINX将通信视为gRPC调用。我们的backend.local服务器前面的grpc://不是必需的; 但是,它直接表明后端通信未加密。

要在客户端和NGINX之间使用TLS加密,并在传递调用给应用程序服务器之前终止该加密,请打开SSL和HTTP/2,就像在第一部分中所做的那样:

server {
    listen 443 ssl http2 default_server;

    ssl_certificate server.crt;
    ssl_certificate_key server.key;
    location / {
        grpc_pass grpc://backend.local:50051;
    }
}

此配置在NGINX处终止TLS,并通过未加密的HTTP/2将gRPC通信传递给应用程序。

要配置NGINX以加密与应用服务器的gRPC通信,提供端到端的加密流量,只需修改grpc_pass指令,在服务器信息之前指定grpcs://(注意添加s表示安全通讯):

grpc_pass grpcs://backend.local:50051;

您还可以使用NGINX路由不同的后端服务的调用(包括包,服务和方法),根据gRPC URI。 为此,请使用location指令。

location /mypackage.service1 {
    grpc_pass grpc://backend.local:50051;
}
location /mypackage.service2 {
    grpc_pass grpc://backend.local:50052;
}
location / {
    root /usr/share/nginx/html;
    index index.html index.htm;
}

此配置示例使用location指令在两个单独的gRPC服务之间路由传入的HTTP/2流量,还有一个用于提供静态内容的location。对mypackage.service1服务的方法调用被定向到端口50051上的backend.local服务器,而对mypackage.service2的调用被定向到端口50052。location /捕获任何其他HTTP请求并提供静态内容。这演示了NGINX如何能够在相同的HTTP/2端点下为gRPC和非gRPC提供服务并相应地路由。

负载均衡gRPC调用也类似于非gRPC HTTP流量:

upstream grpcservers {
    server backend1.local:50051;
    server backend2.local:50051;
}
server {
    listen 443 ssl http2 default_server;

    ssl_certificate server.crt;
    ssl_certificate_key server.key;
    location / {
        grpc_pass grpc://grpcservers;
    }
}

upstream块对gRPC的工作方式与其他HTTP流量的工作方式完全相同。唯一的区别是upstream是由grpc_pass引用的。

讨论

NGINX能够接收,代理,负载平衡,路由和终止gRPC的加密调用。gRPC模块使NGINX能够设置,更改或丢弃gRPC调用header,设置请求超时,以及设置upstream SSL/TLS规范。当gRPC通过HTTP/2协议进行通信时,您可以配置NGINX使得同一端点上接收gRPC和非gRPC Web流量。

8.3 HTTP/2服务器推送

问题

您需要抢先将内容推送到客户端。

解决方案

使用NGINX的HTTP/2服务器推送的功能。

server {
    listen 443 ssl http2 default_server;

    ssl_certificate server.crt;
    ssl_certificate_key server.key;
    root /usr/share/nginx/html;

    location = /demo.html {
        http2_push /style.css;
        http2_push /image1.jpg;
    }
}

讨论

要使用HTTP/2服务器推送,必须为HTTP/2配置server,如章节7.1中所述。从那里,您可以指示NGINX使用http2_push指令抢先推送特定文件。该指令采用一个参数,即要推送到客户端的文件的完整URI路径。

如果代理应用程序包含名为Link的HTTP响应header,NGINX还可以自动将资源推送到客户端。此header能够指示NGINX预加载指定的资源。要启用此功能,请把http2_push_preload;添加到NGINX配置中。

猜你喜欢
NGINX大全 第十四章 使用访问日志,错误日志和请求跟踪进行调试和故障排除
阅读 1044

在本章中,我们将讨论访问和错误日志,通过Syslog协议进行流传输以及使用NGINX生成的请求标识符来端到端地跟踪请求。

NGINX大全 第十一章 容器/微服务
阅读 512

本章重点介绍如何构建NGINX和NGINX Plus容器镜像,使容器化环境更容易工作的特性,以及在Kubernetes和OpenShift上部署镜像。

NGINX大全 第三章 流量管理
阅读 535

本章介绍NGINX的基于百分比分割客户端请求,利用客户端的地理位置还有以速率,连接和带宽限制的形式控制流量的能力。

NGINX大全 第九章 复杂的媒体流
阅读 485

本章介绍使用MPEG-4或Flash视频格式的NGINX的流媒体。NGINX被广泛用于向大众分发和传输内容。NGINX支持行业标准格式和流技术,本章将对其进行介绍。

NGINX大全 第十二章 高可用性部署模式
阅读 465

本章详细介绍了如何运行多个NGINX服务器以确保负载均衡层中的高可用性的技术。

NGINX大全 第十五章 性能调优
阅读 787

本章还介绍了连接调优,以保持连接对客户端和上游服务器的开放性,并通过调整操作系统来提供更多连接。

NGINX大全 第一章 基础
阅读 549

在本章中,您将学习如何安装主要配置文件所在的NGINX以及管理命令。 您还将学习如何验证安装并向默认服务器发出请求。

NGINX大全 第四章 可大规模扩展的内容缓存
阅读 1254

使用NGINX,您可以在任何可以放置NGINX服务器的地方缓存您的内容,从而有效地创建您自己的CDN。