In byna enige webtoepassing wat beelde gebruik, is daar 'n behoefte om klein kopieΓ« van hierdie beelde te skep, en dikwels is daar verskeie formate vir bykomende beelde.
Die toevoeging van nuwe dimensies by 'n bestaande toepassing veroorsaak ook 'n paar hoofpyn. Vandaar die taak:
Taak
Kom ons dui die lys van vereistes aan:
- Genereer bykomende beelde van enige formaat op die vlieg sonder om bykomende funksionaliteit in die toepassing in te voer te eniger tyd gedurende die toepassing se bestaan;
- Bykomende beelde hoef nie op elke versoek gegenereer te word nie;
- Deaktiveer die vermoΓ« om bykomende beelde van ongespesifiseerde formate te genereer.
Ek sal die laaste punt verduidelik, want dit weerspreek die eerste punt effens. As ons die generering van enige beelde oopmaak, is daar 'n moontlikheid van 'n aanval op die webwerf deur 'n groot aantal versoeke te genereer om die grootte van die beeld in 'n oneindige aantal formate te verander, so hierdie kwesbaarheid moet gesluit word.
nginx installasie konfigurasie
Om bogenoemde vereistes op te los, benodig ons die volgende stel nginx-modules:
ngx_http_image_filter_module - om die grootte van beelde te verander;ngx_http_proxy_module - vir cache;ngx_http_secure_link_module - om teen strooipos te beskerm;
Modules ngx_http_image_filter_module ΠΈ ngx_http_secure_link_module is nie by verstek geΓ―nstalleer nie, dus moet hulle tydens die installasiekonfigurasiestadium gespesifiseer word nginx:
phoinix@phoinix-work:~/src/nginx-0.8.29
$ ./configure --with-http_secure_link_module --with-http_image_filter_module
nginx konfigurasie
Ons voeg 'n nuwe een by ons gasheerkonfigurasie plek en algemene kasparameters:
...
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;
}
...
}
...
Ons voeg ook 'n nuwe gasheer by die konfigurasie:
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; }
}
As gevolg hiervan kan bykomende beelde verkry word deur die volgende skakels te gebruik:
myproject.ru/preview/i [md5]/[pad_na_beeld]myproject.ru/preview/c [md5]/[grootte]/[pad_na_beeld]myproject.ru/preview/r [md5]/[grootte]/[pad_na_beeld]
* probeer_lΓͺers β sensitief vir spasies en Russiese karakters, so ek moes 'n kruk mee maak alias.
Gebruik in 'n webtoepassing
Op die webtoepassingsvlak kan u die volgende prosedure (Perl) doen:
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'
);
Alhoewel ek ook sal aanbeveel om die groottes te bereken preview.
Hark
Wanneer die oorspronklike prent uitgevee word, sal voorskoue natuurlik nie uit die kas uitgevee word totdat die kas ongeldig is nie, en in ons geval kan voorskoue vir 'n dag bestaan ββna uitvee, maar dit is die maksimum tyd.
Bron: will.com