先日、弊社のお客様より、ブラウザを利用して大きい容量のファイルがダウンロードできないというお問い合わせを頂きました。ダウンロード出来ないファイルはLinuxのインストールメディア用isoファイルで容量が3GB程度あり、ダウンロード中に突然終了してしまうというお話。さらに詳しく話を聞いてみると、途中まではダウンロードできるが、ある一定のダウンロード量になると、ダウンロードが突如終わってしまう。
お客様の環境ではインターネットへ接続するためにプロキシサーバーを利用しており、このプロキシ設定を外すと、ダウンロードに成功することから、プロキシサーバーが原因ではと考えておられました。
上記の情報を基に調査を行った結果、プロキシサーバーだけが原因ではないことが分かりました。
ここ最近は、余り合致することのない情報だと思いますが、調査した内容が何かの約に立つ可能性もありますので、原因と対策を紹介したいと思います。
1. isoファイルがダウンロードできない原因
isoファイルがダウンロードできない原因は、プロキシサーバーだけでなく、ブラウザ側にもありました。お客様の環境で利用しているブラウザが古くサポートが切れているもの、これが原因の一つ、もう一つはプロキシサーバー側の設定でした。
1-1. ブラウザとしてInternet Explorer6を利用していた。
プロキシサーバーを経由して2GB以上のファイルがダウンロードできない原因の一つ目はブラウザにありました。お客様が利用しているブラウザはサポートが終了しているInternet Explorer6で、このブラウザにはあるバグがあります。具体的にはマイクロソフトのKB298618
「Internet Explorer6で2GB以上のファイルがダウンロードできない。」
が該当します。
このバグは、httpサーバーとクライアント間で特定の接続状態になっているときに2GB以上のファイルがダウンロードできないという内容。今回の問題はInternet Explorer6を利用していたことにより、このバグの影響があったことが挙げられます。
1-2. keep-aliveが有効になっていた。
原因の二つ目は、Internet Explorer6とプロキシサーバー間でkeep-aliveが有効になっていたことです。1-1に記載したKBでは、2GB以上のファイルがダウンロードできないバグは、WEBサーバ側でkeep-aliveが有効になっている場合と記載されています。keep-aliveはクライアント側で変更が出来ないので、サーバー側での対処が必要になりますが、プロキシサーバーを経由しない状態で、isoファイルをダウンロード中にパケットキャプチャしてみても、keep-aliveは有効になっていないようです。
上記からプロキシサーバーを経由する場合のみ、keep-aliveが有効になっているのではと考え、調査を進めました。
2. プロキシサーバーを経由した場合のkeep-aliveを調査
Internet Explorer6 にプロキシサーバーを設定してisoファイルをダウンロードし、httpのポート状態のパケットキャプチャを行いました。
その結果、プロキシサーバーとクライアント間でkeep-aliveが有効になっていることが確認できました。webサーバーとクライアント間では、keep-aliveが有効になっていなくても、プロキシサーバーを経由すると、プロキシサーバーからクライアント間で、keep-aliveが有効になってしまうため、結果として、Internet Explorer6のバグであるKB298618に引っかかってしまい、ダウンロードが2GBを超えると、終了してしまうということが分かりました。
3. 対応方法
Intetnet Explorer 6を現在、利用している環境は殆どないと思いますので、対応を行う場面はそれ程ないかと思いますが(仮にあったとしても、他のブラウザを利用するなどで回避できます。)
この問題については、プロキシサーバーの設定変更で回避が可能でした。
その方法を紹介します。なお、プロキシサーバーはLinuxにインストールしたsquidというオープンソースのプロキシサービスを利用している前提です。
対応方法としてはプロキシサーバーであるsquidとクライアント間での接続を行う際、デフォルトで有効になっているkeep-aliveを無効にするという設定があるので、この設定を有効にします。
squidの設定ファイルはsquid.confになります。パッケージでインストールしていると、/etc/squidフォルダにあるパターンが多いようです。このsquid.confに以下の記載を追加します。
client_persistent_connections off
server_persistent_connections off
追加後にsquidを再起動することで設定が有効になります。
この設定を行う場合、keep-aliveが無効になりますので、サーバ – クライアント間のセッションが多数になりサーバ負荷が増加することが考えられます。その点を注意して設定を行って下さい。Internet Explorer6を利用していなくとも、プロキシサーバーを利用していてkeep-aliveを無効にしたいという場合は上記で対応が可能です。
補足としてInternet Explorer6には、元々、4GB以上のファイルをダウンロードできないという制約がありますので、プロキシサーバーとは関係なく4GB以上のファイルはダウンロードすることはできません。