āĻāĻŽā§āĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻāĻŽāĻ¨ āĻĒā§āĻ°āĻžāĻ¯āĻŧ āĻ¯ā§āĻā§āĻ¨ā§ āĻāĻ¯āĻŧā§āĻŦ āĻ
ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ā§, āĻāĻ āĻāĻŽā§āĻāĻā§āĻ˛āĻŋāĻ° āĻā§āĻ āĻāĻĒāĻŋ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§, āĻāĻŦāĻ āĻĒā§āĻ°āĻžāĻ¯āĻŧāĻļāĻ āĻ
āĻ¤āĻŋāĻ°āĻŋāĻā§āĻ¤ āĻāĻŽā§āĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻŦā§āĻļ āĻāĻŋāĻā§ āĻĢāĻ°āĻŽā§āĻ¯āĻžāĻ āĻĨāĻžāĻā§āĨ¤
āĻāĻāĻāĻŋ āĻŦāĻŋāĻĻā§āĻ¯āĻŽāĻžāĻ¨ āĻ
ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ā§ āĻ¨āĻ¤ā§āĻ¨ āĻŽāĻžāĻ¤ā§āĻ°āĻž āĻ¯ā§āĻ āĻāĻ°āĻžāĻ° āĻĢāĻ˛ā§ āĻāĻŋāĻā§ āĻŽāĻžāĻĨāĻžāĻŦā§āĻ¯āĻĨāĻžāĻ āĻšāĻ¯āĻŧāĨ¤ āĻ¤āĻžāĻ āĻāĻžāĻ:
āĻāĻžāĻā§āĻ°
āĻāĻ¸ā§āĻ¨ āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ā§āĻ¯āĻŧāĻ¤āĻžāĻ° āĻ¤āĻžāĻ˛āĻŋāĻāĻž āĻŦā§āĻāĻžāĻ:
- āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻžāĻ¨ā§āĻ° āĻ āĻ¸ā§āĻ¤āĻŋāĻ¤ā§āĻŦā§āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ¯ā§ āĻā§āĻ¨āĻ āĻ¸āĻŽāĻ¯āĻŧā§ āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨āĻāĻŋāĻ¤ā§ āĻ āĻ¤āĻŋāĻ°āĻŋāĻā§āĻ¤ āĻāĻžāĻ°ā§āĻ¯āĻāĻžāĻ°āĻŋāĻ¤āĻž āĻĒā§āĻ°āĻŦāĻ°ā§āĻ¤āĻ¨ āĻ¨āĻž āĻāĻ°ā§ āĻāĻĄāĻŧāĻ¤ā§ āĻĨāĻžāĻāĻž āĻ¯ā§āĻā§āĻ¨ā§ āĻŦāĻŋāĻ¨ā§āĻ¯āĻžāĻ¸ā§āĻ° āĻ āĻ¤āĻŋāĻ°āĻŋāĻā§āĻ¤ āĻāĻŋāĻ¤ā§āĻ° āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§āĻ¨;
- āĻĒā§āĻ°āĻ¤āĻŋāĻāĻŋ āĻ āĻ¨ā§āĻ°ā§āĻ§ā§ āĻ āĻ¤āĻŋāĻ°āĻŋāĻā§āĻ¤ āĻāĻŦāĻŋ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻžāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻ¨ā§āĻ;
- āĻ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻĢāĻ°āĻŽā§āĻ¯āĻžāĻā§āĻ° āĻ āĻ¤āĻŋāĻ°āĻŋāĻā§āĻ¤ āĻāĻŦāĻŋ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻžāĻ° āĻā§āĻˇāĻŽāĻ¤āĻž āĻ āĻā§āĻˇāĻŽ āĻāĻ°ā§āĻ¨āĨ¤
āĻāĻŽāĻŋ āĻļā§āĻˇ āĻĒāĻ¯āĻŧā§āĻ¨ā§āĻāĻāĻŋ āĻŦā§āĻ¯āĻžāĻā§āĻ¯āĻž āĻāĻ°āĻŦ, āĻāĻžāĻ°āĻŖ āĻāĻāĻŋ āĻĒā§āĻ°āĻĨāĻŽ āĻĒāĻ¯āĻŧā§āĻ¨ā§āĻā§āĻ° āĻ¸āĻžāĻĨā§ āĻ¸āĻžāĻŽāĻžāĻ¨ā§āĻ¯ āĻŦāĻŋāĻ°ā§āĻ§āĻŋāĻ¤āĻž āĻāĻ°ā§āĨ¤ āĻāĻŽāĻ°āĻž āĻ¯āĻĻāĻŋ āĻā§āĻ¨ā§ āĻāĻŦāĻŋāĻ° āĻā§āĻ¨āĻžāĻ°ā§āĻļāĻ¨āĻā§ āĻāĻĒā§āĻ¨ āĻāĻ°ā§ āĻĻā§āĻ, āĻ¤āĻžāĻšāĻ˛ā§ āĻĒā§āĻ°āĻā§āĻ° āĻ¸āĻāĻā§āĻ¯āĻ āĻ āĻ¨ā§āĻ°ā§āĻ§ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§ āĻāĻŽā§āĻāĻāĻŋāĻā§ āĻ āĻ¸ā§āĻŽ āĻ¸āĻāĻā§āĻ¯āĻ āĻĢāĻ°āĻŽā§āĻ¯āĻžāĻā§ āĻ°āĻŋāĻ¸āĻžāĻāĻ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻ¸āĻžāĻāĻā§ āĻāĻā§āĻ°āĻŽāĻŖā§āĻ° āĻ¸āĻŽā§āĻāĻžāĻŦāĻ¨āĻž āĻĨāĻžāĻā§, āĻ¤āĻžāĻ āĻāĻ āĻĻā§āĻ°ā§āĻŦāĻ˛āĻ¤āĻž āĻŦāĻ¨ā§āĻ§ āĻāĻ°āĻž āĻĻāĻ°āĻāĻžāĻ°āĨ¤
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]/[āĻĒāĻĨ_āĻā§_āĻāĻŋāĻ¤ā§āĻ°]myproject.ru/preview/c [md5]/[āĻāĻāĻžāĻ°]/[āĻĒāĻĨ_āĻā§_āĻāĻŋāĻ¤ā§āĻ°]myproject.ru/preview/r [md5]/[āĻāĻāĻžāĻ°]/[āĻĒāĻĨ_āĻā§_āĻāĻŋāĻ¤ā§āĻ°]
* 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