その場で画像のサイズを変更する

画像を使用するほとんどすべてのWebアプリケーションでは、これらの画像の小さなコピーを作成する必要があり、多くの場合、いくつかの追加の画像形式があります。
また、既存のアプリケーションに新しいサイズが追加されるという頭痛の種もあります。 したがって、タスク:

挑戦する



要件のリストを示します。



最後の段落について説明します。最初の段落とは若干矛盾しています。 画像の形成をオープンにすると、無数の形式で画像のサイズを変更するために多数のリクエストを生成することでサイトが攻撃される可能性があるため、この脆弱性を解決する必要があります。

Nginxインストール構成



上記の要件を解決するには、次のnginxモジュールのセットが必要です。



ngx_http_image_filter_moduleおよびngx_http_secure_link_moduleモジュールはデフォルトではインストールされないため、 nginxインストールの構成段階で指定する必要があります。

phoinix@phoinix-work:~/src/nginx-0.8.29
$ ./configure --with-http_secure_link_module --with-http_image_filter_module


Nginx設定



ホストの構成で、新しい場所と一般的なキャッシュパラメーターを追加します。

...
proxy_cache_path /www/myprojects/cache levels=1:2 keys_zone=image-preview:10m;
...
server {
...
location ~ ^/preview/([cir])/(.+) {
#
set $oper $1;
#
set $remn $2;
#
proxy_pass http://myproject.ru:81/$oper/$remn;
proxy_intercept_errors on;
error_page 404 = /preview/404;
#
proxy_cache image-preview;
proxy_cache_key "$host$document_uri";
# 200 1
proxy_cache_valid 200 1d;
# 1
proxy_cache_valid any 1m;
}

#
location = /preview/404 {
internal;
default_type image/gif;
alias /www/myprojects/image/noimage.gif;
}
...
}
...


また、構成に新しいホストを追加します。

server {
server_name myproject.ru;
listen 81;

access_log /www/myproject.ru/logs/nginx.preview.access_log;
error_log /www/myproject.ru/logs/nginx.preview.error_log info;

# md5
secure_link_secret secret;

# location
error_page 403 404 415 500 502 503 504 = @404;

# location size
location ~ ^/i/[^/]+/(.+) {

# *
alias /www/myproject.ru/images/$1;
try_files "" @404;

# md5
if ($secure_link = "") { return 404; }

#
image_filter size;
}

# location
location ~ ^/c/[^/]+/(\d+|-)x(\d+|-)/(.+) {
set $width $1;
set $height $2;

alias /www/myproject.ru/images/$3;
try_files "" @404;

if ($secure_link = "") { return 404; }

image_filter crop $width $height;
}

location ~ ^/r/[^/]+/(\d+|-)x(\d+|-)/(.+) {
set $width $1;
set $height $2;

alias /www/myproject.ru/images/$3;
try_files "" @404;

if ($secure_link = "") { return 404; }

image_filter resize $width $height;
}

location @404 { return 404; }
}


その結果、リンクから追加の画像を取得できます。



* try_files-スペースとロシア文字に敏感なので、 aliasで松葉杖を作らなければなりませんでした。

Webアプリケーションで使用する



Webアプリケーションレベルでは、次の手順を実行できます(Perl)。

sub proxy_image {
use Digest::MD5 qw /md5_hex/;
my %params = @_;
my $filter = {
size => 'i',
resize => 'r',
crop => 'c'
}->{$params{filter}} || 'r';
my $path = ($filter ne 'i' ?
( $params{height} || '_' ) . 'x' . ( $params{width} || '_' ) . '/' :
()
) . $params{source};
my $md5 = md5_hex( $path . 'secret' );
$path = '/preview/' . $filter . '/' . $md5 . '/' . $path;
return $path;
}

my $preview_path = &proxy_image(
source => 'image1.jpg',
height => 100,
width => 100,
filter => 'resize'
);


プレビューサイズの計算もお勧めしますが。

すくい



元の画像を削除すると、キャッシュが無効になるまでプレビューはもちろんキャッシュから削除されません。この場合、プレビューは削除後1日間存在できますが、これは最大時間です。

オリジナル

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


All Articles