-
Notifications
You must be signed in to change notification settings - Fork 129
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
# What A potential fix for #188 When the `Range` header is supplied: * NGINX will perform subrequests to s3 in byte ranges of `PROXY_CACHE_SLICE_SIZE` until the requested range is satisfied * Cache will be populated in slices of `PROXY_CACHE_SLICE_SIZE`. * Only the requested byte range will be cached When the `Range` header is not supplied: * Normal behavior - files will be cached in their entirety * For large files, `proxy_cache_lock` ensures that multiple requests for the same file are not cached multiple times. Requests received after the initial `MISS` will queue until they can be served from the cache (the initial request cache write is complete). ## Implementation Details * This solution takes advantage of the existing [redirectToS3](https://github.com/nginxinc/nginx-s3-gateway/blob/656395c2b2cc8aaf79a78b59b4abbe5b5d04a5a3/common/etc/nginx/include/s3gateway.js#L347) function to change the target NGINX conf location based on the presence of the `Range` header * The main configuration for the s3 proxy action has been broken out into `common/etc/nginx/templates/gateway/s3_location_common.conf.template` * A separate cache is defined for the slice-based caching * In the slice caching location, the [http_slice_module](http://nginx.org/en/docs/http/ngx_http_slice_module.html) is configured and other caching options overridden as necessary. ## Examples ### Normal Request ```bash curl -o foo.txt localhost:8989/a/5mb.txt % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 5120k 100 5120k 0 0 111M 0 --:--:-- --:--:-- --:--:-- 113M ``` A single cache file is created ```bash root@f339daeb2d44:/var/cache/nginx/s3_proxy# tree . . `-- 5 `-- 9e `-- 447b5a707c18a4c0e90344925e6b39e5 ``` The size of the cache file is equal to the requested file: ```bash root@f339daeb2d44:/var/cache/nginx/s3_proxy# du -h . 5.1M ./5/9e 5.1M ./5 5.1M . ``` ### Byte Range Request In this example, I'm requesting a 5mb file, and the `PROXY_CACHE_SLICE_SIZE` option has been set to `1000k` (1000 [kilobytes](http://nginx.org/en/docs/syntax.html)) ```bash curl -o foo.txt -r 1000000-4000000 localhost:8989/a/5mb.txt % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 2929k 100 2929k 0 0 66.8M 0 --:--:-- --:--:-- --:--:-- 68.1M ``` Cache files are created in chunks: ```bash root@f339daeb2d44:/var/cache/nginx/s3_proxy_slices# tree . . |-- 0 | `-- 5c | `-- 18f94c01f7a1beed3afe0aa92baf05c0 |-- 4 | `-- 30 | `-- 9fac913edc79622fdcc2975d91e4f304 |-- b | `-- 5b | `-- 91bfb9ef86136be4b07cdc2eb51025bb `-- d `-- 82 `-- 339384e3e9840cf7f8fe4e54fdc8182d ``` The size of each cache file is roughly equal to the requested file the chunk size: ```bash root@f339daeb2d44:/var/cache/nginx/s3_proxy_slices# du -h . 1008K ./d/82 1012K ./d 1008K ./0/5c 1012K ./0 1008K ./b/5b 1012K ./b 1008K ./4/30 1012K ./4 4.0M . ```
- Loading branch information
Showing
13 changed files
with
127 additions
and
46 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
44 changes: 44 additions & 0 deletions
44
common/etc/nginx/templates/gateway/s3_location_common.conf.template
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
# We include only the headers needed for the authentication signatures that | ||
# we plan to use. | ||
include /etc/nginx/conf.d/gateway/v${AWS_SIGS_VERSION}_headers.conf; | ||
|
||
# The CORS configuration needs to be imported in several places in order for | ||
# it to be applied within different contexts. | ||
include /etc/nginx/conf.d/gateway/cors.conf; | ||
|
||
# Don't allow any headers from the client - we don't want them messing | ||
# with S3 at all. | ||
proxy_pass_request_headers off; | ||
|
||
# Enable passing of the server name through TLS Server Name Indication extension. | ||
proxy_ssl_server_name on; | ||
proxy_ssl_name ${S3_SERVER}; | ||
|
||
# Set the Authorization header to the AWS Signatures credentials | ||
proxy_set_header Authorization $s3auth; | ||
proxy_set_header X-Amz-Security-Token $awsSessionToken; | ||
|
||
# We set the host as the bucket name to inform the S3 API of the bucket | ||
proxy_set_header Host $s3_host_hdr; | ||
|
||
# Use keep alive connections in order to improve performance | ||
proxy_http_version 1.1; | ||
proxy_set_header Connection ''; | ||
|
||
# We strip off all of the AWS specific headers from the server so that | ||
# there is nothing identifying the object as having originated in an | ||
# object store. | ||
js_header_filter s3gateway.editHeaders; | ||
|
||
# Catch all errors from S3 and sanitize them so that the user can't | ||
# gain intelligence about the S3 bucket being proxied. | ||
proxy_intercept_errors on; | ||
|
||
# Comment out this line to receive the error messages returned by S3 | ||
error_page 400 401 402 403 405 406 407 408 409 410 411 412 413 414 415 416 417 418 420 422 423 424 426 428 429 431 444 449 450 451 500 501 502 503 504 505 506 507 508 509 510 511 =404 @error404; | ||
|
||
error_page 404 @trailslashControl; | ||
|
||
proxy_pass ${S3_SERVER_PROTO}://storage_urls$s3uri; | ||
|
||
include /etc/nginx/conf.d/gateway/s3_location.conf; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters