mod_uploader: Apache のモジュールとして動作する,C++で記述された高速アップローダ

mod_uploader とは?

mod_uploader は,よくあるアップローダを Apache のモジュールとして 実装したものです.以下のような特長があります.

動作サンプル

http://acapulco.dyndns.org:8888/up/

動作環境

mod_uploader は,UNIX 系 OS 及び Windows で動作します. 詳細を以下に示します.

UNIX 系 OS

開発は,Linux kernel 2.6.10,Apache 2.0.52,ImageMagick 6.1.8.8 で行っ ています.

Windows

ダウンロード

ライセンス

The zlib/libpng License (翻訳) に従います. 読んでいただけば分かると思いますが,制限がかなり緩いものとなっていま す.ライセンスの範囲内であれば自由に改造・再配布を行ってもらってかま いません.

バグ情報

バグ情報

バグを見つけた場合は,リンク先の「新規レポート」から書き込んでください.

コンパイル方法

UNIX 系 OS

GCC でコンパイルする場合は,

$ ./configure
$ make

とします.Intel C++ Compiler でコンパイルする場合は,

$ CC=icc ./configure
$ make

とします.

configure は次のオプションを受け付けます.エラーがでた場合は,--with-apxs2 や --with-aprconf を試してみてください.

--with-apxs2=APXS
apxs コマンドのパスを指定します.自動的に検出されない場合に使用し ます.
--with-ap2ctl=APCTL
apachectl コマンドのパスを指定します.自動的に検出されない場合に使 用します.
--with-aprconf=APRCONF
apr-config コマンドのパスを指定します.自動的に検出されない場合に 使用します.
--with-march=CPU
特定の CPU 向けに最適化したい場合に使用します.例えば,Pentium 4 に最適化したい場合は,--with-march=pentium4 とします.
--enable-thumbnail
指定すると,ThumbDirectory で指定したディレクトリにサムネイル画像を 生成するようになります.
--with-mconf
Magick++-config コマンドのパスを指定します.自動的に検出されない場 合に使用します.
--with-writer=TYPE
ファイルを書き出す方法を指定します.mmap と basic が指定可能です. (デフォルト: mmap)
--enable-iconv-const
iconv の第二引数に const をつけるかどうか.Linux の場合は指定する必 要はありません.
--with-ie-name-code=CODE
Internet Explorer に対してファイル名を出力するときの文字コード. (デフォルト: cp932)

Windows

まず,UNIX 系 OS で configure します.

% ./configure

次に,ディレクトリを丸ごと Windows にコピーし,src/GNUmakefile.win32 の次の部 分を,Apache をインストールしたディレクトリおよびImageMagick をイン ストールしたディレクトリに書き換えます.

APACHERDIR  := C:/Server/Apache2
MAGICKDIR   := C:/Application/Image/Edit/ImageMagick

以上が完了したら,src/GNUmakefile.win32 を使って make します.

> cd src
> vsvars32.bat
> make -f GNUmakefile.win32

vsvars32.bat は,コマンドラインから Visual C++ を使うための環境設定 を行うスクリプトです.Visual C++ をインストールしたディレクトリ以下 の Common7/Tools にあります.

インストール

UNIX 系 OS

次のコマンドを実行するだけで OK です.

$ su
# make install

Windows

コンパイル or ダウンロードした mod_uploader.so を Apache をインストー ルしたディレクトリ以下にある modules ディレクトリにコピーし,Apache の設定ファイル (httpd.conf) に

LoadModule uploader_module modules/mod_uploader.so

を追加します.

次に,環境変数 APR_ICONV_PATH に,Apache をインストールしたディレク トリ以下にある bin/iconv ディレクトリへのパスを指定します.これが正 常に行われていないと,「文字コードの変換を行うコンバータが存在しませ ん.」というエラーが発生します.

設定

設定は,Apache の設定ファイル(.htaccess は不可)に,以下のように記述 します.(* 印がついているものは必須) テンプレートは,tmpl ディレクトリに入っている view.htm,download.htm, thumbnail.htm,error.htm を利用してください.

<Location アップローダを設置するパス>
    SetHandler              uploader

    Url                     アップローダの URL (RSS の生成に利用)

    FileDirectory           アップロードファイルを保存するディレクトリ[*]
    ThumbDirectory          サムネイル画像を保存するディレクトリ[*]
    TmpDirectory            一時ファイルを保存するディレクトリ[*]
    LockDirectory           ロックファイルを保存するディレクトリ[*]

    MaxFileSize             一回にアップロードできるファイルの最大サイズ(KB)
    TotalFileSizeLimit      ファイルの合計サイズの上限値(KB)
    TotalFileNumberLimit    ファイルの個数の上限値
    PerPageItemNumber       1 ページあたりに表示するアイテム数

    ViewTemplateFile        トップページのテンプレートファイル[*]
    DownloadTemplateFile    DL pass 入力画面のテンプレートファイル[*]
    ThumbTemplateFile       サムネイルページのテンプレートファイル[*]
    ErrorTemplateFile       エラーページのテンプレートファイル[*]
</Location>

http://foo/up に設置する場合の設定例は以下のようになります./css や /thumb の Alias は必須ではありません.テンプレートを書き換えたくない 場合に指定してみてください.(これはあくまでも例です.ディレクトリや ファイルのパスは環境よって違ってきます)

<Location /up>
    SetHandler              uploader

    Url                     "http://acapulco.dyndns.org/up/"

    FileDirectory           "Z:/prog/Apache/Uploader/file"
    ThumbDirectory          "Z:/prog/Apache/Uploader/thumb"
    TmpDirectory            "Z:/prog/Apache/Uploader/tmp"
    LockDirectory           "Z:/prog/Apache/Uploader/lock"

    MaxFileSize             1024
    TotalFileSizeLimit      10240
    TotalFileNumberLimit    1000
    PerPageItemNumber       20

    ViewTemplateFile        "Z:/prog/Apache/Uploader/tmpl/view.htm"
    DownloadTemplateFile    "Z:/prog/Apache/Uploader/tmpl/download.htm"
    ThumbTemplateFile       "Z:/prog/Apache/Uploader/tmpl/thumbnail.htm"
    ErrorTemplateFile       "Z:/prog/Apache/Uploader/tmpl/error.htm"
</Location>

Alias   /css    "Z:/prog/Apache/Uploader/css"
Alias   /thumb  "Z:/prog/Apache/Uploader/thumb"

注意事項

ImageMagick の設定

Windows でサムネイル作成機能を使う場合,環境変数 PATH に, ImageMagick をインストールしたディレクトリ (CORE_RL_*.dll があるディ レクトリ) を追加してください.

起動

UNIX 系 OS

Apache を普通に起動すれば OK です.ただし,Intel C++ Compiler でコン パイルした場合は,下記のように LD_PRELOAD を指定しながら Apache を起 動する必要があります.(コンパイル時に -cxxlib-gcc を指定する手もある と思いますが,gcc-name に何を指定すれば良いのか分からなくて止まって ます)

$ LD_PRELOAD=/opt/intel/compiler80/lib/libunwind.so.5 "Apache の起動コマンド"

Windows

Apache を普通に起動すれば OK です.

トラブル・シューティング

アクセスすると Internal Server Error になってしまう.

mod_uploader を実行するのに必要な環境が整っていない場合に表示されます. この場合,Apache のエラーログに,「Exception: \xc0\xdf\xc4\xea\xcf\xb3\xa4\xec\xa4\xac\xa4\xa2\xa4\xea\xa4\xde\xa4\xb9\xa1\xa5 」のような出力が出ていると思います.Exception 以降の文字列をコピーし て,コンソールで以下のようなコマンドを実行してみてください.日本語の エラーメッセージを読むことができます.
$ % perl -e 'print "\xc0\xdf\xc4\xea\xcf\xb3\xa4\xec\xa4\xac\xa4\xa2\xa4\xea\xa4\xde\xa4\xb9\xa1\xa5", "\n"'
設定漏れがあります.

テンプレートの書式

Comming soon...

API ドキュメント

http://acapulco.dyndns.org/mod_uploader/api/

ツール

プログラムの作成にあたってお世話になったツールを紹介します.

Valgrind
メモリの不正な参照や解放し忘れなどをチェックしてくれるツール.デバッ グでかなりお世話になりました.

参考文献

プログラムの作成にあたってお世話になった文献を紹介します.

Apacheモジュール プログラミングガイド
Apache のモジュール作成に必要になる事柄を一通り説明した本.痒いと ころに手が届いているので,手元に置いておくと重宝します.
Advanced Topics in Module Design: Threadsafety and Portability
Apache2 でモジュールを作成するときに必要になってくるテクニックが解 説されたパワポ.そんなに長くないので,モジュール書く前にさらっと読 んでおきましょう.
Apache API C++ Cookbook
C++ を使って Apache のモジュールを作成する際の注意事項について説明 したサイト.
STLのページ
C++ の標準テンプレートライブラリである STL について簡潔にまとめられ たサイト.
RubyExtensionProgrammingGuide
Ruby の拡張ライブラリの書き方を解説したサイト.基本的な事項から少し 高度な話題まで非常に良くまとまってます.
Compiler Construction Lecture 琉球大学 by 河野真治
コンパイラ作成に関する実践的な内容が簡潔にまとめられたサイト.簡単 なインタプリタもどきを作るんだったら,このサイトだけで十分かも.