SPDY の紹介と nginx で SPDY を使う方法

みなさん、はじめまして。昨年末に入社しました やまぎし という者でございます。Twitter 等はやっていない、ということにしておいてください。ともかく何卒よろしくお願いいたします。

さて、十数年もの間 1.1 のまま変わらず有り続けていた HTTP の規格ですが、この頃は新たな風が吹いており、HTTP/2.0 の存在が見えてきました。まだワーキンググループが発足したばかりであり、具体的に変わるのは当分先になるであろうとは思いますが、米 Google 社の提唱している SPDY が HTTP/2.0 に取り入れられる形が濃厚であろうと話されています。

SPDY は先述した通り米 Google 社が提唱している規格です。長年使われてきている HTTP/1.1 は、歴史も深くそれだけ安定した規格ではありましたが、一度の接続では一つの要求しか扱えません。2000 年代前半の頃のように HTML 文書といくつかの画像ファイルを読み込むだけの簡素なウェブページではそれによって生じる問題はそうありませんでしたが、2000 年代の中頃から現われ始めた XMLHttpRequest 等を使った複数のリソースを動的に取得し、ウェブページの内容を操作するようになると、細かな通信のボトルネックが無視できないようになってきました。この問題に効率的に対応するために産まれたのが SPDY です。SPDY では一度の接続で複数の要求を扱うことができるので、読み込むリリースが多ければ多いほど、SPDY を使った場合と使わなかった場合の速度の差は大きくなります。

SPDY はクライアント側とサーバー側の両方が対応していなければ使うことができません。いくら優れた物であろうとも使うことができなければ、使われることがなければ、存在しないに等しいものでありましょう。ウェブアプリケーションとウェブブラウザーの両方を提供している米 Google 社だからこそ、提唱することのできた規格なのでしょう。

SPDY はこの記事の執筆時点では先述した米 Google 社の提供するウェブブラウザーである Google Chrome が対応しています。また Google Chrome の他に Opera や Firefox も対応していることを確認しています。クライアント側ではもう何も考えずとも使うことのできる体制が整いつつあるのではないかと思います。

サーバー側も昨今急速に対応が進みつつあります。NodeRubyPython と世間で広く使われている各言語でモジュールの提供が行われており、SPDY に対応したウェブアプリケーションを作るのにそう手間はいらなくなっています。また、Apache には米 Google 社によって提供されている Apache モジュール mod_spdy があり、大きな手間をかけることなく SPDY による速度の向上を享受することが可能となっています。

nginx で SPDY を扱うには nginx のソースコードにパッチをあてる必要があり、再ビルドが必要となります。具体的な手順は README.txt に全て記述されていますが、ここで簡単に手順を記載しようかと思います。

まずは nginx のソースコードが必要となりますので、nginx のダウンロードページ から nginx の最新の開発版をダウンロードし、任意のディレクトリに展開します。この記事の執筆時点では nginx-1.3.11 が最新版となっています。nginx に SPDY 対応をなすパッチ一覧の中から nginx のバージョンと合ったものをダウンロードして、展開した nginx のソースコードが含まれるディレクトリの中に入れ、パッチの適用を行います。記事執筆時点では patch.spdy-58_1.3.11.txt が最新のようです。また SPDY は TLS (SSL の規格名) の Next Protocol Negotiation extension を要求します。これは OpenSSL の 1.0.1 以降を必要とします。ですので nginx だけではなく OpenSSL のソースコードも用意する必要があります。この記事の執筆時点では openssl-1.0.1c.tar.gz が最新となっていますので、ダウンロードし、任意のディレクトリに展開しましょう。

上記の操作をシェルコマンドで行う場合には次のようなコマンドを入力すると良いでしょう。

mkdir -p ~/local/src
cd ~/local/src
curl -O http://nginx.org/download/nginx-1.3.11.tar.gz
curl -O http://www.openssl.org/source/openssl-1.0.1c.tar.gz
tar zxf nginx-1.3.11.tar.gz
tar zxf openssl-1.0.1c.tar.gz
cd ./nginx-1.3.11
curl -O http://nginx.org/patches/spdy/patch.spdy-58_1.3.11.txt
patch -p1 < patch.spdy-58_1.3.11.txt

後は --with-http_ssl_module オプションと --with-http_spdy_module オプションを付与した上で、./configure を実行し通常の nginx のビルドと同様の操作をするだけですが、OpenSSL のバージョンが 1.0.1 よりも前の場合には --with-openssl オプションを使い任意の OpenSSL のソースコードがある位置を指定する必要があります。

./configure --prefix=${HOME}/local --with-openssl=${HOME}/local/src/openssl-1.0.1c --with-http_ssl_module --with-http_spdy_module
make
make install

ビルドに失敗しなければ以上で nginx の用意は終了となります。上記のようなオプションを指定した場合には ~/local/sbin ディレクトリ以下に nginx のバイナリが作成されます。
残る作業は nginx.conf の変更だけですが、基本的には http_ssl_module の設定に準じます。listen ディレクティブで ssl というパラメーターと共に spdy というパラメーターの付与を行うだけです。

server {
  listen 443 ssl spdy default_server;

  ssl_certificate server.crt;
  ssl_certificate_key server.key;
  # ...
}

後は SPDY に対応したウェブブラウザーで該当するウェブページを開くだけです。Google Chrome の場合は chrome://net-internals/#spdy という文字列をロケーションバーに入力することで、SPDY による接続を確認することが可能となっています。そこで先程用意したウェブサーバーのホスト名が出現していれば、問題なく SPDY として接続されたこととなります。

まだまだ SPDY は出現したばかりの規格ではありますが、現時点で多くのサポートが得られており、また、後方互換があり対応していない環境に対しては通常の HTTP/1.1 として扱われます。ですので、HTTP の要求が過剰で速度に不安があれば、使っておいて損はないのではないかと思います。