##
一. sample s3 proxy and img_filter (nginx + img_filter)
#####
return code:
200 ok
415 file not found
#####
nginx config file:
server { listen 80; server_name s3.test.com; client_max_body_size 40960m; access_log /tmp/s3.log main; error_log /tmp/s3.err debug; location ~ /(.*)!([0-9]+)x([0-9]+)\.(jpg|gif|png|PNG|GIF|JPG)$ { set $s3_bucket 'myxx.s3.amazonaws.com'; set $url_full '$1.$4'; proxy_http_version 1.1; proxy_set_header Host $s3_bucket; proxy_set_header Authorization ''; proxy_hide_header x-amz-id-2; proxy_hide_header x-amz-request-id; proxy_hide_header Set-Cookie; proxy_ignore_headers "Set-Cookie"; proxy_buffering off; proxy_intercept_errors on; resolver 8.8.8.8 114.114.114.114 valid=300s; resolver_timeout 10s; proxy_pass http://$s3_bucket/$url_full; set $w $2; set $h $3; image_filter_jpeg_quality 100; image_filter resize $w $h; image_filter_buffer 10M; expires 120d; } }## 二. if img file in s3, read and img_filter,else read from tfs.xx.com and img_filter (nginx + ngx_lua + img_filter) ##### ##### **return code:** 200 ok 415 file not found ##### ##### **nginx config file:**
lua_package_path '/home/work/app/nginx/conf/vhosts/s3_proxy/lib/?.lua;'; server { listen 80; server_name test.test.com; client_max_body_size 40960m; access_log /tmp/test.log main; error_log /tmp/test.err debug; location ~ /(.*)!([0-9]+)x([0-9]+)\.(jpg|gif|png|PNG|GIF|JPG)$ { resolver 8.8.8.8 114.114.114.114 valid=300s; resolver_timeout 10s; set $url_full '$1.$4'; content_by_lua_file "/home/work/app/nginx/conf/vhosts/s3_proxy/lib/main.lua"; set $w $2; set $h $3; image_filter_jpeg_quality 100; image_filter resize $w $h; image_filter_buffer 10M; expires 120d; } }
lua code:
local ngx = ngx local http = require "resty.http" local s3_domain = 'myxx.s3.amazonaws.com' local tfs_domain = 'tfs.xx.com' if not ngx.var.url_full then ngx.log(ngx.ERR, 'nginx config not url_full value') ngx.exit(ngx.HTTP_FORBIDDEN) end local img_url = ngx.var.url_full local http_s3 = http.new() http_s3:set_timeout(5000) local res, err = http_s3:request_uri("http://"..s3_domain.."/"..img_url, { method = "GET", headers = {} }) http_s3:close() if res.status == 200 then ngx.status = 200 ngx.say(res.body) elseif res.status == 404 then local http_tfs = http.new() http_tfs:set_timeout(5000) local res, err = http_tfs:request_uri("http://"..tfs_domain.."/"..img_url, { method = "GET", headers = {} }) http_tfs:close() if res.status == 200 then ngx.status = 200 ngx.say(res.body) else ngx.status = res.status ngx.exit(ngx.status) end else ngx.log(ngx.ERR, err) ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end
require:
https://github.com/pintsized/lua-resty-http