mod_spdyをMac OS Xのapache(macports)に導入する
Googleがmod_spdyをリリースしたというニュースが出たので早速うちのapacheにも導入してみようかと思います.
LinuxだとDebian系用のdebやCentOS系用のrpmは用意されているので多分楽に使えるのですが,残念ながらうちのサーバはMac OS XかFreeBSDしかないので,頑張ってソースからインストールしてみようと思います.
環境
準備
Google Code Archive - Long-term storage for Google Code Project Hosting.
基本的にこのページを見れば準備はできます.
3. 4. に関して,Max OS XのapacheのSSLの導入の仕方は上記ページの解説とは違いますが本題から逸れるのでググってくだしあ.
ビルドのための調整
5. Build mod_spdyから大きく変わります.
まず,makeコマンドを打てと言っていますが,Makefileなんか無いです.
どうするのかというとxcodeでビルドします.
src/build/all.xcodeprojを開きます.
x86_64への対応
まずhttpdのMach-Oフォーマットを調べます.variantsで+universalしているかどうかで変わります.
x86_64ネイティブの場合
% file /opt/local/apache2/bin/httpd /opt/local/apache2/bin/httpd: Mach-O 64-bit executable x86_64
% 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)に変更します.
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
パフォーマンス
うちのサイトはパフォーマンスの差はそれほど出ないだろうけど測定してみる.
測定に当たってはキャッシュの類を全て消します.
これまでに出会ったエラー
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でコンパイルしたけどhttpdがUniversal 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に)