Node.js Nodejs http2(nginx或其他web服务器)后面,带有推入式Nodejs

Node.js Nodejs http2(nginx或其他web服务器)后面,带有推入式Nodejs,node.js,nginx,webserver,http2,h2o-http,Node.js,Nginx,Webserver,Http2,H2o Http,我正在尝试更新我们的在线商店,以使用HTTP/2和服务器推送功能,但我找不到一个解决方案,用于像Nginx这样的Web服务器(用于代理和其他一些东西)和上游HTTP/2。我们目前正在使用Node.js和Node HTTP模块,但希望切换到Node spdy模块。spdy模块支持HTTP/2和服务器推送。我已经尝试将H2O作为Nginx的替代品,但它也不支持HTTP/2上游 我现在有点不知所措,需要帮助。在NGINX 1.13.9(今天刚刚推到主线)之后,您可以通过使用ngx\U HTTP\U v

我正在尝试更新我们的在线商店,以使用HTTP/2和服务器推送功能,但我找不到一个解决方案,用于像Nginx这样的Web服务器(用于代理和其他一些东西)和上游HTTP/2。我们目前正在使用Node.js和Node HTTP模块,但希望切换到Node spdy模块。spdy模块支持HTTP/2和服务器推送。我已经尝试将H2O作为Nginx的替代品,但它也不支持HTTP/2上游

我现在有点不知所措,需要帮助。

在NGINX 1.13.9(今天刚刚推到主线)之后,您可以通过使用
ngx\U HTTP\U v2\u模块编译HTTP/2服务器,让它开箱即用

如果您对最近添加的内容感兴趣,这是添加大部分功能的提交:

它的使用相对简单:将
http2\u push\u preload
指令添加到代理节点的服务器,然后从节点使用
链接
头(如W3规范中所述),然后NGINX将发送指示服务器推送的h2帧

例如,假设您有一个
/
端点,它为常规
index.html
提供服务,但也将
image.svg
推送到客户端

在NGINX中,您可以配置上游服务器,然后在服务器配置中在服务器配置上启用
http2\u push\u preload

# Add an upstream server to proxy requests to.
upstream sample-http1 {
  server localhost:8080;
}


server {
  # Listen on port 8443 with http2 support on.
  listen                  8443 http2;


  # Enable TLS such that we can have proper HTTP2
  # support using browsers.
  ssl on;
  ssl_certificate         certs/cert_example.com.pem;
  ssl_certificate_key     certs/key_example.com.pem;


  # Enable support for using `Link` headers to indicate
  # origin server push.
  http2_push_preload on;


  # Act as a reverse proxy for requests going to /proxy/*.
  #
  # Because we don't want to rewrite our endpoints in the
  # Node app, rewrite the path such that `/proxy/lol` ends up
  # as `/lol`.
  location / {
    proxy_pass      http://sample-http1;
  }
}
然后,在NodeJS应用程序中,您可以像平常一样提供
/
,但在响应中添加一个额外的
链接
标题:

response.setHeader('Link', '</image.svg>; rel=preload; as=image');
response.setHeader('Link',';rel=preload;as=image');
是的,你应该保留那些尖括号;我不是说你应该更换它们

顺便说一句,我刚才给出的示例(带有一些调试技巧)在这里完整地写了出来:。

Nginx已经这样做了,除非您使用最新的主线版本,否则您将无法完成此操作。也因为它太新了。Nginx不支持通过后端连接的http2(并且有)。所以你不能像你建议的那样直接从下游系统向上推

这是否是最好的推动方式,还有一些疑问。下游系统可能会推送到上游代理服务器,即使客户端不支持推送,例如,这是一个浪费的推送

因此,更好的方法是从代理中推送,让下游系统告诉上游系统(通过链接头)进行推送。这在降低复杂性方面有几个优点,允许下游系统推送它可能无法控制的资产(例如,静态资产,如样式表、JavaScript、图像等),一个已推送资产的中央存储(缓存摘要),也不需要一直支持HTTP/2(链接头可以像HTTP/2一样通过HTTP/1.1发送)

通过链接头从上游代理推送的主要缺点是,当从响应中读取链接头时,您必须等待请求的资源准备就绪。如果请求资源需要一些时间才能生成,则在处理过程中开始推送其他资源可能更为有利。这可以通过以下方法解决:这是一个新消息,您可以在稍后发送主200状态代码之前提前回复。此提前消息可以包含链接头,可由上游代理读取并用于推送资源。我不确定Nginx实现是否支持此功能

顺便说一句,Apache支持Push已经有一段时间了,并且有一个更成熟的实现。它通过直接Apache配置或通过链接头(包括通过103个响应,默认情况下,这些响应被配置为在出现兼容性问题时不发送)来支持它。由于上述原因,它甚至支持通过HTTP/2代理到后端。其他一些不太知名的服务器(例如)也比Nginx更好地支持HTTP/2


最后,如果使用CDN,则它们可能支持HTTP/2推送(通常通过链接头)无需升级任何后端基础设施。事实上,Cloudflare是一种基于Nginx的CDN,它具有并且事实上是。

您可以从源代码处编译/重新编译Nginx,并包括
--with-http\u v2\u模块
配置参数,以启用HTTP2推送功能。

Nginx 1.9.5+支持http/2,无需使用外部模块。是的,但没有服务器推送和http2 UpstreamId,您可以找到解决方案?NGINX编译:默认情况下不构建此模块,应使用
--with-http\u v2\u module
配置参数启用此模块。