古い画像では、ベースイメージを読み込んだ直後に必要なすべてのミニチュアを生成するように指示されています。 この方法は実証済みで信頼性がありますが、月曜日の朝から新しいミニチュアサイズが必要になる可能性のある不安定な新しい世界に住んでいます。 そのため、リクエストに応じてその場でミニチュアを生成します。
ビジネスには、 ngx_http_image_filter_moduleが必要です。 これは、JPEG、GIF、PNG形式の画像を変換できるモジュールです。 モジュールは標準ですが、デフォルトではビルドされないため、nginxをビルドする前に追加する必要があります。
次に、システムで受け入れられる方法でlibgdをインストールし 、nginxを収集します。 ところで、FreeBSDポートからビルドする場合は、./configure --with-http_image_filter_module
make config
を作成し、リストから目的のモジュールを選択するだけです。
ピンチするだけ
簡単にするために、/ path / to / imagesにある画像が発行されるドメインimages.domain.comがあると仮定します。/some/image.jpg
への要求は直接発行され、
/120x90/some/image.jpg
/
/120x-/some/image.jpg
/120x90/some/image.jpg
または
/120x-/some/image.jpg
への要求はサムネイルに
/120x-/some/image.jpg
されます(2番目の場合、幅のみがスケーリングされます)。 この場合、次のようになります。
server {
server_name images.domain.ru;
root /path/to/images;
if ($uri ~ ^/(\d+|-)x(\d+|-)/) {
set $w $1;
set $h $2;
}
location / {
}
location ~ ^/(?:\d+|-)x(?:\d+|-)/.*\.(?:jpg|gif|png)$ {
rewrite ^/[\w\d-]+/(.*)$ /$1;
image_filter resize $w $h;
break;
}
}
ここで何が起こっていますか? 最初に、サムネイルのサイズを決定し、適切な変数を設定します。 次に、静的を発行し、サムネイル
image_filter
進み、2番目の場所をより詳細に検討します:
rewrite
はURLを実際のファイルにリダイレクトし、
image_filter
は受信した画像を減らし、
break
は内部リダイレクトが
location
を出るのを防ぎ
location
。 後者は重要です。そうしないと、Nginxはすでに書き換えられたURLを使用して再び完全な画像を表示します。
定義済みのサイズを追加できます。
if ($uri ~ ^/small/) {
set $w 120;
set $h 90;
}
location ~ ^/(?:\d+|-)x(?:\d+|-)|small/.*\.(?:jpg|gif|png)$ {
...
ところで、プロセッサを気にしないなら、FreeBSD 8 / Core 2 Quad Q9550 @ 2.83GHz / DDR2-800で既にこれを使用できます。毎秒200枚の画像をピンチすることができました(jpeg、640x480-> 150x150)。 しかし、もちろん、プロセッサには申し訳ありませんので、ピンチした写真をキャッシュします。
キャッシュされたピンチ
Ngx_http_proxy_moduleはNginxのキャッシュを処理します。プロキシするもののみをキャッシュするため、それをかわす必要があります。2つのポートをリッスンして、自分でプロキシします。
proxy_cache_path /path/to/cache levels=1:2 keys_zone=thumbs:10m inactive=24h max_size=5G;
server {
server_name images.domain.ru;
location ~ ^/(?:\d+|-)x(?:\d+|-)|small/ {
proxy_pass http://localhost:8081;
proxy_cache thumbs;
proxy_cache_valid 200 24h;
proxy_cache_valid 404 415 1m;
}
location / {
root /path/to/images;
}
}
server {
listen 8081;
... ...
}
すべてがキャッシュからのものである場合、現在、前述のシステムで行われているNginxは毎秒15,000枚の画像を表示します。 私は設定をペイントしません;それらはモジュールのドキュメントに詳しく説明されています 。 ここで完全な設定を取得できます 。