เดเดฎเตเดเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจ เดเดคเตเดฐเต เดตเตเดฌเต เดเดชเตเดฒเดฟเดเตเดเตเดทเดจเดฟเดฒเตเด, เด เดเดฟเดคเตเดฐเดเตเดเดณเตเดเต เดเตเดฑเดฟเดฏ เดชเดเตผเดชเตเดชเตเดเตพ เดธเตเดทเตเดเดฟเดเตเดเตเดฃเตเดเดคเตเดฃเตเดเต, เดเตเดเดพเดคเต เด
เดงเดฟเด เดเดฎเตเดเตเดเตพเดเตเดเดพเดฏเดฟ เดชเดฒเดชเตเดชเตเดดเตเด เดจเดฟเดฐเดตเดงเดฟ เดซเตเตผเดฎเดพเดฑเตเดฑเตเดเตพ เดเดฃเตเดเต.
เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ เดเดชเตเดฒเดฟเดเตเดเตเดทเดจเดฟเตฝ เดชเตเดคเดฟเดฏ เดฎเดพเดจเดเตเดเตพ เดเตเตผเดเตเดเตเดจเตเดจเดคเตเด เดเดฟเดฒ เดคเดฒเดตเตเดฆเดจเดเตพเดเตเดเต เดเดพเดฐเดฃเดฎเดพเดเตเดจเตเดจเต. เด
เดคเดฟเดจเดพเตฝ เดเตเดฎเดคเดฒ:
เดฒเดเตเดทเตเดฏเด
เดเดตเดถเตเดฏเดเดคเดเดณเตเดเต เดชเดเตเดเดฟเด เดธเตเดเดฟเดชเตเดชเดฟเดเตเดเดพเด:
- เดเดชเตเดฒเดฟเดเตเดเตเดทเตปเตเดฑเต เด เดธเตเดคเดฟเดคเตเดตเดคเตเดคเดฟเตฝ เดเดชเตเดชเตเตพ เดตเตเดฃเดฎเตเดเตเดเดฟเดฒเตเด เดเดชเตเดฒเดฟเดเตเดเตเดทเดจเดฟเตฝ เด เดงเดฟเด เดชเตเดฐเดตเตผเดคเตเดคเดจเด เด เดตเดคเดฐเดฟเดชเตเดชเดฟเดเตเดเดพเดคเต เดคเดจเตเดจเต เดเดคเตเดเตเดเดฟเดฒเตเด เดซเตเตผเดฎเดพเดฑเตเดฑเดฟเตปเตเดฑเต เด เดงเดฟเด เดเดฟเดคเตเดฐเดเตเดเตพ เดธเตเดทเตเดเดฟเดเตเดเตเด;
- เดเดฐเต เด เดญเตเดฏเตผเดคเตเดฅเดจเดฏเดฟเดฒเตเด เดเตเดเตเดคเตฝ เดเดฟเดคเตเดฐเดเตเดเตพ เดธเตเดทเตเดเดฟเดเตเดเตเดฃเตเดเดคเดฟเดฒเตเดฒ;
- เดตเตเดฏเดเตเดคเดฎเดพเดเตเดเดพเดคเตเดค เดซเตเตผเดฎเดพเดฑเตเดฑเตเดเดณเตเดเต เด เดงเดฟเด เดเดฟเดคเตเดฐเดเตเดเตพ เดธเตเดทเตเดเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดดเดฟเดตเต เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเดเตเดเตเด.
เด เดตเดธเดพเดจ เดชเตเดฏเดฟเตปเตเดฑเต เดเดพเตป เดตเดฟเดถเดฆเตเดเดฐเดฟเดเตเดเตเด, เดเดพเดฐเดฃเด เดเดคเต เดเดฆเตเดฏ เดชเตเดฏเดฟเตปเตเดฑเตเดฎเดพเดฏเดฟ เดเตเดฑเตเดคเดพเดฏเดฟ เดตเดฟเดฐเตเดฆเตเดงเดฎเดพเดฃเต. เดเดเตเดเตพ เดเดคเตเดเตเดเดฟเดฒเตเด เดเดฟเดคเตเดฐเดเตเดเดณเตเดเต เดเดจเดฑเตเดทเตป เดเดชเตเดชเตบ เดเดเตเดเตเดเดฏเดพเดฃเตเดเตเดเดฟเตฝ, เด เดจเดจเตเดคเดฎเดพเดฏ เดซเตเตผเดฎเดพเดฑเตเดฑเตเดเดณเดฟเดฒเตเดเตเดเต เดเดฟเดคเตเดฐเดคเตเดคเดฟเตปเตเดฑเต เดตเดฒเตเดชเตเดชเด เดฎเดพเดฑเตเดฑเดพเตป เดงเดพเดฐเดพเดณเด เด เดญเตเดฏเตผเดคเตเดฅเดจเดเตพ เดธเตเดทเตเดเดฟเดเตเดเต เดธเตเดฑเตเดฑเดฟเตฝ เดเดเตเดฐเดฎเดฃเดคเตเดคเดฟเดจเต เดธเดพเดงเตเดฏเดคเดฏเตเดฃเตเดเต, เด เดคเดฟเดจเดพเตฝ เด เด เดชเดเดเดธเดพเดงเตเดฏเดค เด เดตเดธเดพเดจเดฟเดชเตเดชเดฟเดเตเดเตเดฃเตเดเดคเตเดฃเตเดเต.
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;
}
...
}
...
เดเตเตบเดซเดฟเดเดฑเตเดทเดจเดฟเดฒเตเดเตเดเต เดเดเตเดเตพ เดเดฐเต เดชเตเดคเดฟเดฏ เดนเตเดธเตเดฑเตเดฑเตเด เดเตเตผเดเตเดเตเดจเตเดจเต:
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