20180208追記、Nginxも対応したようです
NginxがHTTP2サーバプッシュに対応したので試す - ASnoKaze blog
Apache 2.4.18より HTTP/2のサーバプッシュを試す。
http://ftp.riken.jp/net/apache//httpd/CHANGES_2.4.18
ビルド
「Apache 2.4.17のmod_http2試す」を参考に、環境を整えておきます。
wget http://ftp.riken.jp/net/apache//httpd/httpd-2.4.18.tar.gz tar zxvf ./httpd-2.4.18.tar.gz cd ./httpd-2.4.18 ./configure --enable-http2 make sudo make install
設定
デフォルトでH2Pushはonになっているので、HTTP2で通信している場合はLinkヘッダでrel=preloadを指定すればプッシュされる
https://httpd.apache.org/docs/2.4/mod/mod_http2.html#h2push
Protocols h2 http/1.1 H2ModernTLSOnly off ProtocolsHonorOrder On H2Push on <Location /index.html> Header add Link "</test.js>;rel=preload" Header add Link "</test.css>;rel=preload" Header add Link "</test.jpg>;rel=preload" </Location>
nghttpで確認すると、PUSH_PROMISEが送信されていることを確認できます。
[ 0.006] recv PUSH_PROMISE frame <length=45, flags=0x04, stream_id=13> ; END_HEADERS (padlen=0, promised_stream_id=2) [ 0.006] recv (stream_id=13) :scheme: http [ 0.006] recv (stream_id=13) :authority: localhost [ 0.006] recv (stream_id=13) :path: /test.css [ 0.006] recv (stream_id=13) :method: GET [ 0.006] recv (stream_id=13) user-agent: nghttp2/1.3.5-DEV [ 0.006] recv (stream_id=13) host: localhost [ 0.006] recv PUSH_PROMISE frame <length=17, flags=0x04, stream_id=13>
H2PushPriority
nghttp2 library がversion 1.5.0以上であればH2PushPriorityを指定できます
https://httpd.apache.org/docs/2.4/mod/mod_http2.html#h2pushpriority
MIME type毎にweightを指定できます。
H2PushPriority application/json 32