áá¯ááºáá¯á¶áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááá·áº áááºá¡ááá®áá±ážááŸááºážááá¯ááºážááœááºá á€áá¯á¶áá»á¬ážááᯠáá±á¬áºáá®áááºáá»á¬áž áááºáá®ážááẠááá¯á¡ááºááŒá®áž á¡ááá¯áá¯á¶áá»á¬ážá¡ááœáẠáá±á¬áºáááºáá»á¬ážá
áœá¬áááºáž ááŸááááºáááºá
áááºááŸáá¡ááá®áá±ážááŸááºážáá
áºáá¯ááá¯á· á¡ááá¯ááºážá¡áá¬á¡áá
áºáá»á¬ážááá·áºááŒááºážáááºáááºáž áá±á«ááºážááá¯ááºááŒááºážááᯠááŒá
áºá
á±áááºá ááá¯á·ááŒá±á¬áá·áº áá¬áááº
áá¯ááºáááºáž
ááá¯á¡ááºáá»ááºáá»á¬ážá á¬áááºážááᯠáá±á¬áºááŒááŒáá«á áá¯á·á
- á¡ááá®áá±ážááŸááºážááááºááŸááá±áá»áááºá¡ááœááºáž á¡ááá¯áá±á¬ááºážáá¯ááºáá±á¬ááºááá¯ááºá áœááºážááᯠá¡ááá®áá±ážááŸááºážááá¯á·ááá±á¬áºááŒáá² áá»á¶áááºážáá±ááá·áº áááºááá·áºáá¯á¶á á¶á áá±á¬ááºáááºáá¯á¶áá»á¬ážááᯠáááºáá®ážáá«á
- áá±á¬ááºážááá¯ááŸá¯ááá¯ááºážá¡ááœáẠá¡ááá¯áá¯á¶áá»á¬ážááᯠáá¯ááºáá¯ááºáááºáááá¯á¡ááºáá«á
- áááºááŸááºááá¬ážáá±á¬ áá±á¬áºáááºáá»á¬ážá áá±á¬ááºáááºáá¯á¶áá»á¬áž áá¯ááºáá±ážááá¯ááºá áœááºážááᯠááááºáá«á
áááá¡áá»ááºááŸáá·áº á¡áááºážááẠááá·áºáá»ááºáá±áá±á¬ááŒá±á¬áá·áº áá±á¬ááºáá¯á¶ážá¡áá»ááºááᯠááŸááºážááŒáá«áááºá á¡áááºá áá»áœááºá¯ááºááá¯á·ááẠáááºááá·áºáá¯ááºáá¯á¶áá»á¬ážá áá»áá¯ážáááºááá¯áá»áŸ ááœáá·áºááá¯áá«áá áá¯ááºáá¯á¶á¡á¬áž á¡ááá·áºá¡áááºáááŸá áá±á¬áºáááºá¡ááŒá ẠááŒá±á¬ááºážáá²ááẠáá±á¬ááºážááá¯áá»ááºá¡áá»á¬ážá¡ááŒá¬ážááᯠáááºáá®ážááŒááºážááŒáá·áº ááá¯ááºááᯠááá¯ááºááá¯ááºááẠááŒá áºááá¯ááºááŒá±ááŸááá±á¬ááŒá±á¬áá·áº á€á¡á¬ážáááºážáá»ááºááᯠááááºááẠááá¯á¡ááºáá«áááºá
nginx áááºáááºááŸá¯áá¯á¶á á¶
á¡áááºáá«ááá¯á¡ááºáá»ááºáá»á¬ážááá¯ááŒá±ááŸááºážáááºá¡ááœááºáá»áœááºá¯ááºááá¯á·áááºá¡á±á¬ááºáá« nginx modules áá»á¬ážááá¯á¡ááºáá«áááºá
ngx_http_image_filter_module - áá¯á¶áá»á¬ážááá¯á¡ááœááºá¡á á¬ážááŒá±á¬ááºážáá²áááºá¡ááœááº;ngx_http_proxy_module - ááááºážáááºážááŒááºážá¡ááœááº;ngx_http_secure_link_module - spam áá»á¬ážááá¯áá¬ááœááºáááºá
module ááœá± 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 ááœá²á·á ááºážááŸá¯
áá»áœááºá¯ááºááá¯á·á host configuration ááœáẠá¡áá áºáá áºáᯠáááºááá·áºáá«áááºá áááºáá±áᬠááŸáá·áº áá±áá°áá» cache áá±á¬ááºáá»á¬áž
...
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;
}
...
}
...
áá»áœááºá¯ááºááá¯á·ááẠconfig ááœáẠhost á¡áá áºáá áºáá¯ááá¯áááºáž ááá·áºáááº-
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 [md5]/[path_to_image]myproject.ru/preview/c [md5]/[size]/[path_to_image]myproject.ru/preview/r [md5]/[size]/[path_to_image]
* try_files â spaces ááŸáá·áº áá¯ááŸá¬ážá á¬áá¯á¶ážáá»á¬ážááᯠá¡á¬áá¯á¶áá¶á á¬ážááá¯ááºáá±á¬ááŒá±á¬áá·áº áá»áœááºá¯ááºááẠáá»áá¯ááºážáá±á¬ááºáá áºáᯠááŒá¯áá¯ááºááááºááŒá áºáá«áááºá á¡áááºááŸááº.
áááºá¡ááºááá®áá±ážááŸááºážááœáẠá¡áá¯á¶ážááŒá¯áá«á
áááºá¡ááá®áá±ážááŸááºážá¡ááá·áºááœááºá áááºááẠá¡á±á¬ááºáá«áá¯ááºáá¯á¶ážáá¯ááºáááºáž (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'
);
á¡ááœááºá¡á á¬ážááœá±ááᯠááœááºáá»ááºááá¯á·áááºáž á¡ááŒá¶ááŒá¯áá»ááºáá«áááºá preview ááá¯.
Rake
áá°áááºážáá¯á¶ááᯠáá»ááºááá¯ááºáá±á¬á¡áá«á á¡ááŒáá¯ááŒáá·áºááŸá¯ááŸá¯áá»á¬ážááẠááá¬áá¡ááá¯ááºážá áááºááŸáºááᯠááá¬ážáááºáááŒá áºá¡á±á¬áẠáá»ááºáááºááá¯ááºáá²á áá»áœááºá¯ááºááá¯á·á á¡ááŒá±á¡áá±ááœááºá áá»ááºááŒá®ážáá±á¬áẠáá áºáááºá¡ááœááºáž á¡á ááºážááŒáá·áºááŸá¯ááŸá¯áá»á¬áž áááºááŸáááá¯ááºáááºá ááá¯á·áá±á¬áº á€áááºááŸá¬ á¡áá»á¬ážáá¯á¶ážá¡áá»áááºááŒá áºáááºá
source: www.habr.com