nginx for Windowsはキャッシュ機能が動かない。

公開:2013-08-21 20:58
更新:2017-09-22 05:40
カテゴリ:nginx

衝撃の事実

まあ表題のとおりである。インストールして、VPSサーバで設定しているFastCGIキャッシュが効く設定をローカルマシンに持ってきて微調整した。微調整した点はUNIXドメインソケットが使えないので127.0.0.1:8080で置き換えたりとか、epelをコメントアウト、userをコメントアウトとか、そんなところ。nginx -tでシンタックスチェックでOK。でも動作しない。ログを見るとへんてこりんなエラーが。

2013/08/20 05:57:26 [emerg] 4128#3020: shared zone "fscgi" has no equal addresses: 02E10000 vs 02E00000
2013/08/20 05:57:26 [alert] 1916#3776: worker process 4128 exited with code 1
2013/08/20 05:57:56 [emerg] 2516#4724: shared zone "fscgi" has no equal addresses: 02990000 vs 02FB0000
2013/08/20 05:57:56 [alert] 2728#1888: worker process 2516 exited with code 1
2013/08/20 05:58:41 [emerg] 5468#5472: shared zone "fscgi" has no equal addresses: 03020000 vs 03060000
2013/08/20 05:58:41 [alert] 5460#5464: worker process 5468 exited with code 1
2013/08/20 06:00:47 [emerg] 5780#5784: shared zone "fscgi" has no equal addresses: 029F0000 vs 02EB0000
2013/08/20 06:00:47 [alert] 5772#5776: worker process 5780 exited with code 1

この情報でググると、衝撃の事実が。最初にnginx.orgのWindows版の項を読んどけば衝撃は受けなかったと思うが。引用すると、

・共有メモリーのサポートが必要なキャッシュやその他のモジュールは Windows Vista 以降では動作しません。こうした Windows のバージョンではアドレス空間レイアウトのランダム化が有効になっているからです。

なんと、ASLRのためにWindows Vista以降のOSではキャッシュ機能が動作しない。Windows 8ではキャッシュの検証はできないことがわかった。やりたければWindowsXPか、Linuxで動かすかしかないのであった。そもそもASLRって何なの?と思ったので調べてみると、まあなんというかセキュリティ強化のため、起動ごとにモジュールなどの配置アドレスをランダムに変化させる機能らしい。しかしなんでASLRが有効だと共有メモリーが使えないのかな?そこを突っ込んで調べてみたいのだけれどもなかなかそれを解説しているリソースには行きつかないのであった。

しかしキャッシュ機能の検証ができないのは痛いな。どうしようかな。ソースコードがあるんだから、改造してキャッシュ動かすようにできないかなとも思うが、nginxはビルドするのがちょっと面倒臭いしね。それよりもサーバーコードを書くには知識がなさすぎる。その線は厳しいような気もするが、ちょっとくらいはソースコード見てみてもいいかな。あとはcentosをHyper-VとかVMWareとかで動かすとか、ほんとどうしようか。。