Irudiak erabiltzen dituen ia edozein web aplikaziotan, irudi horien kopia txikiak sortu beharra dago, eta askotan irudi gehigarrietarako hainbat formatu daude.
Lehendik dagoen aplikazio bati dimentsio berriak gehitzeak buruhauste batzuk ere eragiten ditu. Hortik zeregina:
Task
Adierazi dezagun eskakizunen zerrenda:
- Sortu edozein formatutako irudi gehigarriak joan-etorrian aplikazioan funtzionalitate gehigarririk sartu gabe aplikazioaren existentzian zehar;
- Irudi gehigarriak ez dira eskaera guztietan sortu behar;
- Desgaitu zehaztu gabeko formatuetako irudi gehigarriak sortzeko gaitasuna.
Azken puntua azalduko dut, lehenengo puntuarekin apur bat kontraesanean dagoelako. Edozein irudiren sorrera irekitzen badugu, orduan gunean eraso bat egiteko aukera dago, irudia formatu kopuru infinitu batean tamainaz aldatzeko eskaera ugari sortuz, beraz, ahultasun hori itxi egin behar da.
nginx instalazioaren konfigurazioa
Aurreko baldintzak konpontzeko nginx modulu multzo hau behar dugu:
ngx_http_image_filter_module β irudiak tamaina aldatzeko;ngx_http_proxy_module - cachean gordetzeko;ngx_http_secure_link_module - spam-aren aurka babesteko;
Moduluak ngx_http_image_filter_module ΠΈ ngx_http_secure_link_module ez daude lehenespenez instalatuta, beraz, instalazioaren konfigurazio fasean zehaztu behar dira nginx:
phoinix@phoinix-work:~/src/nginx-0.8.29
$ ./configure --with-http_secure_link_module --with-http_image_filter_module
nginx konfigurazioa
Berri bat gehitzen dugu gure ostalariaren konfigurazioan kokalekua eta cachearen parametro orokorrak:
...
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;
}
...
}
...
Ostalari berri bat ere gehitzen diogu konfigurazioari:
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; }
}
Ondorioz, irudi osagarriak lor daitezke esteka hauek erabiliz:
myproject.ru/preview/i [md5]/[irudirako_bidea]myproject.ru/preview/c [md5]/[tamaina]/[irudirako_bidea]myproject.ru/preview/r [md5]/[tamaina]/[irudirako_bidea]
* saiatu_fitxategiak β espazioekiko eta karaktere errusiarekiko sentikorra, beraz, makulu bat egin behar izan nuen ezizena.
Erabili web-aplikazio batean
Web aplikazio mailan, prozedura hau egin dezakezu (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'
);
Tamainak kalkulatzea ere gomendatuko nuke arren Aurreikuspen.
rake
Jatorrizko irudia ezabatzean, aurrebistak, jakina, ez dira cachetik ezabatuko cachea baliogabetu arte, eta gure kasuan, aurrebistak ezabatu ondorengo egun baterako egon daitezke, baina hau da gehienezko denbora.
Iturria: www.habr.com