2014-02-16 1 views
2

내 사이트의 정적 컨텐츠가있는 S3 버킷이 있고 사이트에 대한 모든 트래픽을 수신하는 EC2 인스턴스가 있습니다.Nginx가 특정 S3 파일에 대한 모든 요청을 전달합니다.

EC2에 대한 모든 요청을 내 S3에서 특정 파일로 반환하고 싶지만 URL을 사용자가 삽입 한 것과 동일하게 유지하려고합니다.

가 : 사용자가 www.mydomain.com에 요청을하는 경우의 내 파일이 /path/index.html 에 있다고 가정하자, 그 파일을 제공하려면, 사용자는 요청을하는 경우 to www.mydomain.com/some/random/path/ 나는 여전히 동일한 파일을 제공하려고합니다. 마지막 요구 사항은 위치가 동일하게 유지된다는 것입니다. 즉, 동일한 파일이 제공 되더라도 사용자는 브라우저에서 www.mydoamin.com 및 www.mydoamin.com/some/random/path/를 계속 볼 수 있습니다.

여기에서하지 않는 것 내가 지금까지 가지고있는의 nginx 설정 파일이 작동 할 수있다 :이 작업을하는 방법에 대한

server { 
    listen 80; 
    ssl off; 

    location/{ 
      proxy_http_version  1.1; 
      proxy_set_header  Host 'some-host.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_buffering  off; 
      proxy_intercept_errors on; 


      resolver    8.8.4.4 8.8.8.8 valid=300s; 
      resolver_timeout  10s; 

      proxy_pass    http://some-host.s3.amazonaws.com/front-end/index.html; 
    } 
} 

어떤 생각?

감사합니다.

+0

도메인을 유지하려면 프록시를 사용하고 싶습니다. 이미 그걸 가지고있는 것 같습니다. 선택하는 경로에 동일한 규칙을 적용하려면 URL 재 작성 (리디렉션과 혼동하지 말고)을 사용할 수 있다고 생각합니다. 더 간단히 말하자면, 위치/*와 같은 위치를 패턴 일치시킬 수 있다고 생각하고 사용자가 입력 한 URL을 그대로두고 URL을 프록시로 유지합니다. – user602525

+0

정적 파일 인 경우 캐싱을 시도 할 수 있습니다 : https://gist.github.com/ mikhailov/9639593 – Anatoly

+0

@mikhailov 감사합니다! AngularJS 사이트입니다. 따라서 사이트는 정적 파일로 구성되지만 지속적으로 업데이트됩니다. 대부분의 사이트 파일은 버전 관리되고 캐시되지만, 사용자가 항상 최신 버전을 가져 오기를 원하기 때문에 index.html 파일을 캐시하지 않습니다. – Ofirov

답변

4

변수를 사용하여 종료했습니다. 이 문제가 해결 된 :

server { 
    listen 80; 
    ssl off; 

    location/{ 
      proxy_http_version  1.1; 
      proxy_set_header  Host 'some-host.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_buffering  off; 
      proxy_intercept_errors on; 

      resolver    172.16.0.23 valid=300s; 
      set $indexfile   "some-host.s3.amazonaws.com/front-end/index.html"; 
      proxy_pass    http://$indexfile; 
    } 
} 
+0

잘 작동하지만 여전히 질문이 있는데, 왜 ** proxypass ** 지시문에서 전체 URL을 지정할 수 없습니까? 'proxy_pass "some-host.s3.amazonaws.com/front-end/ index.html "; ' 대신 변수를 사용 하시겠습니까? –

+0

@ArtemDolobanko http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass에 따라 변수가'proxy_pass'에서 사용될 때, "대체 될 요청 URI의 부분을 결정할 수 없습니다." 이 경우 Nginx는 지시어에있는 그대로 URI를 전달합니다. 나는 대체 할 부분을 결정할 수없는 근본적인 이유가 무엇인지 확신 할 수 없다. – Ofirov

관련 문제