mod_spdyをMac OS Xのapache(macports)に導入する

http://www.yuyarin.net/screenshot/20120422185338.png

Googleがmod_spdyをリリースしたというニュースが出たので早速うちのapacheにも導入してみようかと思います.

LinuxだとDebian系用のdebCentOS系用のrpmは用意されているので多分楽に使えるのですが,残念ながらうちのサーバはMac OS XFreeBSDしかないので,頑張ってソースからインストールしてみようと思います.

環境

Lion(10.7)だとXcodeSDKの変化に対応するための書き換えが必要になるみたい.

準備

Google Code Archive - Long-term storage for Google Code Project Hosting.

基本的にこのページを見れば準備はできます.

3. 4. に関して,Max OS XapacheSSLの導入の仕方は上記ページの解説とは違いますが本題から逸れるのでググってくだしあ.

ビルドのための調整

5. Build mod_spdyから大きく変わります.

まず,makeコマンドを打てと言っていますが,Makefileなんか無いです.

どうするのかというとxcodeでビルドします.

src/build/all.xcodeprojを開きます.

x86_64への対応

まずhttpdMach-Oフォーマットを調べます.variantsで+universalしているかどうかで変わります.

x86_64ネイティブの場合

% file /opt/local/apache2/bin/httpd
/opt/local/apache2/bin/httpd: Mach-O 64-bit executable x86_64

Universal Binaryの場合

% file /opt/local/apache2/bin/httpd
/opt/local/apache2/bin/httpd: Mach-O universal binary with 2 architectures
/opt/local/apache2/bin/httpd (for architecture x86_64):     Mach-O 64-bit executable x86_64
/opt/local/apache2/bin/httpd (for architecture i386):     Mach-O executable i386

※次の手順で他の部分も書き換えるので,作業する前にひとまず全て読んでください.

all.xcodeproj内に含まれる全てのプロジェクトを開いて,Project -> Edit Project SettingsのArchitecturesを.x86_64ネイティブの場合は64-bit Intelに,universalの場合はStandard (32/64-bit Universal)に変更します.

http://www.yuyarin.net/screenshot/20120422190421.png

no-common

all.xcodeproj内に含まれる全てのプロジェクトを開いて,Project -> Edit Project SettingsのOther C-Flagsに -fno-commonを入れます.

mod_spdy

mod_spdy.xcodeprojのターゲットをmod_spdyにしてProject -> Edit Active Target "mod_spdy"を開き,

  • Mach-O Type : Bundle
  • Other Linker Flags : -dynamic -undefined dynamic_lookup -Wl,-search_paths_first
  • Exported Symbols File :
    • 適当なファイルに _spdy_module と記述
    • そのファイルパスを指定する

とする.

コードの書き換え

プリプロセスが適切に動作しているかどうかわからないので,apacheから呼び出されるsymbolを確実にexportするように書き換え(もしかしたら必要ないかもしれない)

899a900
< #if defined(__linux)
900a902
< #endif
904,905c906
>  struct module_struct __attribute__((visibility("default")))  spdy_module = {
---
<   module AP_MODULE_DECLARE_DATA spdy_module = {
925a927
< #if defined(__linux)
926a929
< #endif

ビルド

src/buildへcdしでビルド

% xcodebuild -project all.xcodeproj -configuration Release -target All

テスト系はビルドに失敗するかもしれない.

確認

src/xcodebuild/Release/mod_spdy.soが存在することを確認

symbol spdy_moduleがexportedになっているか確認.大文字のDで表示されていればOK.

% nm mod_spdy.so | grep _spdy_module
0000000000037e40 D _spdy_module

導入

コンフィグ

SSLの設定は入れてください

httpd.conf

LoadModule spdy_module modules/mod_spdy.so

Virtual Host

<VirtualHost *:443>
        ServerName www.yuyarin.net
        ...
        SSLEngine on
        SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
        SSLCertificateFile www.yuyarin.net.cert.pem
        SSLCertificateKeyFile www.yuyarin.net.privkey.pem
        ...
        SpdyEnabled on
        ...
ロード
% sudo cp mod_spdy.so /opt/local/apache2/modules
% sudo port unload apache2; sudo port load apache2

SPDYが有効になっているか確認

Google ChromeのExtensionのSPDY Indicatorをインストールして,httpsでアクセス.

http://www.yuyarin.net/screenshot/20120422185338.png

右上の稲妻が緑色に光れば導入成功!

パフォーマンス

うちのサイトはパフォーマンスの差はそれほど出ないだろうけど測定してみる.

測定に当たってはキャッシュの類を全て消します.

SPDY (https)

http://www.yuyarin.net/screenshot/20120422193440.png

ロードまでに331ms

HTTP

http://www.yuyarin.net/screenshot/20120422193601.png

ロードまでに419ms,何度かやったが差がでる.

違いはどこだろう.大きく見てDomCompleteまでに80ms多く時間がかかっているが,domainLookUpEndやConnectEndのネットワーク部分の時間もSPDYに比べて8ms余計にかかっている.

正直この程度のサイトじゃ効果はよくわからないように感じる.

解析

Wiresharkで通信の様子を眺めてみようかと思ったけどSSLで暗号化されているので諦めた

http://www.yuyarin.net/screenshot/20120422194347.png

これまでに出会ったエラー

httpd: Syntax error on line 119 of /opt/local/apache2/conf/httpd.conf: Cannot load /opt/local/apache2/modules/mod_spdy.so into server: dlopen(/opt/local/apache2/modules/mod_spdy.so, 10): no suitable image found.  Did find:\n\t/opt/local/apache2/modules/mod_spdy.so: mach-o, but wrong architecture

httpdアーキテクチャと合致していない(設定を変えないとi386コンパイルされる)

httpd: Syntax error on line 119 of /opt/local/apache2/conf/httpd.conf: Cannot load /opt/local/apache2/modules/mod_spdy.so into server: dlopen(/opt/local/apache2/modules/mod_spdy.so, 10): no suitable image found.  Did find:\n\t/opt/local/apache2/modules/mod_spdy.so: no matching architecture in universal wrapper

Universal BinaryコンパイルしたけどhttpdUniversal Binaryじゃなかった

httpd: Syntax error on line 119 of /opt/local/apache2/conf/httpd.conf: Can't locate API module structure `spdy_module' in file /opt/local/apache2/modules/mod_spdy.so: dlsym(0x1004061b0, spdy_module): symbol not found

そもそもsymbol _spdy_moduleがない(symbolをexportしないと)

ld: warning: cannot export hidden symbol _spdy_module from mod_spdy.so

_spdy_moduleがexportedになっていない(nmでmod_spdy.oを見るとDになっているのにmod_spdy.soではdに)