[Edit][Create New]
[ IndexPage / ネットとプログラミング / web296 / No42.txt ]

No42.txt

さて、前回はキャッシュの必要性とその仕組みについて、簡単に説明しました。
今回は、なぜ「2ちゃんねる」にキャッシュの機能が働いていなかったのかを中
心に解説していきます。

まず、2ちゃんねるでキャッシュが有効になっていなかった、最も大きな原因が
「2ちゃんねるのメイン・コンテンツのほとんどが、CGIの出力に依っていた」
ことにあります。

CGIというのはご存知の通り、サーバー上に一般に「CGIスクリプト」と呼ばれ
るプログラム(スクリプト)を配し、そのCGIスクリプトにアクセスがある毎にそ
のプログラムが実行され、その結果がWebブラウザに返される仕組み(正確には
インターフェイス)の名称です。

この仕組みを用いた場合、ドキュメントはその都度生成されるので、「ファイ
ルがいつ作られたか」という情報を持つことができません。つまり、「Last-
Modified: 」ヘッダを使うキャッシュの仕組みをうまく使う事ができないので
す。仮にドキュメントが生成された時刻をファイルの生成日時に設定したとし
ても、ドキュメントは常に最新のものであると解釈されるため、キャッシュが
使われる機会はありません。

しかし、おみくじやアクセス・カウンターなどの一部のCGIスクリプトを除き、
多くのCGIスクリプトでは、ある一定期間中の出力は、常に同じであるという場
合が多いのも事実です。実際、2ちゃんねるのメイン・コンテンツである掲示板
も、誰かが書き込みをするまでは、同じドキュメントしか出力しません。

ここで、Webサーバーが、掲示板の最後の書き込み時刻を管理してそれをLast-
Modified: ヘッダとしてブラウザに送信してくれればよいのですが、掲示板の
最後の書き込み時刻というのは普通ログファイルに記録されていて、それを参
照しなければ知ることができませんが、Webサーバーがそれを把握するのは困難
でしょう。

そこで、2ちゃんねる閉鎖騒動の時には、CGI側でこれを管理するという対策が
取られました。要するに、CGIスクリプトがログ・ファイルの最終更新時刻を取
得し、これをブラウザ側に送信するという仕組みです。また、これだけでは
HTTP/1.1のキャッシュの仕組みを有効にすることはできませんので、ブラウザ
からのリクエスト中の「If-Modified-Since」ヘッダを読み取り、これをファイ
ルの最終更新時刻と比較し、ログが新しくなっていなければ、何もブラウザに
返さない(代わりにブラウザにキャッシュを使う旨の指示を出す)ようにします。

これで、HTMLファイルなどのドキュメントでWebサーバーが使っているのと同じ
キャッシュの仕組みが、CGIスクリプトでも実現できることになりました。ここ
で、コンピュータの内部時計の形式と(2ちゃんねるのサーバー内では、グリニッ
ジ天文台での1970年1月1日午前0時0分からの経過秒数が使われています)Last-
Modified: ヘッダで使われる形式の変換など、色々苦労があったのですが、こ
こでは割愛します。本来、日付のフォーマットは3つサポートしなければいけな
いのですが、閉鎖騒動の時はそのうちIEやNetscapeで使われている1つの形式の
みをサポートさせました。この辺りのやりとりは、

http://cocoa.2ch.net/unix/kako/998/998754174.html

このスレッドに詳しいです。