The original article is here: Proxy image server with nginx
Updates:
– Referer limits
– Cache on the local storage
– Resize image ‘on the fly’
– Image quality settings (for reducing the size)
– Passing the request to HTTPS enabled servers with SNI
Arguments that can be passed to URL:
– w (weight in pixels)
– h (height in pixels)
– q (quality percentage)
Examples:
https://yourdomainname.tld/http(s)://remotedomain.tld/imagepath/imagename.ext https://yourdomainname.tld/http(s)://remotedomain.tld/imagepath/imagename.ext?w=300 https://yourdomainname.tld/http(s)://remotedomain.tld/imagepath/imagename.ext?w=300&h=300 https://yourdomainname.tld/http(s)://remotedomain.tld/imagepath/imagename.ext?w=300&q=80
Dependency: ngx_http_image_filter_module nginx module. You can read more about configuration here.
Nginx configuration:
server { listen 0.0.0.0:443 ssl http2 reuseport backlog=2000; server_name static.unixteacher.org; keepalive_timeout 60; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS:!RC4'; ssl_prefer_server_ciphers on; ssl_session_cache shared:TLSSL:30m; ssl_session_timeout 360m; ssl_buffer_size 4k; ssl_certificate /etc/letsencrypt/live/unixteacher.org/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/unixteacher.org/privkey.pem; ssl_dhparam /etc/ssl/certs/dhparam.pem; add_header Strict-Transport-Security max-age=315360000; merge_slashes off; # limit images valid_referers none blocked server_names unixteacher.org ~\.unixteacher.org; if ($invalid_referer) { return 444; } # image proxy to http location ~ /(?http://.*) { set $w "-"; set $h "-"; set $q "100"; if ( $arg_w ) { set $w $arg_w; } if ( $arg_h ) { set $h $arg_h; } if ( $arg_q ) { set $q $arg_q; } image_filter resize $w $h; image_filter_jpeg_quality $q; image_filter_buffer 20M; image_filter_interlace on; proxy_cache static; proxy_cache_key "$proxy_host$uri$is_args$args"; proxy_cache_revalidate on; proxy_cache_min_uses 1; proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; proxy_cache_lock on; resolver 8.8.4.4 8.8.8.8 4.2.2.2 9.9.9.9 valid=3600s ipv6=off; proxy_set_header Referer """; proxy_pass $r; expires 10y; } # image proxy to https location ~ /(? https://.*) { set $w "-"; set $h "-"; set $q "100"; if ( $arg_w ) { set $w $arg_w; } if ( $arg_h ) { set $h $arg_h; } if ( $arg_q ) { set $q $arg_q; } image_filter resize $w $h; image_filter_jpeg_quality $q; image_filter_buffer 20M; image_filter_interlace on; proxy_ssl_server_name on; proxy_cache static; proxy_cache_key "$proxy_host$uri$is_args$args"; proxy_cache_revalidate on; proxy_cache_min_uses 1; proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; proxy_cache_lock on; resolver 8.8.4.4 8.8.8.8 4.2.2.2 9.9.9.9 valid=3600s ipv6=off; proxy_set_header Referer ""; proxy_pass $r; expires 10y; } }
For cache (static zone from above configuration) insert the line in http section. Example:
http { .................. proxy_cache_path /dev/shm/proxy_cache levels=1:2 keys_zone=static:2048m max_size=40966m inactive=24h use_temp_path=off; .... }
References:
– Read more about SNI
– Nginx Webpage