0

実行中のファイルアップロードサイトのマルチサーバーサポートを構築しています。画像がアップロードされると....それらはサムネイル化され、メインのフロントエンド サーバーに保存されます。cron が実行されるまで (10 分ごと)、ストレージ サーバーに移動されるため、最初の 10 分間は常駐して提供されます。メインのフロントエンド サーバーから。

ファイルがアップロードされると、ユーザーには埋め込みコードが与えられます...これは、サムネイルの URL + フルサイズの HTML ページへのリンクです。したがって、http://www.domain.com/temp_content/filename.jpg のようなもので、http://www.domain.com/file-IDにリンクしている可能性があります

10 分を除いて、http://www.domain.com/temp_content/filename.jpgは存在しません。http ://server1.domain.com/thumbs/filename.jpg になります。

ユーザーが元のコードを取得した場合... サム ファイルは破損します。

cron を使用せずにファイルを移動先に移動できますが、時間がかかり、移動が完了するまでスクリプトが遅れます。また、ユーザーにそのようなコマンドを実行させるのは好きではありません。サーバーに定期的にコマンドを実行させたいと思います。

他にできることはありますか?

4

10 に答える 10

3

.htaccess で mod_rewrite コマンドを使用して、temp_content 内のファイルが存在するかどうかを確認し、存在しない場合は新しい場所にリダイレクトすることができます

于 2009-07-01T17:43:35.840 に答える
1

非常に単純です:

ファイルのパスが気に入らないので、変更しました。^ _ ^

すぐにメインストレージに移動するためのリンクを作成します。 http://www.domain.com/file/filename.jpg

メインサーバーでは、次のようなルールセットを使用します

RewriteCond%{REQUEST_FILENAME}! -f
RewriteCond%{REQUEST_URI}
/file/(.+)RewriteRule ^ / file /.+ /temp_content/%1 [L、R]

于 2009-07-01T20:01:46.727 に答える
1

image_name/image_location を格納するデータベースと、database-details から画像を提供する汎用 PHP スクリプトを検討しましたか?

于 2009-07-01T17:44:01.143 に答える
0

Cronは、サーバー間でのファイルの負荷分散については何も「決定」しません。Cronは、指定された時間にコマンドを実行します。

サーバー間でイメージの負荷分散を実際に行うロジックはどこにありますか?そのロジックの負荷分散部分は、アップロードを処理するスクリプトによって実行できますか?cronジョブは、アップロードサーバーから最終サーバーへのイメージの実際の移動を引き続き処理できます。

このようにして、アップロードを確認するための「一時的な」場所をユーザーに提示できます。アップロードを確認した後、ユーザーは画像への「最終」リンクを受け取り、「画像がその場所で「ライブ」になるまで10分待つ必要があるかもしれません」というメッセージが表示されます。

于 2009-07-01T20:00:48.693 に答える
0

これは、ネットワークのハッキングを請うようなものです。基本的には、ドメインによってポイントされ、パケットを適切なホストに転送するカスタム ルーティングのことです。それは醜いです

しかし、正直なところ、これは ServerFault にとって大きな問題です。なぜなら、彼らは、この種のことを可能にするトポロジをセットアップする方法を知っているからです。

于 2009-07-01T18:26:24.007 に答える
0

データベースを使用して、画像名を場所にマップします。最新のデータベースはキャッシュを行います。パフォーマンスが悪い場合は、メモリに単純なハッシュ テーブル キャッシュを用意することもできます。これにより、最大 200 万の名前 -> ロケーション マッピングを 500 MB の RAM に格納できます (マッピングごとに最大 256 バイトと仮定)。

ファイルを提供するスクリプトの場合、

  1. 実際にファイルを提供します (その場所からバイトを読み取り、そのバイトをクライアントに送信します)。
  2. クライアントを別のサーバー上の実際の場所にリダイレクトします。
于 2009-07-01T19:37:24.403 に答える
0

本当に、あなたの状況を考えると、私が見ることができる唯一のオプションは、あなたのユーザーに実際の URL を提供することです。次に、実際には 10 分間リンクを使用できないことをユーザーに通知する必要があります。

アイデアの世界では、ユーザーがリンクにアクセスできるようにする必要があるため、このファイルを最終的な保存場所に直接配置することをお勧めします。

于 2009-07-01T17:44:18.193 に答える
0

現在、ウェブサイトにアップロードされたすべてのメディアを約 10 分後に amazon s3/cloudfront に移動し、2 つのことを組み合わせてユーザーを新しい場所にリダイレクトしています。

パブリック アセット (サムなど) の場合、親アイテムの定義をメディアの新しい場所 (例: server1.site.com/media/1.jpg) と共にキャッシュします。

プライベート アセットの場合、認証をチェックするスクリプトに対してリクエストが行われ、認証済みの s3 URL に 302 リダイレクトが発行されます。

簡単に言うと、新しい場所を memcache に保存し、mod_rewrite を元のファイルの 404 のスクリプトにパイプしてから、302 で新しい場所にリダイレクトします。

于 2009-07-01T19:45:53.327 に答える
0

JavaScriptはどうですか?

<img src="http://www.domain.com/temp_content/filename.jpg"
onerror="this.src='http://server1.domain.com/thumbs/filename.jpg'">
于 2009-07-01T17:48:31.200 に答える