3

mod_cache を使用して、動的に生成されたコンテンツをキャッシュしようとしています。これは私の Apache 設定です:

CacheEnable mem /
MCacheSize 4096
MCacheMaxObjectCount 100
MCacheMinObjectSize 1
MCacheMaxObjectSize 2048
CacheIgnoreCacheControl On
CacheIgnoreNoLastMod On
CacheStorePrivate On
CacheStoreNoStore On

<Location /cgi-bin>
    SetHandler cgi-script
    Options +ExecCGI
</Location>

これは CGI スクリプトの 1 つです (テスト用です)。

#!/opt/app/phantomjs/bin/phantomjs
var date = new Date('Sun, 01 Jan 2012 00:00:00 GMT');
console.log('Last-Modified: '+ date.toUTCString());
console.log('Cache-Control: max-age=' + (365 * 24 * 60 * 60)+ ', public');
date.setDate(date.getDate() + 365);
console.log('Expires: '+ date.toUTCString() + '\n\n');

// lengthy operation here...

console.log(content);

これは基本的に機能します。しかし、クライアントがヘッダー付きの cgi-bin を要求すると、次のようになりますIf-Modified-Since

  1. CGI スクリプト ストリーム ヘッダー
  2. 数秒遅れる
  3. CGI スクリプト ストリームの本文
  4. Apache は 304 を送信します

それは私には意味がありません。Apache は、変更されていない応答を送信する前に、応答全体を待機します。

私が期待したこと

  1. CGI スクリプト ストリーム ヘッダー
  2. Apache は 304 を送信します
  3. CGI スクリプトがキャンセルされるか、CGI スクリプトの本体が破棄されます

それを成し遂げる方法はありますか?

4

2 に答える 2

0

CGI スクリプトを次のように変更する必要があります。

  1. 静的な最終更新日を使用しないでください。動的リソースの Last-Modified は、現在の実行時刻に設定する必要があります。

  2. キャッシュ制御ディレクティブにタイプ エラーが含まれています 'pulic' は 'public' である必要があります

  3. Cache-Control は Expires より優先度が高いため、Expires ディレクティブは必要ありません。

ヘッダーを送信した後に期待される動作「CGI スクリプトを終了する」は不可能です。キャッシュが機能している場合、キャッシュ エントリが無効になるまで CGI スクリプトは実行されません。

于 2013-07-20T17:56:24.257 に答える
0

これが、前回のコメントで話している解決策です。CGI 実行を内部仮想ホストに転送します。この構成では、mod_cache は期待どおりに機能します。Apache 2.2.21 を搭載したマシンでテストしました。

# virtual cgi host - used internally only for cgi execution
<VirtualHost *:8080>
    ##ServerAdmin postmaster@dummy-host.localhost
    DocumentRoot "C:/Project/web"
    ServerName cgi-bin.local
    ErrorLog "logs/cgi-bin-error.log"
    CustomLog "logs/cgi-bin-access.log" combined
    LogLevel debug

    <Location /cgi-bin>
        SetHandler cgi-script
        Options +ExecCGI
    </Location>

</VirtualHost>

# Virtual host used by client
<VirtualHost *:8080>
    ##ServerAdmin postmaster@dummy-host.localhost
    DocumentRoot "C:/Project/web"
    ServerName web.local
    ErrorLog "logs/web-error.log"
    CustomLog "logs/web-access.log" combined

    CacheEnable mem /
    MCacheSize 4096
    MCacheMaxObjectCount 100
    MCacheMinObjectSize 50
    MCacheMaxObjectSize 20480
    MCacheMaxStreamingBuffer 20480
    CacheIgnoreCacheControl On
    CacheIgnoreNoLastMod On
    CacheStorePrivate On
    CacheStoreNoStore On

    ProxyRequests Off
    ProxyPass /cgn-bin http://cgi-bin.local:8080/
    ProxyPassReverse /cgn-bin http://cgi-bin.local:8080/

</VirtualHost>
于 2013-07-21T15:59:55.557 に答える