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 _; ... # いつもの設定 }
確認する
Chrome に SPDY indicator をインストールし、SPDY の設定をしたサイトを表示すると、アドレスバーの右端に緑の雷マークが表示され SPDY が有効になっていることが確認できました。
パフォーマンスについてはまたこれから検証していくということで、ひとまず、わーい。