scarstens
3/9/2014 - 4:59 PM

Nginx Image Filter Resize Proxy Service

Nginx Image Filter Resize Proxy Service

# Feel free to change this path of course (and keys_zone value as well, but also change the usage of it below).
proxy_cache_path /var/www/cache/resized levels=1:2 keys_zone=resizedimages:10m max_size=1G;

# Gzip was on in another conf file of mine...You may need to uncomment the next line.
#gzip on;
gzip_disable msie6;
gzip_static on;
gzip_comp_level 4;
gzip_proxied any;
# Again, be careful that you aren't overwriting some other setting from another config's http {} section.
gzip_types image/jpeg image/jpg image/png image/gif;

server {
  # Replace with your sub/domain.
  server_name     image.yoursite.com;
  root            /var/www/cache/store/img;
  index           index.html;
 
  resolver 8.8.8.8 8.8.4.4;
 
  # This requests the original file from itself and then resizes the image.
  location ~ ^/resize/(\d+)x(\d+)/(.*) {
    
    # Again replace with your sub/domain.
    proxy_pass                  http://image.yoursite.com/$3;

    proxy_cache resizedimages;
    proxy_cache_key "$host$document_uri";
    proxy_cache_valid 200 1d;
    proxy_cache_valid any 1m;
    proxy_cache_use_stale error timeout invalid_header updating;

    image_filter                resize $1 $2;
    image_filter_jpeg_quality   90;
    image_filter_buffer         20M;
    image_filter_interlace      on;
  }
 
  # Access denied.
  location /resize {
    return 403;
  }
 
  # RESIZED:  http://image.yoursite.com/200x200/example.jpg
  location ~ /(\d+x\d+/.*) {
    try_files                     /$1 @img;
  }
 
  # ORIGINAL: http://image.yoursite.com/example.jpg
  location / {
    # If we don't find the file locally download it.
    error_page                    404 = @proxy;
  }
 
  # This saves the resized image locally.
  location @img {
    set $remote_uri $uri;
    set $protocol "http";
    if ($uri ~ "^/https?\:\/(.*)") {
        set $remote_uri $1;
    }
    if ($uri ~ "^/https.*") {
      set $protocol "https";
    }
    set $full_uri "${protocol}://${remote_uri}";
    
    proxy_pass $full_uri;
    proxy_store /var/www/cache/store/img/$full_uri;
  }
 
  # This gets the remote image and saves it locally.
  location @proxy {
 
    set $remote_uri $uri;
    set $protocol "http";
    if ($uri ~ "^/https?\:\/(.*)") {
        set $remote_uri $1;
    }
    if ($uri ~ "^/https.*") {
      set $protocol "https";
    }
    set $full_uri "${protocol}://${remote_uri}";

    # i thought with merge_slashes off this would work... =(
    #if ($uri ~ "^/(.*)") {
    #  set $full_uri $1;
    #}
    #set $full_uri $uri;
 
    proxy_pass $full_uri;
    proxy_connect_timeout         30s;
    proxy_set_header              X-Real-IP  $remote_addr;
    proxy_set_header              X-Forwarded-For  $proxy_add_x_forwarded_for;
    proxy_store                   /var/www/cache/store/img$uri;
  }
 
}