αα
αααα»ααααααα·ααΈααα αααααααααΎαααααΆααα’αααααααααΎααΌαααΆα α
αΆαααΆα
αααααΌααααααΎαα
αααΆααα
ααααααΌα
αααααΌαααΆαααΆααααα α αΎαααΆααΏααααΆαααααααααΆα
αααΎααααααΆααααΌαααΆαααααααα
ααΆααααααααα·ααΆαααααααΈαα
αααααα·ααΈαααααΆαααααΆαααααααααΆαα±ααααΊααααΆααααααααα ααΌα
ααααααΆααα·α
αα
α
ααααααα
α αΌααααααΆαααααααΈαααααααΌαααΆαα
- αααααΎαααΌαααΆαααααααααααααααααΆαα½αααααΆααααααα·ααααα αΆααα»αααΆααααααααα αααα»ααααααα·ααΈαααααααα ααα‘α»αααααααααα·ααΈααΆαα
- ααΌαααΆααααααααα·αα αΆαααΆα αααααΌαααΆααααααΎααα ααΎααΆααααΆαααααΎαα»αααα
- αα·ααααααααΆααααα»αααΆααααααΎαααΌαααΆαααααααααααααααααααα·αααΆααααααΆααα
αααα»αβααΉαβααααααβα ααα»α βα α»αβααααα αααααβααΆβαααα»αβααΉαβα ααα»α βααααΌαβααααα·α α ααααα·αααΎααΎααααααΎαααΌαααΆαααΆαα½αααΎαα αα αααααΆαααααααΆαααααΆαααΆααααα αΆααα ααΎααα αααααααααααααΎαααααΎαα½αα ααα½αααααΎααααΈααααΌαααα αααΌαααΆααα ααΆααααααααααΆαααααα ααΌα ααααααΆαααΆαααααααααααα αΆαααΆα αααααΌααα·αα
ααΆαααααααα ααΆααααααααααΆαααα‘αΎα 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 αα·αβααααΌαβααΆαβααα‘αΎαβααΆαβααααΆαααΎαβαα ααΌα ααααβαα½αααβααααΌαβααβαααααΆααβαα βααααΆααααΆαβαααααβαα ααΆααααααααβααα‘αΎα 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;
}
...
}
...
ααΎααααααααααααΆαααΈαααααΈαα configα
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 β ααΆαααΉαααααααΆ αα·ααα½α’αααααα»αααααΈ ααΌα αααααααα»αααααΌαααααΎααΎα ααααααΆαα½α αααααα α αααα .
ααααΎαααα»ααααααα·ααΈααα ααααα
αα ααααα·ααααααα·ααΈααα ααααα α’αααα’αΆα ααααΎααΈαα·αα·ααΈααΌα ααΆαααααα (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'
);
αααααΈααΆαααα»αααααΌααααααα’αα»ααΆαααα±ααααααΆααα α ααΎαααΆαα»α.
αα»α
αα ααααα»αααΌαααΆαααΎα ααΆαααΎαααΆαα»αααΉααα·αααααΌαααΆααα»αα ααααΈααααΆαααααααΆααα‘αΎα αα αΌαααΆααααααααΆαααααααΆαααα·αααααΎαααΆα α αΎααααα»αααααΈααααααΎα ααΆαααΎαααΆαα»αα’αΆα ααΆααααααΆαααα½ααααααααααΆααααΈααΆααα»α ααα»αααααααααΊααΆαααααααΆα’αα·ααααΆα
ααααα: www.habr.com