はちゅにっき

こっちのブログはまったり更新

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 と直接通信しているわけじゃない(?)から、当たり前といえば当たり前?
そんなわけで、回避策は・・・?

  1. Squid を Front へもってきて、Back を Apache と lighty の2本立てにする?
  2. そもそも Apache を Front にすればいいんじゃない?

このくらい?
そもそもこの構成にした理由は、Apachemod_perl 動かして、lighty で static なファイルとか、あとはカンタンな CGI とかを動作させるためだったんだけれど、最近は Catalyst も lighty + FastCGI で動かす方がいろいろと便利だし、あまり Apache で CGI を使う理由もなくなってきたような。。。
というわけで、今回は2の選択肢を選ぶことにしました。


というのはまた次回に。


とりあえず、mod_uploader 便利だよ!
わーい。