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