私はDrupal 7アプリケーションをWebサーバーのDocumentRootが読み取り専用でマウントされている環境にデプロイしています(そのため、Drupalsのルートディレクトリと以下のすべてのディレクトリは書き込み可能ではありません)。 DocumentRootの外に提供され、読み取り/書き込みでマウントされます。このディレクトリには、別のWebサーバーインスタンスからアクセスできます(これは、PHPコードを実行せずに静的ファイルのみを提供します。例:) static.example.com)。
私がしたこと:
画像の配信を除いて、すべてが正常に動作するようです(CSSなど)。 Drupalの画像配信のコンセプトは、要求された画像解像度がディスク上で見つからない場合は常にサムネイルメカニズムが呼び出されることです。サムネラは新しい画像を作成し、それは要求元のブラウザに配信され、sites/default/filesの下に保存されます。後続のリクエストはディスクから直接イメージを配信します(Apacheの書き換えルールを使用しているため、PHPはもう関係ありません)。
Webサーバーの前でワニスを使用しているので、画像を処理する別の方法をお勧めします。
これを達成する方法はありますか?
生成された画像が利用できない場合、ページのコールバックは image_style_deliver()
になります。このコールバックはまず画像を生成し(アクセスと同時実行のチェックの後)、ファイルを応答としてストリーミングします( file_transfer()
関数を使用)。
hook_menu_alter()
を使用すると、画像生成コールバックをオーバーライドして、画像が生成されたら静的ドメインにリダイレクトできます。生成されたファイルが常に静的ドメインから提供されるようにする。静的サーバーでは、まだ生成されていないイメージのリクエストを非静的ドメインにリダイレクトするための書き換えルールを追加できます。静的ドメインから要求された場合でも、ファイルが確実に生成されるようにします。リダイレクトのため、Varnishはファイルが生成されるとすぐにキャッシュできるはずです。
編集:ディスク上のファイルはオプションのようではないため、イメージ派生物を作成しないこと。 Drupalは Image Toolkits wrapper API)を使用します (GdとImageMagikは通常バックエンドで使用されます)画像を生成し、このAPIは画像を生成する方法を提供していないようです生成されたファイルを本当に削除する必要がある場合は、cronジョブで image_style_flush()
hook_cron()
を使用して削除できます。 。
一種の応答:
1.〜画像は別の仮想ホストから提供されます(例:image.example.com)
[〜#〜] nfs [〜#〜] を使用して、Drupalのsites/default/files
ディレクトリをimages.example.com
ドキュメントルートにマウントするか、または同等のネットワークディレクトリマウント方法でOS。
2.〜サムネイル画像はディスクに書き込まれません
Drupalでそれが可能かどうかはわかりませんが、おそらく ファイルストリームラッパーハンドラー をオーバーライドして、関連するファイル操作が異なる方法で処理されるようにすることができます。
3.代わりに、妥当な長いmax-age値を使用してCache-Controlヘッダーが送信されるため、ワニスのLRU有効期限メカニズムは、頻繁に使用されるイメージをメモリに保持し、未使用のイメージを破棄できます
images.example.com
の仮想定義Hostは、Varnishに関連する応答ヘッダーを設定して、それらのイメージをキャッシュできます。