Apache 2.4.18 のHTTP2 ServerPushを試す

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