ubuntu16.04で動作しているapacheサーバーをhttp2に変更して爆速化


昔firefoxのTIPSみたいなサイトを開くとfirefox高速化としてabout:configでpipelineをサーバー負荷を顧みずにいっぱいたてろ的な記事が決まってあった。
今はそれがそのような裏技を使わなくても標準である。それがhttp2らしい。
入れるとhttp のheaderのhttp1.1というレスポンスがhttp2に変わって早くなる。
中身はpipelineをいっぱいにすることで実現してるらしいです。

で、この記事では、実作業として、ubuntu16.04で動作しているHTTP(apache)サーバーがあるのですが、それをhttp1.1から2に変えた。そのログを書きます。

まずhttp2が動作してるかどうかの確認方法ですが
firefoxだと
https://addons.mozilla.org/ja/firefox/addon/http2-indicator/
でできます。
動作してるHPだとURLのお尻に青い稲妻が出ます。
一応真面目な確認方法も書きます。
開発ツールー>インスペクターー>ネットワークで出るリストを右クリックでカラムにプロトコルを追加
ただhttp2の確認はhttps://でないとFirefox,chromeで確認できない。
http://wiki.bit-hive.com/tomizoo/pg/Apache%E3%81%A7%E3%81%AEHTTP%2F2%E8%A8%AD%E5%AE%9A
http://で確認したいというマニアックな場合(たとえば19.168.??.??で試しにやったとか)
curlでできる。
curl -v --http2 http://www.google.com
とかする。
出力を載せておく
$ curl -v --http2 http://192.168.1.7
* Rebuilt URL to: http://192.168.1.7/
* Trying 192.168.1.7...
* TCP_NODELAY set
* Connected to 192.168.1.7 (192.168.1.7) port 80 (#0)

GET / HTTP/1.1
Host: 192.168.1.7
User-Agent: curl/7.58.0
Accept: /
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA

< HTTP/1.1 101 Switching Protocols
< Upgrade: h2c
< Connection: Upgrade
* Received 101
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
< HTTP/2 200
< date: Sun, 00 Jan 1900 00:00:00 GMT
< server: Apache/2.4.37 (Ubuntu)
< expires: Thu, 19 Nov 1981 08:52:00 GMT
< cache-control: no-store, no-cache, must-revalidate
< pragma: no-cache
< set-cookie: PHPSESSID=egcn0u7lg1bomhc80vuf36gv44; expires=Mon, 03-Dec-2018 08:44:35 GMT; Max-Age=86400; path=/
< set-cookie: pageredir=http%3A%2F%2F192.168.1.7%2F; expires=Sun, 02-Dec-2018 10:44:35 GMT; Max-Age=7200; path=/
< vary: Accept-Encoding
< content-type: text/html; charset=UTF-8

ただ16.04のaptのcurlでこれをすると、
curl: (1) Unsupported protocol
になる。
これを回避するにはCURLのアップデートを行う。
https://askubuntu.com/questions/884899/how-do-i-install-curl-with-http2-support
なおcurlがhttpsをサポートするかは
curl -V
の出力でも確認可能(出力にhttpsがでる)
$ curl -V
curl 7.58.0 (x86_64-pc-linux-gnu) libcurl/7.58.0 OpenSSL/1.0.2g zlib/1.2.8 nghttp2/1.7.1 librtmp/2.3
Release-Date: 2018-01-24
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtmp rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy
こんな感じ。

最後になったが
セットアップの仕方はこの通り
https://techwombat.com/enable-http2-apache-ubuntu-16-04/

ただVirtualHost の書き方だけ曖昧なので再記述
ファイルは
/etc/apache2/sites-enabled/????-le-ssl.conf
でOKだと思うが私は念のためすべてに記述した。

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName ほげ
        DocumentRoot ほげほげ
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLCertificateFile ほげ
SSLCertificateKeyFile ほげ
Protocols h2 h2c http/1.1
</VirtualHost>
</IfModule>

こんな感じ
このh2がhttp2らしい。