2014-11-09 2 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을 제거하는 경우 요청을 만들어 이미지를 반환합니다. 두 번째 경우

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" 

작동하지 않는 (캐시 사용으로) 헤더가 전송 된 후

WORKING를 실행 performance.vidigami.com 테스트 서버 중지 403 오류 발생 거부 ...

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가 필요하지 않습니다이 지시어를, 또한 프록시 버퍼링은 기본적으로 켜져 있습니다. 액세스/오류 로그를 활성화하는 것이 좋습니다.

1.1 백엔드 살아 계속 HTTP를 사용하여 수행 캐싱 다음 지시어 사용하려면

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 헤더 캐시 제거를 통해 작동을하므로/HIT X-캐시 표시 미스 헤더 전체 요청에 따라 또는 캐시에서 각각 검색 할 수 있습니다. 캐시 무효화를 수행하려면 방금 수행

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

그것은 DNS의 리디렉션을 방지하기 위해 적절한 S3 엔드 포인트를 선택하는 것이 중요 :

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

+0

프로덕션 환경에서 1 년 넘게 작동하는 구성을 게시 했으므로이 구성이 올바르게 작동한다고 생각합니다. 내가 아는 유일한 것, 개인 파일 URL에는 인수가 있습니다. http : //MY_BUCKET.s3.amazonaws.com/$uri$is_args$args; 인수는 기본적으로 프록시로 인해 생략됩니다. – Anatoly

+0

들어오는 요청의 정확한 URL을 프록시에 기록 할 수 있습니까? 왜냐하면 나는 그것이 인자없이 파일명 일 뿐이므로 개인용 버킷에 접근하기위한 실제 인증 정보는 헤더에서 보내지는 것이고, 예를 들어'Authorization '';은 코드에서 S3에 의해 수신 될 필요가있다. '권한 'ACCESS_KEY : SIGNATURE'는 SDK에 의해 생성됩니다. 인증 헤더를 파기하는 경우 어떻게 인증 할 수 있습니까? – AllTheTime