7

CSS および JS ファイルを圧縮するdjango-compressorを使用した Heroku セットアップがあります。デフォルトのキャッシュ バックエンドは memcached (Heroku では実際には Memcachier) でセットアップされています。私の静的ファイルは Amazon S3 インスタンス ( django-storagesと boto によって処理されます) で提供されています。一般的に、私のセットアップはdjango-compressor docs のこれと一致しています。

私のページでは、圧縮ファイルへのリンクに「有効期限」クエリがあり、リンクが生成されてから 1 時間後に表示されます。圧縮していない CSS と JS があるため、すべての CSS または JS リクエストの有効期限を設定したくありません (試してみるとエラーが発生します... おそらく別の質問です)。

ただし、1 時間に 1 回リンクが切れ、サイトにスタイルや JS がなくなります。リンク、または少なくとも expires ヘッダーがキャッシュされ、再生成されていないように見えるため、expires 引数の時間が経過すると、Amazon はファイルを返さなくなります。memcache をフラッシュすると、リンクの expires ヘッダーがそれから 1 時間に変更され、再び期限切れになるまで 1 時間問題が修正されます。

以下は、本日 9 月 18 日火曜日の東部標準時間午後 1 時 39 分頃に生成されたリンクの例です。 %3D&Expires=1347993542&AWSAccessKeyId=AKIAIJ7VKLEX7HIMJZCA . 最初に生成された後、ページは変更なしでそのリンクを提供し続けます。2:39 EST (つまり、URL の expires 引数からの Unix 時間 1347993542) 頃、そのリンクは動作を停止し、"Expired" XML メッセージを送り返しました (現在と同じものです)。しかし、memcache をフラッシュするまで、私のページにはまだ悪いリンクが残っていました。

関連する設定は次のとおりです。

COMPRESS_ENABLED = True

STATICFILES_STORAGE = '[my app's name].storage.CachedS3BotoStorage' (a subclass of S3BotoStorage that is almost identical to the one from django-compressor's docs linked above)

COMPRESS_STORAGE = STATICFILES_STORAGE

COMPRESS_URL = STATIC_URL

CACHES = {
  'default': {
    'BACKEND': 'django_pylibmc.memcached.PyLibMCCache',
    'LOCATION': 'localhost:11211',
    'TIMEOUT': 500,
    'BINARY': True,
  }
}

エラーは次のとおりです。

<Error>
<Code>AccessDenied</Code>
<Message>Request has expired</Message>
<RequestId>81A63F24378ECB5E</RequestId>
<Expires>2012-09-18T18:39:02Z</Expires>
<HostId>lIr5l9Fna95DUfk6hUsWqhO5EQNn6Ayu8BatpEavis8YzLvsaJRru4O8P/50pgMy</HostId>
<ServerTime>2012-09-18T18:59:51Z</ServerTime>
</Error>
4

1 に答える 1

2

ブラウザに静的コンテンツをキャッシュさせたい場合は、それに応じて を設定します( Amazon のベスト プラクティスsettings.AWS_HEADERSで概説されているように)。

AWS_HEADERS = {
    'Expires': 'Sun, 19 Jul 2020 18:06:32 GMT'
}

リンクを再生成する必要がある場合は、memcache に保存されている場所を見つけて、リンクの有効期限として Amazon に送信するのと同じキャッシュ時間を設定します (django-compressorドキュメントから判断すると、のいずれかである必要がありますsettings.COMPRESS_*_DELAY)。

于 2012-09-27T18:04:23.670 に答える