Π£ ΡΠΊΠΎΡΠΎ ΡΠ²Π°ΠΊΠΎΡ Π²Π΅Π± Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠΈ ΠΊΠΎΡΠ° ΠΊΠΎΡΠΈΡΡΠΈ ΡΠ»ΠΈΠΊΠ΅ ΠΏΠΎΡΡΠΎΡΠΈ ΠΏΠΎΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΠΊΡΠ΅ΠΈΡΠ°ΡΡ ΠΌΠ°Π»Π΅ ΠΊΠΎΠΏΠΈΡΠ΅ ΠΎΠ²ΠΈΡ
ΡΠ»ΠΈΠΊΠ°, Π° ΡΠ΅ΡΡΠΎ ΠΏΠΎΡΡΠΎΡΠΈ Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ ΡΠΎΡΠΌΠ°ΡΠ° Π·Π° Π΄ΠΎΠ΄Π°ΡΠ½Π΅ ΡΠ»ΠΈΠΊΠ΅.
ΠΠΎΠ΄Π°Π²Π°ΡΠ΅ Π½ΠΎΠ²ΠΈΡ
Π΄ΠΈΠΌΠ΅Π½Π·ΠΈΡΠ° ΠΏΠΎΡΡΠΎΡΠ΅ΡΠΎΡ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠΈ ΡΠ°ΠΊΠΎΡΠ΅ ΠΈΠ·Π°Π·ΠΈΠ²Π° Π½Π΅ΠΊΠ΅ Π³Π»Π°Π²ΠΎΠ±ΠΎΡΠ΅. ΠΡΡΠ΄Π° Π·Π°Π΄Π°ΡΠ°ΠΊ:
ΠΠ°Π΄Π°ΡΠ°ΠΊ
ΠΠ·Π½Π°ΡΠΈΠΌΠΎ Π»ΠΈΡΡΡ Π·Π°Ρ ΡΠ΅Π²Π°:
- ΠΠ΅Π½Π΅ΡΠΈΡΠΈΡΠ΅ Π΄ΠΎΠ΄Π°ΡΠ½Π΅ ΡΠ»ΠΈΠΊΠ΅ Π±ΠΈΠ»ΠΎ ΠΊΠΎΠ³ ΡΠΎΡΠΌΠ°ΡΠ° Ρ Ρ ΠΎΠ΄Ρ Π±Π΅Π· ΡΠ²ΠΎΡΠ΅ΡΠ° Π΄ΠΎΠ΄Π°ΡΠ½Π΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡΠΈ Ρ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡ Ρ Π±ΠΈΠ»ΠΎ ΠΊΠΎΠΌ ΡΡΠ΅Π½ΡΡΠΊΡ ΡΠΎΠΊΠΎΠΌ ΠΏΠΎΡΡΠΎΡΠ°ΡΠ° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ΅;
- ΠΠΎΠ΄Π°ΡΠ½Π΅ ΡΠ»ΠΈΠΊΠ΅ Π½Π΅ ΠΌΠΎΡΠ°ΡΡ Π΄Π° ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΡ Π½Π° ΡΠ²Π°ΠΊΠΈ Π·Π°Ρ ΡΠ΅Π²;
- ΠΠ½Π΅ΠΌΠΎΠ³ΡΡΠΈΡΠ΅ ΠΌΠΎΠ³ΡΡΠ½ΠΎΡΡ Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ° Π΄ΠΎΠ΄Π°ΡΠ½ΠΈΡ ΡΠ»ΠΈΠΊΠ° Π½Π΅ΠΎΠ΄ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠΎΡΠΌΠ°ΡΠ°.
ΠΠ±ΡΠ°ΡΠ½ΠΈΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΡΡ ΡΠ°ΡΠΊΡ, ΡΠ΅Ρ ΡΠ΅ ΠΌΠ°Π»ΠΎ Ρ ΡΡΠΏΡΠΎΡΠ½ΠΎΡΡΠΈ ΡΠ° ΠΏΡΠ²ΠΎΠΌ ΡΠ°ΡΠΊΠΎΠΌ. ΠΠΊΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ Π±ΠΈΠ»ΠΎ ΠΊΠΎΡΠ΅ ΡΠ»ΠΈΠΊΠ΅ ΡΡΠΈΠ½ΠΈΠΌΠΎ ΠΎΡΠ²ΠΎΡΠ΅Π½ΠΈΠΌ, ΠΎΠ½Π΄Π° ΠΏΠΎΡΡΠΎΡΠΈ ΠΌΠΎΠ³ΡΡΠ½ΠΎΡΡ Π½Π°ΠΏΠ°Π΄Π° Π½Π° ΡΠ°ΡΡ Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ΠΌ Π²Π΅Π»ΠΈΠΊΠΎΠ³ Π±ΡΠΎΡΠ° Π·Π°Ρ ΡΠ΅Π²Π° Π·Π° ΠΏΡΠΎΠΌΠ΅Π½Ρ Π²Π΅Π»ΠΈΡΠΈΠ½Π΅ ΡΠ»ΠΈΠΊΠ΅ Ρ Π±Π΅ΡΠΊΠΎΠ½Π°ΡΠ°Π½ Π±ΡΠΎΡ ΡΠΎΡΠΌΠ°ΡΠ°, ΡΠ°ΠΊΠΎ Π΄Π° ΠΎΠ²Ρ ΡΠ°ΡΠΈΠ²ΠΎΡΡ ΡΡΠ΅Π±Π° Π·Π°ΡΠ²ΠΎΡΠΈΡΠΈ.
Π½Π³ΠΈΠ½ΠΊ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡΠ΅
ΠΠ° Π±ΠΈΡΠΌΠΎ ΡΠ΅ΡΠΈΠ»ΠΈ Π³ΠΎΡΠ΅ Π½Π°Π²Π΅Π΄Π΅Π½Π΅ Π·Π°Ρ ΡΠ΅Π²Π΅, ΠΏΠΎΡΡΠ΅Π±Π°Π½ Π½Π°ΠΌ ΡΠ΅ ΡΠ»Π΅Π΄Π΅ΡΠΈ ΡΠΊΡΠΏ Π½Π³ΠΈΠ½ΠΊ ΠΌΠΎΠ΄ΡΠ»Π°:
Π½Π³ΠΊ_Ρ ΡΡΠΏ_ΠΈΠΌΠ°Π³Π΅_ΡΠΈΠ»ΡΠ΅Ρ_ΠΌΠΎΠ΄ΡΠ»Π΅ β Π·Π° ΠΏΡΠΎΠΌΠ΅Π½Ρ Π²Π΅Π»ΠΈΡΠΈΠ½Π΅ ΡΠ»ΠΈΠΊΠ°;Π½Π³ΠΊ_Ρ ΡΡΠΏ_ΠΏΡΠΎΠΊΠΈ_ΠΌΠΎΠ΄ΡΠ»Π΅ - Π·Π° ΠΊΠ΅ΡΠΈΡΠ°ΡΠ΅;Π½Π³ΠΊ_Ρ ΡΡΠΏ_ΡΠ΅ΡΡΡΠ΅_Π»ΠΈΠ½ΠΊ_ΠΌΠΎΠ΄ΡΠ»Π΅ β Π·Π° Π·Π°ΡΡΠΈΡΡ ΠΎΠ΄ Π½Π΅ΠΆΠ΅ΡΠ΅Π½Π΅ ΠΏΠΎΡΡΠ΅;
ΠΠΎΠ΄ΡΠ»ΠΈ Π½Π³ΠΊ_Ρ ΡΡΠΏ_ΠΈΠΌΠ°Π³Π΅_ΡΠΈΠ»ΡΠ΅Ρ_ΠΌΠΎΠ΄ΡΠ»Π΅ ΠΈ Π½Π³ΠΊ_Ρ ΡΡΠΏ_ΡΠ΅ΡΡΡΠ΅_Π»ΠΈΠ½ΠΊ_ΠΌΠΎΠ΄ΡΠ»Π΅ Π½ΠΈΡΡ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π½ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ, ΡΠ°ΠΊΠΎ Π΄Π° ΠΌΠΎΡΠ°ΡΡ Π±ΠΈΡΠΈ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠΈΡΠ°Π½ΠΈ Ρ ΡΠ°Π·ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ΅ ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡΠ΅ ΠΠΏΠ°ΡΡ Π΅:
phoinix@phoinix-work:~/src/nginx-0.8.29
$ ./configure --with-http_secure_link_module --with-http_image_filter_module
Π½Π³ΠΈΠ½ΠΊ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°
ΠΠΎΠ΄Π°ΠΌΠΎ Π½ΠΎΠ²ΠΈ Ρ Π½Π°ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡ Ρ ΠΎΡΡΠ° Π»ΠΎΠΊΠ°ΡΠΈΡΠ° ΠΈ ΠΎΠΏΡΡΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΊΠ΅ΡΠ°:
...
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; }
}
ΠΠ°ΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ ΡΠΎΠ³Π°, Π΄ΠΎΠ΄Π°ΡΠ½Π΅ ΡΠ»ΠΈΠΊΠ΅ ΡΠ΅ ΠΌΠΎΠ³Ρ Π΄ΠΎΠ±ΠΈΡΠΈ ΠΏΠΎΠΌΠΎΡΡ ΡΠ»Π΅Π΄Π΅ΡΠΈΡ Π²Π΅Π·Π°:
ΠΌΠΈΠΏΡΠΎΡΠ΅ΡΡ.ΡΡ/ΠΏΡΠ΅Π²ΠΈΠ΅Π²/ΠΈ [ΠΌΠ΄5]/[ΠΏΡΡΠ°ΡΠ°_Π΄ΠΎ_ΡΠ»ΠΈΠΊΠ΅]ΠΌΠΈΠΏΡΠΎΡΠ΅ΡΡ.ΡΡ/ΠΏΡΠ΅Π²ΠΈΠ΅Π²/Ρ [ΠΌΠ΄5]/[Π²Π΅Π»ΠΈΡΠΈΠ½Π°]/[ΠΏΡΡΠ°ΡΠ°_Π΄ΠΎ_ΡΠ»ΠΈΠΊΠ΅]ΠΌΠΈΠΏΡΠΎΡΠ΅ΡΡ.ΡΡ/ΠΏΡΠ΅Π²ΠΈΠ΅Π²/Ρ [ΠΌΠ΄5]/[Π²Π΅Π»ΠΈΡΠΈΠ½Π°]/[ΠΏΡΡΠ°ΡΠ°_Π΄ΠΎ_ΡΠ»ΠΈΠΊΠ΅]
* ΡΡΠΈ_ΡΠΈΠ»Π΅Ρ β ΠΎΡΠ΅ΡΡΠΈΠ² Π½Π° ΡΠ°Π·ΠΌΠ°ΠΊΠ΅ ΠΈ ΡΡΡΠΊΠ΅ Π·Π½Π°ΠΊΠΎΠ²Π΅, ΠΏΠ° ΡΠ°ΠΌ ΠΌΠΎΡΠ°ΠΎ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΡΡΠ°ΠΊΡ Π·Π²Π°Π½ΠΈ.
ΠΠΎΡΠΈΡΡΠΈΡΠ΅ Ρ Π²Π΅Π± Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠΈ
ΠΠ° Π½ΠΈΠ²ΠΎΡ Π²Π΅Π± Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ΅, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ°Π΄ΠΈΡΠ΅ ΡΠ»Π΅Π΄Π΅ΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ (ΠΠ΅ΡΠ»):
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'
);
ΠΠ°ΠΊΠΎ Π±ΠΈΡ ΡΠ°ΠΊΠΎΡΠ΅ ΠΏΡΠ΅ΠΏΠΎΡΡΡΠΈΠΎ ΠΈΠ·ΡΠ°ΡΡΠ½Π°Π²Π°ΡΠ΅ Π²Π΅Π»ΠΈΡΠΈΠ½Π° ΠΡΠ΅Π³Π»Π΅Π΄.
Π Π°ΠΊΠ΅
ΠΡΠΈΠ»ΠΈΠΊΠΎΠΌ Π±ΡΠΈΡΠ°ΡΠ° ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½Π΅ ΡΠ»ΠΈΠΊΠ΅, ΠΏΡΠ΅Π³Π»Π΅Π΄ΠΈ, Π½Π°ΡΠ°Π²Π½ΠΎ, Π½Π΅ΡΠ΅ Π±ΠΈΡΠΈ ΠΎΠ±ΡΠΈΡΠ°Π½ΠΈ ΠΈΠ· ΠΊΠ΅ΡΠ° Π΄ΠΎΠΊ ΡΠ΅ ΠΊΠ΅Ρ Π½Π΅ ΠΏΠΎΠ½ΠΈΡΡΠΈ, Π°Ρ Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°ΡΡ ΠΏΡΠ΅Π³Π»Π΅Π΄ΠΈ ΠΌΠΎΠ³Ρ ΠΏΠΎΡΡΠΎΡΠ°ΡΠΈ Π΄Π°Π½ Π½Π°ΠΊΠΎΠ½ Π±ΡΠΈΡΠ°ΡΠ°, Π°Π»ΠΈ ΠΎΠ²ΠΎ ΡΠ΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅.
ΠΠ·Π²ΠΎΡ: Π²Π²Π².Ρ
Π°Π±Ρ.ΡΠΎΠΌ