ファイルアップローダといえばPerlやPHPで作られたものが多いですが、レスポンスが悪かったりメモリを大幅に消費しがちです。mod_uploader はApacheのモジュールとして動作するため、非常に高速です。
導入の経緯
Dropbox等のオンラインストレージを使えば済む話ではあるのですが、ITリテラシの低いユーザーにアカウント取得やクライアントのインストールを案内するのは現実的でない場面もあります。「ブラウザだけでデータ共有できる手段」として、レガシーながら本手法はまだまだ有用だと判断しました。
身内で大量の旅行写真を共有する目的で導入しています。
インストール環境
- Ubuntu 12.04.1 LTS
- Apache 2.2.x
- PHP 5.3.x
インストール手順
debパッケージではlibmagick等のバージョン不整合でうまくいかなかったため、ソースコンパイルで導入しました。
必須パッケージ
sudo aptitude install imagemagick libmagick++-dev
apxsが必要になるため、Apache動作モードに応じたパッケージを導入します。apache2 -V で Server MPM を確認してください。
# Preforkの場合
sudo aptitude install apache2-prefork-dev
# Workerの場合
sudo aptitude install apache2-threaded-dev
コンパイルとインストール
wget --trust-server-names \
'http://sourceforge.jp/frs/redir.php?m=iij&f=%2Fmod-uploader%2F37519%2Fmod_uploader-3.1.1.tgz'
cd mod_uploader-3.1.1
./configure --enable-empty-comment --enable-empty-password \
--enable-remove-unpopular --enable-thumbnail
make
sudo make -f GNUmakefile.apache install
make install により mods-available へのコンフィグ作成と mods-enabled へのsymlink作成まで実行されるため、a2enmod は不要です。
configureオプションの意味
| オプション | 説明 |
|---|---|
--enable-empty-comment | 空のコメントを受け付ける |
--enable-empty-password | 空のパスワードによる削除を受け付ける |
--enable-remove-unpopular | 容量満杯時に、古いものではなく最近ダウンロードされていないものから削除する |
--enable-thumbnail | ファイルのサムネイル画像を生成する |
ディレクトリ配置
mod_uploader のサイト用ファイル(img, css, js, tmpl)をコピーして配置します。サイト全体を認証しつつ、アップロードグループ毎に異なる認証を設定する構成にしました。
virtualhost_root/
├ mod_uploader_tmpl
└ public_html
├ mod_uploader_root
│ ├ img, css, js
│ ├ upload_group_A
│ │ └ data, file, temp, thumb
│ └ upload_group_B
│ └ data, file, temp, thumb
├ up_img@ → mod_uploader_root/img
├ up_css@ → mod_uploader_root/css
└ up_js@ → mod_uploader_root/js
symlinkで up_* のみ認証を外すことで、複数アップローダを効率的に運用できます。
パーミッション設定と起動
chown -R www-data:www-data mod_uploader_root
/etc/init.d/apache2 restart
導入時のトラブル
debパッケージからのインストールでは以下のエラーが発生しました。libMagick++.so.9 が見つからないという依存関係の問題です。
Cannot load /usr/lib/apache2/modules/mod_uploader.so into server:
libMagick++.so.9: cannot open shared object file: No such file or directory
ソースコンパイルで導入することで解決しています。

