ืืื ืึผืืขื ืงืืื ืืืขื ืึทืคึผืืึทืงืืืฉืึทื ืืืึธืก ื ืืฆื ืืืืืขืจ, ืขืก ืืื ืึท ื ืืื ืฆื ืืึทืื ืงืืืื ืงืืคืืขืก ืคืื ืื ืืืืืขืจ, ืืื ืึธืคื ืขืก ืืขื ืขื ืขืืืขืืข ืคึฟืึธืจืืึทืืืจืื ืืขื ืคึฟืึทืจ ื ืึธื ืืืืืขืจ.
ืึทืืื ื ื ืืึท ืืืืขื ืฉืึทื ื ืฆื ืึท ืืืืืกืืื ื ืึทืคึผืืึทืงืืืฉืึทื ืืืื ื ืขืืืขืืข ืืขืืืืงืก. ืืขืจืืืขืจ ืื ืึทืจืืขื:
ืึทืจืืขื
ืืื ืก ืึธื ืืืืึทืื ืื ืจืฉืืื ืคืื ืืืืขืจืคืขื ืืฉื:
- ืืืฉืขื ืขืจืืื ื ืึธื ืืืืืขืจ ืคืื ืงืืื ืคึฟืึธืจืืึทื ืืืืฃ ืื ืคืืืขื ืึธื ืื ืืจืึธืืืืกืื ื ื ืึธื ืคืึทื ืืงืฉืึทื ืึทืืืื ืืื ืื ืึทืคึผืืึทืงืืืฉืึทื ืืื ืงืืื ืฆืืื ืืขืฉืึทืก ืื ืึทืคึผืืึทืงืืืฉืึทื ืก ืขืงืืืกืืขื ืฅ;
- ื ืึธื ืืืืืขืจ ืืึธื ื ืื ืืึทืจืคึฟื ืฆื ืืืื ืืืฉืขื ืขืจืืืืึทื ืืืืฃ ืืขืืขืจ ืืงืฉื;
- ืืืกืืืืึทื ืื ืคืืืืงืืื ืฆื ืืืฉืขื ืขืจืืื ื ืึธื ืืืืืขืจ ืคืื ืื ืกืคึผืขืกืืคืืขื ืคึฟืึธืจืืึทืืืจืื ืืขื.
ืืื ืืืขื ืืกืืืจ ืืืื ืื ืืขืฆืืข ื ืงืืื, ืืืืื ืขืก ืืื ืืืืกื ืกืืชืจ ืื ืขืจืฉืืข ื ืงืืื. ืืืื ืืืจ ืืึทืื ืื ืืืจ ืคืื ืงืืื ืืืืืขืจ ืขืคืขื ืขื, ืขืก ืืื ืึท ืืขืืืขืืงืืื ืคืื ืึท ืืึทืคืึทืื ืืืืฃ ืืขื ืคึผืืึทืฅ ืืืจื ืืืฉืขื ืขืจืืืืื ื ืึท ืืจืืืก ื ืืืขืจ ืคืื ืจืืงืืืขืก ืฆื ืจืขืกืืืข ืื ืืืื ืืื ืึท ืื ืคืึทื ืึทื ื ืืืขืจ ืคืื ืคึฟืึธืจืืึทืืืจืื ืืขื, ืึทืืื ืืขื ืืืึทืื ืขืจืึทืืืืืื ืืึทืจืฃ ืืืื ืคืืจืืืื.
nginx ืืึทื ืืึธื ืืืจืื ื ืงืึทื ืคืืืืขืจืืืฉืึทื
ืฆื ืกืึธืืืืข ืื ืืืืื ืจืขืงืืืืจืขืืขื ืฅ, ืืืจ ืืึทืจืคึฟื ืื ืคืืืืขื ืืข ืืึทื ื ืคืื nginx ืืึทืืืฉืืื:
ngx_http_image_filter_module - ืคึฟืึทืจ ืจืขืกืืืื ื ืืืืืขืจ;ngx_http_proxy_module - ืคึฟืึทืจ ืงืึทืืฉืื ื;ngx_http_secure_link_module - ืฆื ืืึทืฉืืฆื ืงืขืื ืกืคึผืึทื;
ืืึธืืืืขืก ngx_http_image_filter_module ะธ ngx_http_secure_link_module ืืขื ืขื ื ืืฉื ืืื ืกืืึทืืืจื ืืืจื ืคืขืืืงืืึทื, ืึทืืื ืืื ืืืื ืืืื ืกืคึผืขืกืืคืืขื ืืื ืื ืืึทื ืืึธื ืืืจืื ื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืข ื ืืื ืงืก:
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; }
}
ืืื ืึท ืจืขืืืืืึทื, ื ืึธื ืืืืืขืจ ืงืขื ืขื ืืืื ืืืงืืืขื ืืื ืื ืคืืืืขื ืืข ืืื ืงืก:
myproject.ru/preview/i [ืื5]/[ืคึผืึทื_ืฆื_ืืืื]myproject.ru/preview/c [ืื5] / [ืืจืืืก] / [ืคึผืึทื_ืฆื_ืืืื]myproject.ru/preview/r [ืื5] / [ืืจืืืก] / [ืคึผืึทื_ืฆื_ืืืื]
* try_files โ ืฉืคึผืืจืขืืืืืง ืฆื ืกืคึผืืืกืึทื ืืื ืจืืกืืฉ ืืืชืืืช, ืึทืืื ืืื ืืขืืื ืฆื ืืึทืื ืึท ืงืจืึทื ืืื ืึทืืืึทืก.
ื ืืฆื ืืื ืึท ืืืขื ืึทืคึผืืึทืงืืืฉืึทื
ืืืืฃ ืื ืืืขื ืึทืคึผืืึทืงืืืฉืึทื ืืืจืื, ืืืจ ืงืขื ืขื ืืึธื ืื ืคืืืืขื ืืข ืคึผืจืึธืฆืขืืืจ (ืคึผืขืจื):
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'
);
ืืึธืืฉ ืืื ืืืึธืื ืืืื ืจืขืงืึธืืขื ืืืจื ืงืึทืืงืืึทืืืืืื ื ืื ืกืืืขืก ืคืึธืจืืืกืืงืข ืืืืึทืืื ื.
ืืจืึทืืืืข
ืืืขื ืืขื ืืืกืืขืงื ืื ืึธืจืืืื ืขื ืืืื, ืคึผืจืืืืืื, ืืขืืืืื ืืืขื, ืืืขื ื ืืฉื ืืืื ืืืืกืืขืืขืงื ืคืื ืื ืงืึทืฉ ืืื ืื ืงืึทืฉ ืืื ืื ืืืึทืืึทืืืืืึทื, ืืื ืืื ืืื ืืืขืจ ืคืึทื, ืคึผืจืืืืืื ืงืขื ืขื ืขืงืกืืกืืืจื ืคึฟืึทืจ ืึท ืืึธื ื ืึธื ืืืืืฉืึทื, ืึธืืขืจ ืืึธืก ืืื ืื ืืึทืงืกืืืื ืฆืืื.
ืืงืืจ: www.habr.com