NginxでのSPDY導入方法

概要


今回はNginxをSPDYプロトコル通信に対応させたいと思います。
私が、SPDYを知ったのが日経NETWORKの3月号を読んだときでした。
HTTP1.1の次、HTTP2.0はこのSPDYを基礎として作られるのではないかとのこと
(*あくまで現時点の話です)

そんな面白そうなこといつ試すの?今でしょ!

お断り この記事では導入しただけで、導入テストはしておりません。
    申し訳ございません。それはまた別の記事で

SPDYについて


SPDYとは、Googleが開発した、Webページの表示を高速化するためのプロトコルである。
SPDYは、OSI参照モデルにおけるアプリケーション層に位置するプロトコルである。データストリームの多重化、リクエストへの優先順の付与、HTTPヘッダの圧縮などを行うことでレイテンシを削減し、それによってWeb上のコンテンツの送受信にかかる時間の短縮を図るものである。
引用元はIT用語辞典バイナリ

私自身もまだSPDYについてわからない事が多いですが

  • 従来の1対1のコネクションではなく1本のコネクションで複数の通信ができる。
  • デフォルトでヘッダの圧縮を行う
  • クライアントからの応答だけではなくサーバから通信をおこなうサーバーヒント、サーバープッシュ

上記のような機能があります。
SPDYについてはまた別記事にしたいと考えています。

参考にさせていただいたページ

OSS界のちょっと気になる話(7):次世代HTTP 2.0はSPDYの取り組みがベースに – @IT

二年後に誕生するHTTP 2.0はGoogleのSPDYがベース

Chrome for AndroidではWeb通信がGoogleのプロキシサーバを経由する

WEB高速化のための実験段階のプロトコルSPDYとは|シフルIT

導入準備


導入方法については公式のドキュメントが存在します。
Nginxはパッケージからのインストールもできますが、提供されているのは最新版ではなく古いバージョンのものになります。
よって、私はNginxのソースからrpmbuildで最新のrpmを作りインストールしました。

導入前にrpmbuildできる環境を用意しておくことが必要

NginxのSPECファイル準備

[bash]
git clone git://github.com/easel/nginx-centos-rpm.git
cd nginx-centos-rpm
ls
404.html default.conf nginx-auto-cc-gcc.patch nginx.init nginx.logrotate nginx.sysconfig sources virtual.conf
50x.html index.html nginx.conf nginx-logo.png nginx.spec poweredby.png ssl.conf
cp -R . rpmbuild/SOURCES
cp nginx.spec rpmbuild/SPECS
[/bash]
上記の手順でSPECファイルを準備します


導入方法


①ソースファイルのダウンロード、解凍

Nginx公式からソースファイルをSOURCESフォルダにダウンロードします。
今回はNginx Development version 1.3.14を使用しています。
[bash]
cd rpmbuild/SOURCES
wget http://nginx.org/download/nginx-1.3.14.tar.gz
tar zxfv nginx-1.3.14.tar.gz
rm -rf nginx-1.3.14.tar.gz
[/bash]

②パッチを適用

SPDYモジュールは今現在デフォルトの機能として組み込まれていません。
よってパッチを当てます。
[bash]
cd nginx-1.3.14
wget http://nginx.org/patches/spdy/patch.spdy.txt
patch -p1 < patch.txt
rm patch.txt
[/bash]

③Open SSL 1.0.1をダウンロード

SPDYがTLSを使用して通信するので、Open SSL 1.0.1以上が必要になります。
これはシステム側にインストールする必要はありません。*ドキュメント参照
[bash]
wget http://www.openssl.org/source/openssl-1.0.1.tar.gz
tar zxfv openssl-1.0.1.tar.gz
rm -rf openssl-1.0.1.tar.gz
[/bash]
nginx-1.3.14フォルダの中身はこのようになっています↓
[bash]
ls
CHANGES CHANGES.ru LICENSE README auto conf configure contrib html man openssl-1.0.1 src
[/bash]

④フォルダからソースファイルの作成

[bash]
tar cvf nginx-1.3.14.tar.gz nginx-1.3.14
[/bash]

⑤specファイルの編集

設定項目は4つほどあります。
12行目あたりのversionを変更
[bash]
cd rpmbuild/SPECS
vim nginx.spec
version: 1.3.14
[/bash]
./configureの前にexport LANG=’jp_JP.UTF-8’を追加
[bash]
export LANG=’js_JP.UTF-8′
export DESTDIR=%{buildroot}
./configure \
–prefix=
[/bash]
./configure オプションの追加
[bash]
./configure \
–with-http_ssl_module \
–with-http_spdy_module \
–with-openssl=openssl-1.0.1 \
[/bash]
make オプションの変更
make %{?_smp_mflags}をコメントアウトして、ただのmakeを追加
[bash]
#make %{?_smp_mflags}
make
[/bash]

⑥rpmbuildの実行

[bash]
rpmbuild -bb nginx.spec
[/bash]
以上でRPMSフォルダにnginx-1.3.14のrpmファイルが作られます。

インストール


実際にインストールしてみます。
/etc/nginxフォルダのバックアップを取っておきましょう。
[bash]
sudo rpm -Uvh nginx-1.3.14-3.el6.x86_64.rpm
[/bash]

インストールされているか確認


組み込まれているモジュール一覧を表示
[bash]
nginx -V
……
–with-mail_ssl_module –with-http_spdy_module –with-openssl=openssl-1.0.1 –with-cc-opt=’-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector –param=ssp-buffer-size=4 -m64 -mtune=generic’ –with-ld-opt=-Wl,-E
[/bash]

以上で導入完了です。

あとは導入テストですが、これはまた別の記事で書きたいと思います。

ハマったところ

makeオプションをコメントアウトするところでハマりました。
最初コメントアウトせずデフォルトで実行していました。
するとこんなエラーが
[bash]
make[4]: ディレクトリ `rpmbuild/BUILD/nginx-1.3.14/openssl-1.0.1/crypto/cmac’ から出ます
if [ -n "" ]; then \
(cd ..; make libcrypto.so.1.0.0); \
fi
make[3]: ディレクトリ `rpmbuild/BUILD/nginx-1.3.14/openssl-1.0.1/crypto’ から出ます
make[2]: ディレクトリ `rpmbuild/BUILD/nginx-1.3.14/openssl-1.0.1′ から出ます
make[1]: *** [openssl-1.0.1/.openssl/include/openssl/ssl.h] エラー 2
make[1]: ディレクトリ `rpmbuild/BUILD/nginx-1.3.14′ から出ます
make: *** [build] エラー 2
エラー: /var/tmp/rpm-tmp.UzKRCx の不正な終了ステータス (%build)

RPM ビルドエラー:
/var/tmp/rpm-tmp.UzKRCx の不正な終了ステータス (%build)
[/bash]

if [ -n “” ]; then \
        (cd ..; make libcrypto.so.1.0.0); \
fi

(・’v`・)?? 全くわかりません

そこで参考にしたのが以下のページです。
Re: nginx build with OpenSSL 1.0.1

ここのページに行き着いても英語が読めないので結構困りました。
英語大切ってことで以上です。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です