ページ更新: 2009-10-19 (月) (4642日前)
関連: ソフト/Apache httpd/mod_reproxy
(新規作成: 2008-12-17)
mod_xsendfileのメモ。
[編集]これって、なに? #
X-SENDFILE レスポンスヘッダを付加すると、そのファイルを送信してくれる。
- 使用例:Perl,Rubyなどで、認証だけを行って、ファイル転送をこのモジュールに任せれば、 (Perl,Rubyなどより) 高速になる
[編集]情報源 #
[編集]Apache #
- 2006-12-13 井上の日誌 -Apacheの話- HTTPレスポンス処理(1)
- ap_core_output_filter() 送信bucket brigadeのストリームデータをソケットへ書き込む
- ap_byterange_filter() HTTPレスポンスにContent-Rangeヘッダを付ける
- ap_content_length_filter() HTTPレスポンスにContent-Lengthヘッダを付ける
- ap_http_header_filter() HTTPレスポンスに(種々の)ヘッダを付ける
- 書籍: The Apache Modules Book: Application Development With Apache
- 書籍: Apacheサーバコメンタリー オープンソースコード詳解
[編集]現時点のまとめ #
(2008-12-17)
mod_xsendfile まとめ
- Apache 2.0/2.2用の outputfilter。600行弱。
- APR-UTILのmmapを使っているようだ。
- Linuxなどのsendfileシステムコールを使っているとの情報があったが、このモジュール内には見つからなかった。
- v0.9 では、4GB超のファイルを転送できない。
- Rangeをサポートしているとドキュメントにあるが、未確認。
- ソースコード内には処理が見あたらない。Apacheの方に普通に処理を依頼しているだけ。単に動作確認が取れたという意味か?
制限事項
- Content-Encodingヘッダに対応していない
- つまり、mod_deflateを使って(XMLなどを)圧縮して送る、ということはできない。
- mod_deflateが使えるモードも欲しいところだ。
- システムコールのmmapやsendfileを使わないモードを用意すればよいわけだ。
- モード切替はmod_deflateの設定を使って判別できれば、なおよし
疑問点
- Linuxの32bitモードではメモリマップドファイルって<3GBかも?
- APRが小さい単位に分割してくれているかも。
- ちなみにWindows XP 32bitでは2GB(テストプログラムで確認済み)
- Linux 64bitは調べてない。
- sendfileシステムコールの速度向上やリソースの削減ってどれくらい?
- UNIX Domain Socketだと速かった気がするが
- ユーザランドにデータをコピーしなくてもよい
- ということはシステムコールの回数+データコピーの回数×データ長 分の時間を減らせるのだろうけど。
- ファイル転送完了後に、後始末をしたい。「ファイルを消す」とか。
- もし、Apacheがファイル転送中にずっと掴み続けてくれているなら、転送開始後にファイルを消せばよいのだが。
- 他のプロセスから監視して、「Apacheがファイルをつかんでいれば消す」という手が使えるかも。
- mod_xsendfileに「ファイル転送が完了(成功/失敗のいずれでも)したらファイルを消す」という機能を付ければ良さそう。
[編集]メモ #
[編集]mod_xsendfile 0.11 ap_xsendfile_output_filter関数のメモ #
(2008-12-18)
mod_xsendfileの中核になる関数は ap_xsendfile_output_filter についてのメモ。
- bucketの実装は srclib/apr-util/buckets/*.c (httpd 2.2.11)
- apr_bucket_file_create関数 : srclib/apr-util/buckets/apr_buckets_file.c (APR)
- apr_bucket_eos_create関数 : srclib/apr-util/buckets/apr_buckets_eos.c (APR)
- ap_pass_brigade関数 : server/util_filter.c (フィルタの実装用?)