Nginxサムネイルジェネレーター

そこで、今日は、人々に愛されているWebサーバーであるnginxをベースにしたミニチュアジェネレーターを組み立てます。 注目すべきことは、私たちは単一の釘なしでそれを行います。 1行のコードなしで、構成をカウントしません。

古い画像では、ベースイメージを読み込んだ直後に必要なすべてのミニチュアを生成するように指示されています。 この方法は実証済みで信頼性がありますが、月曜日の朝から新しいミニチュアサイズが必要になる可能性のある不安定な新しい世界に住んでいます。 そのため、リクエストに応じてその場でミニチュアを生成します。

ビジネスには、 ngx_http_image_filter_moduleが必要です。 これは、JPEG、GIF、PNG形式の画像を変換できるモジュールです。 モジュールは標準ですが、デフォルトではビルドされないため、nginxをビルドする前に追加する必要があります。
./configure --with-http_image_filter_module
次に、システムで受け入れられる方法でlibgdインストールし 、nginxを収集します。 ところで、FreeBSDポートからビルドする場合は、 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枚の画像を表示します。 私は設定をペイントしません;それらはモジュールのドキュメントに詳しく説明されています 。 ここで完全な設定を取得できます

Source: https://habr.com/ru/post/J94435/


All Articles