воскресенье, 30 ноября 2014 г.

Image resize

Задача: переложить изменение размеров картинок на nginx с кешированием. Для доступа к картинке необходимо в URL передавать подпись. Это защищает сервер от ddos атак.

http {
        ...
        # Задаёт путь и другие параметры кэша
        proxy_cache_path /opt/www/images/cache levels=1:2 keys_zone=image-preview:10m;

        server {
                ...
                location /images {
                        proxy_pass http://unix:/run/image.sock:$uri;
                        proxy_intercept_errors on;

                        proxy_cache image-preview;
                        proxy_cache_key "$host$document_uri";
                        proxy_cache_valid 200 1d;
                        proxy_cache_valid any 1m;

                        expires max;
                }
        }
        server {
                listen unix:/run/image.sock;
                secure_link_secret secret;
                location ~ ^/images/[^/]+/crop/(\d+|-)/(\d+|-)/(.+) {
                        set $width $1;
                        set $height $2;
                        alias /opt/www/images/storage/$3;
                        try_files "" =404;
                        if ($secure_link = "") { return 404; }
                        image_filter crop $width $height;
                }
   
                location ~ ^/images/[^/]+/resize/(\d+|-)/(\d+|-)/(.+) {
                        set $width $1;
                        set $height $2;
                        alias /opt/www/images/storage/$3;
                        try_files "" =404;
                        if ($secure_link = "") { return 404; }
                        image_filter resize $width $height;
                }

                location ~ ^/images/[^/]+/(.+) {
                        alias /opt/www/images/storage/$1;
                        try_files "" =404;
                        if ($secure_link = "") { return 404; }
                }
        }
}
Простая функция для формирования URL для доступа к картинке.
function image_url($params)
{
    if (isset($params['filter'])) {
        $path = $params['filter'] . '/' . (isset($params['width']) ? $params['width'] : '-') . '/' . (isset($params['height']) ? $params['height'] : '-') . '/' . $params['source'];
    } else {
        $path = $params['source'];
    }
    $md5 = md5($path . 'secret');
    return "http://127.0.0.1/images/{$md5}/{$path}";
}

echo image_url(['source' => '1.png', 'filter' => 'resize', 'width' => 100, 'height' => 200]) . PHP_EOL;

Комментариев нет:

Отправить комментарий