読者です 読者をやめる 読者になる 読者になる

Webinar

Web関連情報のウェブセミナー

ゼロからはじめるHTTP/2サーバ(nghttp2)環境構築

http/2 環境構築

f:id:t-webber:20150311222200p:plain

※本記事は2015年3月8日時点の情報を元に記述しています。古い情報が含まれている可能性がありますのでお気をつけください。

 

GoogleのSPDYをベースに2012年11月から検討を開始し、長い期間を経てようやくRFC化直前までこぎつけたHTTP/2

 

今回はそのHTTP/2対応のサーバ環境の構築手順を紹介します。

 

初心者でもとりあえずの環境構築まではできるように、というのが本記事の目標です。

最低限の構築手順であり、セキュリティ的な配慮や性能面でのチューニングはできてないので気をつけてください。

 

利用するサーバソフトは、nghttp2。日本人のtatsuhiro-tさんが開発した、現時点でのHTTP/2の事実上のリファレンス実装と言っても過言ではないサーバソフトです。

 

Google Compute Engine(GCE)環境の準備

初心者でも・・・と言いつつココはいきなり省略します。Google Compute Engineでググって、Googleアカウントを登録し、無料体験版を申し込み、プロジェクトを作成し、インスタンスを立ち上げます。

今回の手順で必要な設定は以下。

  • インバンドのhttp/httpsトラフィックを許可する。
  • インバンドのポート8080/TCPトラフィックを許可する。
    (「ネットワーク」の「default」に8080の許可を追加)
  • ゾーン:asia-east1-a(どこでもいいとは思いますが)
  • マシンタイプ:f1-micro
  • イメージ(OS):ubuntu-1404-trusty-v20150128

ここまでやった上で、My Consoleのインスタンスリストの右はじののSSHボタンをクリックすると、別ページでブラウザ上から作成したインスタンスSSH接続できるので接続してください。

 

必要パッケージのインストール

 nghttp2の依存パッケージやgit、gcc4.9環境をインストール。(上記の通り、以降OSはubuntu前提です)

sudo apt-get update

sudo apt-get install make binutils autoconf automake autotools-dev libtool pkg-config zlib1g-dev libcunit1-dev libssl-dev libxml2-dev libev-dev libevent-dev libjansson-dev libjemalloc-dev cython python3.4-dev
sudo apt-get update

sudo apt-get install git

sudo apt-get install -y python-software-properties
sudo apt-get update

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update

sudo apt-get install -y gcc-4.9 g++-4.7
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7
sudo update-alternatives --list gcc

 

nghttp2のビルド

GitHubからnghttp2のソース一式をダウンロードし、ビルド。

git clone https://github.com/tatsuhiro-t/nghttp2.git
sudo apt-get update
cd nghttp2

autoreconf -i
automake
autoconf
./configure
make

cd src

 makeで数分かかります。

ここまで実行すると、srcディレクトリ内にnghttpdが作成されます。

 

サーバ証明書秘密鍵の生成

nghttp2では、httpsだけでなくhttpもサポートしているのですが、現時点でhttp/2に対応しているブラウザ(※1)はhttpsのみを前提にしているので、SSL環境の構築が必要です。

openssl genrsa -des3 -passout pass:x -out server.pass.key 2048
openssl rsa -passin pass:x -in server.pass.key -out server.key
rm server.pass.key
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt 

秘密鍵サーバ証明書を作成しています。

環境構築後のアクセス時にエラーを出さないようにするためにはブラウザに証明書をインポートしてください。

※1 2015/3/8時点での対応ブラウザ:Firefox最新版、Chrome最新版(chrome://flags/でSPDY/4オプションのONが必要)

 

コンテンツ作成、nghttpd起動

Webページを作成し、nghttpdを起動します。

vi index.html

 viでindex.htmlを編集。

<html>
<body>Hello, World!</body>
</html> 

PATH=$PATH:/home/○○(GCEインスタンスのユーザ名)/nghttp2/src

export PATH

nghttpd -v 8080 server.key server.crt

nghttp2は、nghttpdが置いてあるディレクトリと同じディレクトリを公開します。

viの操作方法は省略しますが、「Hello, World!」のみが表示されるWebページを作成しています。

パスを通し、8080ポートでの起動と先ほど作成した秘密鍵、証明書を指定し、-vオプションをつけて起動します。-vオプションはHTTP/2フレームのやり取りを表示するためのオプションです。

 

対応ブラウザからのアクセス

あとは対応ブラウザから、以下のアドレスにアクセスし、「Hello, World!」が表示されたらOK。

https://[サーバIPアドレス or サーバURL]:8080/index.html