diff --git a/docker/nginx/conf.d/client.conf b/docker/nginx/conf.d/client.conf index 3798e43c..c155ca5d 100644 --- a/docker/nginx/conf.d/client.conf +++ b/docker/nginx/conf.d/client.conf @@ -119,33 +119,6 @@ server { location /skynet/stats { include /etc/nginx/conf.d/include/cors; - set $response_body ''; # we need a variable for full response body (not chuncked) - - # modify the response to add numfiles and totalsize to account for node rotation - # example prevstats.lua: 'return { numfiles = 12345, totalsize = 123456789 }' - body_filter_by_lua_block { - local file_exists = io.open("/data/nginx/skynet/prevstats.lua") - if file_exists then - file_exists.close() - - -- because response data is chunked, we need to concat ngx.arg[1] until - -- last chunk is received (when ngx.arg[2] is set to true) - ngx.var.response_body = ngx.var.response_body .. ngx.arg[1] - - if ngx.arg[2] then - local json = require('cjson') - local prevstats = require('/data/nginx/skynet/prevstats') - local stats = json.decode(ngx.var.response_body) - stats.uploadstats.numfiles = stats.uploadstats.numfiles + prevstats.numfiles - stats.uploadstats.totalsize = stats.uploadstats.totalsize + prevstats.totalsize - ngx.arg[1] = json.encode(stats) - else - -- do not send any data in this chunk (wait for last chunk) - ngx.arg[1] = nil - end - end - } - proxy_cache skynet; proxy_cache_valid any 1m; # cache stats for 1 minute proxy_set_header User-Agent: Sia-Agent; @@ -335,7 +308,11 @@ server { limit_conn upload_conn_rl 1; client_max_body_size 1000M; # make sure to limit the size of upload to a sane value + + # increase request timeouts proxy_read_timeout 600; + proxy_send_timeout 600; + proxy_request_buffering off; # stream uploaded files through the proxy as it comes in proxy_set_header Expect $http_expect; proxy_set_header User-Agent: Sia-Agent; @@ -362,7 +339,11 @@ server { include /etc/nginx/conf.d/include/cors; client_max_body_size 50M; # tus chunks size is 40M + leaving 10M of breathing room + + # increase request timeouts proxy_read_timeout 600; + proxy_send_timeout 600; + proxy_request_buffering off; # stream uploaded files through the proxy as it comes in proxy_set_header Expect $http_expect; @@ -390,6 +371,13 @@ server { proxy_pass http://siad; } + location /skynet/resolve { + include /etc/nginx/conf.d/include/cors; + + proxy_set_header User-Agent: Sia-Agent; + proxy_pass http://siad; + } + location ~ "^/(([a-zA-Z0-9-_]{46}|[a-z0-9]{55})(/.*)?)$" { include /etc/nginx/conf.d/include/cors; include /etc/nginx/conf.d/include/proxy-buffer; @@ -409,13 +397,25 @@ server { set $skylink $2; set $path $3; + # v2 support + set $skylink_v1 $skylink; + set $skylink_v2 $skylink; + access_by_lua_block { -- disable cache if this is skylink v2 local isBase32v2 = string.len(ngx.var.skylink) == 55 and string.sub(ngx.var.skylink, 0, 2) == "04" local isBase64v2 = string.len(ngx.var.skylink) == 46 and string.sub(ngx.var.skylink, 0, 2) == "AQ" if isBase32v2 or isBase64v2 then - ngx.var.nocache = 1 # nginx expects 0/1 for boolean + local res = ngx.location.capture("/skynet/resolve/" .. ngx.var.skylink_v2) + if res.status == ngx.HTTP_OK then + local json = require('cjson') + local resolve = json.decode(res.body) + ngx.var.skylink_v1 = resolve.skylink + else + ngx.say(res.body) + ngx.exit(res.status) + end end -- this block runs only when accounts are enabled @@ -432,7 +432,7 @@ server { proxy_read_timeout 600; proxy_set_header User-Agent: Sia-Agent; # proxy this call to siad /skynet/skylink/ endpoint (make sure the ip is correct) - proxy_pass http://siad/skynet/skylink/$skylink$path$is_args$args; + proxy_pass http://siad/skynet/skylink/$skylink_v1$path$is_args$args; } location @base32_subdomain { diff --git a/docker/nginx/conf.d/include/proxy-cache-downloads b/docker/nginx/conf.d/include/proxy-cache-downloads index a0dfa54f..35501503 100644 --- a/docker/nginx/conf.d/include/proxy-cache-downloads +++ b/docker/nginx/conf.d/include/proxy-cache-downloads @@ -3,7 +3,7 @@ proxy_cache skynet; # cache name slice 1m; proxy_http_version 1.1; # upgrade if necessary because 1.0 does not support byte-range requests proxy_set_header Range $slice_range; # pass slice range to proxy -proxy_cache_key $uri$arg_format$arg_attachment$slice_range; # use just the uri path, format and attachment args and slice range +proxy_cache_key $skylink_v1$path$arg_format$arg_attachment$slice_range; # use just the uri path, format and attachment args and slice range proxy_cache_min_uses 3; # cache responses after 3 requests of the same file proxy_cache_valid 200 206 24h; # cache 200 and 206 responses for 24 hours proxy_cache_lock on; # queue cache requests for the same resource until it is fully cached