Apacheの2GB転送制限
ApacheでWikiのファイルをtar.gzで固めたファイルを転送しようとしたら、アクセス権限は正しいのに「Forbidden You don’t have permission to access XXX on this server.」が出てしまう。何やらよくわからんので、冒頭をいくらかコピーしてみたら、これは問題ないようだ。ごにょごにょやっているうちに、どうやらファイルサイズの問題らしいことが判明。
なんだが、「Apache ファイル サイズ 制限」とかで検索してもアップロードでのサイズ制限のことしか出てこない。
とりあえず、目的のファイルは2.9GBあるのだが、限界のファイルサイズを特定しようと、空データで指定サイズのファイルを作成してみることに。touch コマンドで空ファイルを作成できるので、サイズ指定オプションもあるかもと思ったが、Vineのtouchコマンドにはなかった。
そこで、別の方法を探すことに。
- Solarisで100Mとか指定サイズの空ファイルを作成する方法-俺の技術メモ
- 例:mkfile 10k file.dat
- Windows 巨大なサイズの空ファイルを作成するコマンド – 雑記&備忘録
- 例:fsutil file createnew hogehoge 2048
Solaris や Windows なら mkfile や fsutil コマンドがあるようなのだが、こちらもなかったので、次の dd コマンドを使う方法を試した。
- ITmedia エンタープライズ : Linux Tips「容量指定のダミーファイルを作成したい」
- 例:dd if=/dev/zero of=tempfile bs=1M count=10
「bs=1M count=2048」として2GBバイトのファイルを作成した時点で転送拒否となった(count=2047まではOK)。
ということで、「apache 制限 2GB」とすると、いくつか見つかった。
- Overview of new features in Apache 2.2 – Apache HTTP Server
||Large File Support - Apache で 2GB 以上のファイルがダウンロードできない。 – にわとりと小鳥とワニ
- 2.2以前のバージョンでは、2GB以上のファイルは扱えない
- [ヅラド] 2GBの壁
- vdrめも – Large File Support の日 – apache2 2GB, 4GB の壁。
- あーありがち – Apache 1.3 で転送できる最大サイズ
- タムタムの日記 – Apacheで2GB以上のファイルアップロードを扱う
2.2以前ではでかいファイルは扱えないらしい。
確かに、見直すとエラーログにもそのような記述で残ってましたわ…。
[error] [client XXX.XXX.XXX.XX] (75)Value too large for defined data type: access to XXX failed
Apacheにコンパイルオプションを指定して構築し直したり、上位バージョンをインストールすれば対応できそうだけど、ひとまずデータを分割してサイズを縮小してみることにした。
ところで、上のリンクのvdrさんのところで、perlのtruncate関数を使って指定サイズのファイルを作成する方法が紹介されていた。こちらのほうがddを使うより早い(指定値はコマンドラインでなく -e 内部に記述した)。
touch foo.txt perl -e 'truncate "foo.txt", 2*1024**3'
truncateの第1引数はファイルハンドルのみでなく、上の例のようにファイル名でもいいようだ。