ページ更新: 2009-10-19 (月) (3561日前)

関連: ソフト/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システムコールを使っているとの情報があったが、このモジュール内には見つからなかった。
      • APR-UTILが実装している?
  • v0.9 では、4GB超のファイルを転送できない。
    • v0.11 (beta) で修正された。
  • 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 (フィルタの実装用?)