2016-06-17 15 views
3

サーバープッシュ機能を使用してOnlineshopをhttp2に更新しようとしていますが、nginxのようなWebサーバー用のソリューションを見つけることができません(プロキシやその他の場合)アップストリームhttp2で私たちは、モーメントでノードhttp Moduleを持つnodejを使用していますが、ノードspdyモジュールに切り替えます。 spdyモジュールはサーバープッシュでhttp2をサポートしています。私habeは、nginxの代替としてh2oを試しましたが、http2 Upstreamもサポートしていません。Nodejsのpushを使用したNodejs http2

私は種類の(ちょうど今日メインラインにプッシュ)現時点では失われたとnginxのは1.13.9後

+0

Nginx 1.9.5+は、外部モジュールを使用せずにHTTP/2をサポートしています。 –

+0

はい、サーバーをプッシュしないでhttp2をアップストリームしない –

+1

解決策は見つかりましたか? – mz3

答えて

0

が助けを必要としていますあなたがそれをコンパイルすることにより、箱から出してHTTP/2サーバープッシュを持つことができるしていますngx_http_v2_module

最近の追加に興味がある場合、これはほとんどの機能を追加したコミットです:hg.nginx.org: HTTP/2: server push

その使用は比較的簡単です:ノードをプロキシしているサーバーにhttp2_push_preloadディレクティブを追加し、Linkヘッダのノードメイク使用から(W3仕様で説明したように - https://www.w3.org/TR/preload/#server-push-http-2)、その後、nginxのは、送信の仕事をしますサーバープッシュを示すh2フレーム。

たとえば、index.htmlのエンドポイントを持つ/エンドポイントがあるとしますが、image.svgもクライアントにプッシュします。あなたがアップストリームサーバーを設定し、サーバー構成の可能性がnginxので

は、サーバーの設定にhttp2_push_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アプリで、あなたは/を果たすと思いますが、応答に余分Linkヘッダを追加します。

response.setHeader('Link', '</image.svg>; rel=preload; as=image'); 

PS:ええ、あなたがそれらの角括弧を保つだろう。私はそれらを取り替えるべきではありません。

ちょうど与えられた(いくつかのデバッグのヒントと共に)例は、ここに完全に書かれています:https://ops.tips/blog/nginx-http2-server-push/

0

Nginxにはonly just added support for HTTP/2 Pushがあります。最新のメインラインバージョンをこすっていない限り、これを行うことはできません。また、それはとても新しいのでthere are still some issues with itです。 Nginxはhttp2をバックエンド接続でサポートしていません(そしてstated they won’t support thisを持っています)。だから、提案したように、ダウンストリームシステムから直接完全にプッシュアップすることはできません。

これは、とにかくプッシュするための最良の方法かどうかについていくつかの質問があります。ダウンストリームシステムは、たとえクライアントがプッシュをサポートしていなくても、アップストリームプロキシサーバーにプッシュすることができます。これは無駄なプッシュです。

したがって、プロキシからプッシュして、ダウンストリームシステムにそのプッシュを行うように(リンクヘッダーを介して)アップストリームシステムに伝えることが良い方法です。これには複雑さを軽減するためのいくつかの利点があります。ダウンストリームシステムが制御できないかもしれない資産(スタイルシート、JavaScript、画像などの静的資産など)、既にプッシュされた資産の中央ストア(キャッシュダイジェスト) HTTP/2を完全にサポートする必要があります(リンクヘッダーはHTTP/1.1経由でHTTP/2と同じように簡単に送信できます)。

リンクヘッダー経由で上流のプロキシからプッシュすることの主な欠点は、リンクヘッダーが応答から読み取られるため、要求されたリソースが準備ができるまで待つ必要があることです。要求リソースに生成に時間がかかる場合、処理中の他のリソースのプッシュを開始する方が効果的です。これは新しい103 Early Hints HTTP Status codeによって解決されます。ここでは後でメイン200ステータスコードを送信する前に返信することができます。この早期メッセージには、アップストリームプロキシによって読み取られ、リソースをプッシュするために使用されるリンクヘッダーを含めることができます。 Nginxの実装がこれをサポートするかどうかはわかりません。

ちなみにApacheはしばらくの間プッシュをサポートしており、はるかに成熟した実装をしています。これは直接のApache設定やリンクヘッダー経由でサポートされています(デフォルトでは、互換性の問題では送信されないように設定されています)。上記の理由から、does not support direct push over back end connectionsでもHTTP/2経由でバックエンドへのプロキシをサポートしています。それほどよく知られていないサーバー(例:H2O)は、NginxよりもHTTP/2をサポートしています。

最後に、CDNを使用している場合、バックエンドインフラストラクチャをアップグレードすることなく、HTTP/2プッシュをサポートしていることがあります(リンクヘッダー経由)。実際、CloudflareはNginxベースのCDNで、had HTTP/2 Push for a whileとなっています。実際はtwo Cloudflare engineers which have back ported their implementation to the base Nginx codeです。

関連する問題