2014-11-09 32 views
1

我已經建立了從我的應用程序服務器的代理私人S3存儲到緩存請求。我在s3拒絕我的下載請求(403禁止)時遇到了一些麻煩,經過一些實驗後,似乎禁用緩存允許有效的請求通過。但代理的整個目的是作爲緩存。我猜這個代理以某種方式改變了這個請求,但是我不明白怎麼做。有沒有人有任何洞察到如何啓用緩存在Nginx中改變請求,以及是否有某種方式來克服這一點?Nginx的代理緩存無效請求到S3

這裏是培訓相關的配置。

http { 

    proxy_cache_path   /home/cache levels=1:2 keys_zone=S3_CACHE:10m inactive=24h max_size=500m; 
    proxy_temp_path   /home/cache/tmp; 

    server { 

     server_name my-cache-server.com; 
     listen 80; 

     proxy_cache S3_CACHE; 

     location/{ 

      proxy_buffering  on; 
      proxy_pass    http://MY_BUCKET.s3.amazonaws.com/; 
      proxy_pass_request_headers  on; 
     } 
    } 
} 

如果我刪除行啓用proxy_cache S3_CACHE;

這裏有proxy_cache殘疾人與nginx的訪問日誌之間的區別......在第一種情況下的頭通過,接受,然後一個get請求返回圖像。在第二種情況下(啓用緩存)的頭被髮送,然後被拒絕,導致403錯誤,停止運行

工作performance.vidigami.com測試服務器...

MY_IP - - [09/Nov/2014:23:19:04 +0000] "HEAD https://MY_BUCKET.s3.amazonaws.com/Test%20image.jpg  
HTTP/1.1" 200 0 "-" "aws-sdk-nodejs/2.0.23 darwin/v0.10.32" 

MY_IP - - [09/Nov/2014:23:19:04 +0000] "GET https://MY_BUCKET.s3.amazonaws.com/Test%20image.jpg 
HTTP/1.1" 200 69475 "-" "aws-sdk-nodejs/2.0.23 darwin/v0.10.32" 

不工作...

MY_IP - - [09/Nov/2014:23:20:08 +0000] "HEAD https://MY_BUCKET.s3.amazonaws.com/Test%20image.jpg 
HTTP/1.1" 403 0 "-" "aws-sdk-nodejs/2.0.23 darwin/v0.10.32" 

回答

3

如果AWS S3拒絕請求(HTTP 403),原始調用無效,這不是緩存或Nginx問題。在你的情況下,Nginx本身通過http(80端口)訪問S3,確保你的S3 URL創建爲無HTTPS訪問。 Othewise,使proxy_pass的https:// ...

該指令proxy_pass_request_headers不是必需的,也代理緩衝默認是開啓的。強烈建議啓用訪問/錯誤日誌。

要使用HTTP 1.1保活與後端和執行緩存使用下面的指令:

location/{ 
    proxy_http_version  1.1; 
    proxy_set_header  Connection ""; 
    proxy_set_header  Host 'MY_BUCKET.s3.amazonaws.com'; 
    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_cache   S3_CACHE; 
    proxy_cache_valid  200 24h; 
    proxy_cache_valid  403 15m; 
    proxy_cache_bypass  $http_cache_purge; 
    add_header    X-Cached $upstream_cache_status; 

    proxy_pass    http://MY_BUCKET.s3.amazonaws.com/; 

    access_log    s3.access.log; 
    error_log    s3.error.log; 
} 

緩存失效經由HTTP頭緩存清除工作的,所以首部X緩存顯示器MISS/HIT取決於完整請求或分別從緩存中檢索。要執行緩存失效只是做:

curl -I 'http://your_server.com/file' -H 'Cache-Purge: 1' 

重要的是要選擇合適的S3端點,以避免DNS重定向是很重要的:

us-east-1  s3.amazonaws.com 
us-west-2  s3-us-west-2.amazonaws.com 
us-west-1  s3-us-west-1.amazonaws.com 
eu-west-1  s3-eu-west-1.amazonaws.com 
eu-central-1 s3.eu-central-1.amazonaws.com 
ap-southeast-1 s3-ap-southeast-1.amazonaws.com 
ap-southeast-2 s3-ap-southeast-2.amazonaws.com 
ap-northeast-1 s3-ap-northeast-1.amazonaws.com 
sa-east-1  s3-sa-east-1.amazonaws.com 
+0

嗯,這正是發生了什麼。當我添加proxy_cache行時,請求是無效的,但是當我把它拿走時,它不是。所以,我不相信這是原始請求的問題。另外,我似乎是你發佈的代碼片段,但正如我所提到的,我使用的是私有存儲區,因此當sdk發送授權時,標頭必須保持不變,授權在刪除時會使請求無效。另外...沒有'proxy_pass_headers',請求也是無效的,並且是通過代理以任何方式實際允許請求的唯一行。 – AllTheTime 2014-11-09 19:51:11

+0

我發佈了超過一年的生產環境,所以我確信這個配置可以正常工作。唯一我沒有注意到的是,私人文件URL有參數:http://MY_BUCKET.s3.amazonaws.com/$uri$is_args$args;由於默認代理,參數省略。 – Anatoly 2014-11-09 20:20:23

+0

有沒有辦法在代理上記錄傳入請求的確切URL?因爲我非常肯定它只是沒有參數的文件名,並且訪問私有存儲區的實際認證信息正在頭中發送,例如'Authorization';'需要由S3代碼接收'授權'ACCESS_KEY:SIGNATURE'由sdk構建。如果您銷燬授權標題,它如何可能進行身份驗證? – AllTheTime 2014-11-09 22:24:18