0

ユーザーが一連の HTML ファイル (index.html、mypage.html) と一連のアセット (myimage.jpg、myscript.js) をアップロードし、www.mysite のような独自の URL でこれらにアクセスできる基本的なアプリがあります。 com/username/index.html。

ただし、私のサイトでは、アップロードされた HTML にさまざまなものを追加しています。コメントやブックマークなどを追加する機能です。これらはすべて JS を介して挿入されます。

Rails アプリでは、現在、ユーザーが S3 からアップロードしたコンテンツをコントローラーにロードし、一連の JS と共にビューに出力しています。

def show
   # load HTML from S3
   # strip out everything between body tags and put in @body var
   # render view that outputs @body on a page with a bunch of JS
end

ただし、これは次の理由で非常に遅いです。

  1. ユーザーがアップロードしたファイルの CDN キャッシュを利用していない
  2. クライアントに HTTP 呼び出しを入れていません。クライアントは、コンテンツを表示する前に、サーバーが S3 からコンテンツをロードするのを待っています。

私がリクエストしたいことは次のとおりです

  1. Rails アプリは、JS を含む生の HTMl ページを返します。
  2. JS は Cloudfront から HTML ファイルを読み込みます (キャッシュを利用します)。
  3. JS は、コメント、ブックマークなどとともに HTML をページに挿入します。

これは素晴らしいことだと思いますが、ファイルのバージョン管理に行き詰まっています。キャッシュを活用するために、長い TTL を設定し、ファイルの検証を利用したいと考えています。ただし、ユーザーがアップロードしたすべての HTML を実行して、すべてのアセット タグを /myimage.jpg から /myimage-VERSION.jpg に置き換えたくはありません。また、www.mysite.com/ のような長いクレイジーな URL も必要ありません。ユーザー名/インデックス-VERSION.html

これを行う賢い方法があるかどうか疑問に思っていますか?基本的に、Cloudfront から HTML をフェッチし、Rails アプリから HTML を挿入し、Nice URL と元の HTML ファイルを変更せずにバージョン管理されたファイルを利用します。

それとも、コントローラー側で memcached を使用する必要がありますか?

何か案は?

4

1 に答える 1

1

Rails アプリをカスタム オリジンとして使用するように CloudFront をセットアップできます。最初にリクエストを CloudFront に送信します。キャッシュされていない新しいリクエストが CloudFront に届くと、アプリが最初にヒットして CloudFront のキャッシュを準備します。これは、完成したページをキャッシュのために CloudFront に配信する前に、すべてのカスタム処理を行う場合です。適切なキャッシング ETag などを設定すると、CloudFront は 304 または新しいコンテンツを提供できるアップデートをリクエストします。

于 2013-01-23T01:18:02.070 に答える