mod_uploader 設置したよ (失敗編)
ちょっとしたことから、アップローダが必要になったので mod_uploader を設置してみました。
結論からいうと失敗。
どうやら Lighttpd(Frontend) + Apache (Backend) の構成があんまりよくないみたい。
いままで、mod_proxy って、単純に何も処理をせずに Backend にまわすものだと思っていたけれど、実はそうじゃない?
100MB を Frontend の lighty を経由して Apache の mod_uploader に渡そうとすると、lighty が負荷に耐えきれずに死んでる?
というか、アクセス拒否?
などなど、ちょっと認識不足な部分が。。。
というわけで奮闘記。
アップローダで最初に思いついたのは、それなりに有名で Perl で書かれている「Sn Uploader」。
設置もかんたんで、lighttpd ですぐに動かせたんだけれど。。。
今回対象としているファイルが 100MB 近くあったためか、応答が返ってこずアップロードも失敗。。。
「どうしよう?」と悩んでいたら
- mod_uploader
- http://acapulco.dyndns.org/mod_uploader/
というのを発見。
どうやら、Apache のモジュールとして登録し、動かすことができるみたい。
というわけで、Front の lighty から mod_proxy を使って Back の Apache へ飛ばし、そこで動かす作戦に。
lighty の設定はこんな感じ。
基本的には、Back の Apache へと処理をまわす部分と、Static なものをサーブしておく設定、それと今回はアクセス制限についての記述を書きました。
$HTTP["host"] == "uploader.mydomain.jp" { server.document-root = "/home/www/uploader/htdocs" server.errorlog = "/var/log/lighttpd/uploader/error.log" accesslog.filename = "/dev/null" # アクセス制限をする # 階層の深い順から設定するのがポイント # こうするとディレクトリごとに認証がかけられる auth.backend = "htdigest" auth.backend.htdigest.userfile = "/home/www/uploader/htdigest" auth.require = ( "/upload/admin" => ( "method" => "digest", "realm" => "admin", "require" => "user=admin" ), "/upload" => ( "method" => "digest", "realm" => "uploader", "require" => "user=guest" ), ) # apache へ処理委譲 $HTTP["url"] == "^/upload" { setenv.add-request-header = ( "X-Forwarded-Host" => "uploader.mydomain.jp" ) proxy.server = ( "" => (( "host" => "127.0.0.1", "port" => 8080 )) ) ) # static なのは lighty でサーブ alias.url = ( "/up_img/" => "/home/www/uploader/static/img", "/up_css/" => "/home/www/uploader/static/css", "/up_js/" => "/home/www/uploader/static/js", ) }
続いて Back の Apache 側。
肝心の mod_uploader は deb パッケージがサイトにおいてあったのでこれを利用。
また、別途 libmagick++-dev が必要だったため、これもインストール。
インストールはいつものように
dpkg -i mod_uploader.deb aptitude install libmagick++-dev
ただ、これだけだと Apache を起動し、モジュールを読み込み始めたところで
「ライブラリが見つからないよ!」
と怒られるので、むりやりシンボリックリンクを作成して読み込ませることに。
とりあえず、いまのところは問題ないので OK としよう。。。
作ったシンボリックリンクは以下の通り。
- /usr/lib/
ln -s libMagick++.so.10.0.9 libMagick++.so.9 ln -s libWand.so.10.0.9 libWand.so.9 ln -s libMagick.so.10.0.9 libMagick.so.9 ln -s libjasper.so.1.0.0 libjasper-1.701.so.1
で、Apache の設定は debian の流儀に則り、/etc/apache2/site-available/ 以下にファイルを作成し、それを a2ensite を利用して有効にしました。
設定内容については mod_uploader のサイトに書いてある内容と /etc/apache2/mod-enable/uploader.conf を参考にしました。
vi /etc/apache2/sites-available/uploader # 設定ファイルつくって a2ensite uploader # 設定を有効にする
というわけで、設定完了。
Apache と lighty を再起動してアクセスすると無事にアップローダが表示されました。
が、実際に10MBくらいのファイルをアップロードしてもらったところ、どうも途中でアップロードが停止してしまう感じ。
そして、何より top をすると lighttpd がめちゃくちゃメモリくってる!
しかも、Apache のプロセスは沈黙してる。。。
というわけで、mod_proxy 使っていても Front に lighty がいると、lighty に負荷がかかるようで。。。
まぁ、Back の Apache と直接通信しているわけじゃない(?)から、当たり前といえば当たり前?
そんなわけで、回避策は・・・?
このくらい?
そもそもこの構成にした理由は、Apache で mod_perl 動かして、lighty で static なファイルとか、あとはカンタンな CGI とかを動作させるためだったんだけれど、最近は Catalyst も lighty + FastCGI で動かす方がいろいろと便利だし、あまり Apache で CGI を使う理由もなくなってきたような。。。
というわけで、今回は2の選択肢を選ぶことにしました。
というのはまた次回に。
とりあえず、mod_uploader 便利だよ!
わーい。