はちゅにっき

こっちのブログはまったり更新

nginx 1.4.0 の SPDY を試してみる

nginx 1.3 の頃より patch をあてて SPDY を有効する方法を、色々な方が試されていますので、今更という感じはしますが nginx 1.4 がリリースされ SPDY と WebSocket が正式にサポートされたということで、改めて導入してみました。
ということでインストールメモ。

nginx のソースコード入手

nginx の最新のソースコード (1.4.0) を http://nginx.org/ より入手します。

$ cd $HOME
$ wget http://nginx.org/download/nginx-1.4.0.tar.gz
$ tar zxvf nginx-1.4.0.tar.gz

OpenSSL のソースコード入手

SPDY では OpenSSL 1.0.1 より実装されている Next Protocol Negotiation を利用するため、OpenSSL 1.0.1 より古いバージョンがインストールされている場合は、あらかじめ OpenSSL のソースコードを入手しておく必要があります。
手元の環境で OpenSSL のバージョンを調べたところ

$ openssl version
OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008

と残念な感じでしたので http://www.openssl.org/ より、最新のソースコード (1.0.1e) をダウンロードしました。

$ cd $HOME/nginx-1.4.0
$ wget http://www.openssl.org/source/openssl-1.0.1e.tar.gz
$ tar zxvf openssl-1.0.1e.tar.gz

コンパイルしてインストール

WebSocket は標準で扱えるようになるため、SPDY を有効にして Configure します。

$ cd $HOME/nginx-1.4.0
$ ./configure --user=www --group=www --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/var/run/nginx.pid --lock-path=/var/lock/subsys/nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_gzip_static_module --with-http_degradation_module --with-http_stub_status_module --with-http_perl_module --with-file-aio --with-http_spdy_module --with-openssl=./openssl-1.0.1e

要・不要等々あるので、なんかたくさんオプションつけて Configure していますが、SPDY を有効にするには単純に --with-http_spdy_module--with-openssl=./openssl-1.0.1e を指定するだけ。OpenSSL 1.0.1 以降がインストールされている場合は、 --with-openssl の指定は不要だと思います。
あとはいつも通り make & make install でおわり。

$ make
$ sudo make install

オレオレ証明書の作成

SPDY が TLS 上で機能するため SSL 証明書が必要となりますが、今回はとりあえずオレオレ証明書でやり過ごしました。途中の質問等々は、いつものように適切かつ適当に入力しました。
SSL 証明書を持っている場合は、当然この作業はスキップ可能ですね。

$ cd $HOME
$ openssl genrsa -des3 -out certificate.key 2048
$ openssl req -new -key certificate.key -out certificate.csr
$ cp certificate.key certificate.key.org
$ openssl rsa -in certificate.key.org -out certificate.key
$ openssl x509 -req -days 3650 -in certificate.csr -signkey certificate.key -out certificate.crt
$ sudo mv certificate.* /usr/local/nginx/conf

nginx の設定

nginx の設定を編集し、SPDY を有効にします。といっても、listen のオプションに spdy と書くだけで、他に特別な設定はいりませんでした。
SSL 証明書は先ほど作成したオレオレ証明書を割り当てました。

server {
  listen               443 default ssl spdy;  # spdy って書いた
  server_name          _;
  ssl                  on;
  ssl_certificate      /usr/local/nginx/conf/certificate.crt;
  ssl_certificate_key  /usr/local/nginx/conf/certificate.key;
  ssl_session_timeout  5m;

  ... # いつもの設定
}

正しく設定したところで、設定ファイルを再読込します。

$ sudo service nginx configtest
$ sudo service nginx reload

ところで、興味本位で HTTP (Port: 80) の設定に対して spdy って書いたら、アクセスしても応答しなくなりました。
ダメ、ゼッタイ。

server {
  listen       80 default spdy;  # configtest は通るけれど、動かない
  server_name  _;

   ... # いつもの設定
}

確認する

ChromeSPDY indicator をインストールし、SPDY の設定をしたサイトを表示すると、アドレスバーの右端に緑の雷マークが表示され SPDY が有効になっていることが確認できました。


パフォーマンスについてはまたこれから検証していくということで、ひとまず、わーい。