WSL で導入している Ubuntu 16.04 TLS ですが、この中に入っている curl コマンドは HTTP/2 に対応していません。
$ curl -I --http2 https://www.yahoo.co.jp/
curl: (1) Unsupported protocol
本ページでは、HTTP/2 を有効にした curl コマンドを、ソースファイルをコンパイルしてインストールする手順を紹介します。
使用しているユーザーアカウントのホームディレクトリ内にインストールするだけなので、apt
のパッケージとしてインストールされている curl
コマンドに影響はありません。
curl を独自にコンパイルしてインストールする手順
今回行う操作は、ターミナルエミュレータ上で全て行います。
適当なパスに作業用ディレクトリを作成し、そこに移動してから以下の作業を行います。
(1) libnghttp2-dev パッケージのインストールを行います。
まず、curl のプログラムでは、HTTP/2 に対応するために nghttp2 というソフトウェアを使っているため、nghttp2のライブラリをインストールします。
$ sudo apt install libnghttp2-dev
(2) curl が依存しているパッケージをインストールします。
$ sudo apt-get build-dep curl
このコマンドを実行する前に
/etc/apt/sources.list
ファイル内の「deb-src」で始まる行がコメントになっている場合は、先頭の「#」を外して有効にしておきます。
(3) curl のソースファイルをダウンロードします。
curl – Download ページから、最新のソースファイルをダウンロードします。
この時は、curl 7.62.0 が最新版でした。
$ wget https://curl.haxx.se/download/curl-7.62.0.tar.gz
解凍して、できたディレクトリに移動します。
$ tar zxf curl-7.62.0.tar.gz
$ cd curl-7.62.0/
(4) configure スクリプトを実行します。
以下のコマンドではいろいろオプションが指定してありますが、HTTP/2 対応のために必要となる オプションは、--with-nghttp2
と --with-ssl
の2つです。それから、インストール先のディレクトリを ~/local/curl-7.62.0
にしたいので、--prefix
オプションで指定してあります。この3つ以外は指定しなくても構いません。
$ ./configure --prefix=$HOME/local/curl-7.62.0 \
--with-nghttp2 \
--with-ssl \
--disable-dependency-tracking \
--disable-symbol-hiding \
--enable-versioned-symbols \
--enable-threaded-resolver \
--with-lber-lib=lber \
--with-gssapi=/usr \
--with-zsh-functions-dir=/usr/share/zsh/vendor-completions
このコマンドが問題なく終了すると、以下のように表示されます。
curl version: 7.62.0
Host setup: x86_64-pc-linux-gnu
Install prefix: /mnt/c/Users/foo/local/curl-7.62.0
Compiler: gcc
SSL support: enabled (OpenSSL)
SSH support: no (--with-libssh2)
zlib support: enabled
brotli support: no (--with-brotli)
GSS-API support: enabled (MIT Kerberos/Heimdal)
TLS-SRP support: enabled
resolver: POSIX threaded
IPv6 support: enabled
Unix sockets support: enabled
IDN support: no (--with-{libidn2,winidn})
Build libcurl: Shared=yes, Static=yes
Built-in manual: enabled
--libcurl option: enabled (--disable-libcurl-option)
Verbose errors: enabled (--disable-verbose)
SSPI support: no (--enable-sspi)
ca cert bundle: /etc/ssl/certs/ca-certificates.crt
ca cert path: no
ca fallback: no
LDAP support: enabled (OpenLDAP)
LDAPS support: enabled
RTSP support: enabled
RTMP support: enabled (librtmp)
metalink support: no (--with-libmetalink)
PSL support: no (libpsl not found)
HTTP2 support: enabled (nghttp2)
Protocols: DICT FILE FTP FTPS GOPHER HTTP HTTPS IMAP IMAPS LDAP LDAPS POP3 POP3S RTMP RTSP SMB SMBS SMTP SMTPS TELNET TFTP
※ ユーザー名は foo にしてあります。
(5) コンパイルします。
$ make
(6) 最後にインストールします。
$ make install
これで、~/local/curl-7.62.0
に curl がインストールされました。いらなくなったらこのディレクトリを消すだけです。
curl
コマンドは、~/local/curl-7.62.0/bin/
の中にあります。apt でインストールされている curl
コマンドではなく、こちらを常時使用したいのであれば、このディレクトリを環境変数 PATHの先頭に追加するなどしてください。
それでは実行してみましょう。
$ ~/local/curl-7.62.0/bin/curl -I --http2 https://www.yahoo.co.jp/
HTTP/2 200
date: Thu, 01 Nov 2018 13:35:33 GMT
p3p: policyref="http://privacy.yahoo.co.jp/w3c/p3p_jp.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
x-content-type-options: nosniff
x-xss-protection: 1; mode=block
x-frame-options: SAMEORIGIN
expires: -1
pragma: no-cache
cache-control: private, no-cache, no-store, must-revalidate
x-xrds-location: https://open.login.yahooapis.jp/openid20/www.yahoo.co.jp/xrds
content-type: text/html; charset=UTF-8
age: 0
via: http/1.1 edge2428.img.djm.yahoo.co.jp (ApacheTrafficServer [c sSf ])
server: ATS
set-cookie: TLS=v=1.2&r=1; path=/; domain=.yahoo.co.jp; Secure
HTTP/2 でレスポンスが返ってきました。成功です。
※ --http2
オプションを指定しなくても、デフォルトで HTTP/2 は有効になっているようです。
HTTP/1.0 を使いたい場合は --http1.0
オプション、HTTP /1.1 を使いたい場合は --http1.1
オプションを指定します。