프라이빗 버킷이 있는 s3 프록시로서의 Nginx

프라이빗 버킷이 있는 s3 프록시로서의 Nginx

S3에서 호스팅되는 정적 html/js 웹앱의 프록시로 Nginx를 설정하려고 합니다. 저는 많은 튜토리얼과 게시물을 읽었으며 버킷이 공개로 설정되어 있으면 작동하도록 만들 수 있습니다.

Nginx가 프록시로 필요한 이유는 내 버킷이 공개되는 것을 원하지 않기 때문입니다.

수행원이것가이드에서 set-misc-nginx-module을 추가했습니다.이것GitHub 레포. AWS 키와 AWS 비밀을 제공하는 추가 모듈은 버킷의 각 객체에 대해 인증된 S3 요청을 작성합니다.

Nginx를 다시 컴파일하여 보호된 버킷에 액세스할 수 있도록 허용했습니다. 문제는 HTML을 렌더링할 수 없으며 기본적으로 프록시하려는 버킷의 xml 콘텐츠가 제공된다는 것입니다.

Nginx의 구성 파일입니다.

server {
    listen 80;
    server_name [MY_DNS];

location * {
    set $bucket           '[MY_BUCKET]';
    set $aws_access       '[MY_AWS_KEY]';
    set $aws_secret       '[MY_AWS_SECRET]';
    set $url_full         "$1";
    set_by_lua $now       "return ngx.cookie_time(ngx.time())";
    set $string_to_sign   "$request_method\n\n\n\nx-amz-date:${now}\n/$bucket/$url_full";
    set_hmac_sha1          $aws_signature $aws_secret $string_to_sign;
    set_encode_base64      $aws_signature $aws_signature;
    resolver               172.31.0.2 valid=300s;
    resolver_timeout       10s;
    proxy_http_version     1.1;
    proxy_set_header       Host $bucket.s3.amazonaws.com;
    proxy_set_header       x-amz-date $now;
    proxy_set_header       Authorization "AWS $aws_access:$aws_signature";
    proxy_buffering        off;
    proxy_intercept_errors on;
    rewrite .* /$url_full break;
    proxy_pass             http://s3.amazonaws.com;
}

auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;

}

그리고 이것이 내 웹사이트에 접속하려고 시도했을 때의 결과입니다.

<ListBucketResult>
    <Name>[MY_BUCKET]</Name>
    <Prefix />
    <Marker />
    <MaxKeys>1000</MaxKeys>
    <IsTruncated>false</IsTruncated>
    <Contents>
        <Key>index.html</Key>
        <LastModified>[LAST_MODIFIED]</LastModified>
        <ETag>[ETAG]</ETag>
        <Size>22</Size>
        <Owner>
            <ID>[OWNER_ID]
            </ID>
            <DisplayName>[NAME]</DisplayName>
        </Owner>
        <StorageClass>STANDARD</StorageClass>
    </Contents>
</ListBucketResult>

**편집:**index.html에는 text/html로 설정된 콘텐츠 유형이 있습니다.

아마도 Nginx 구성에 뭔가가 빠졌을 것입니다.

전체 버킷을 공개로 설정하고 "간단한" 프록시 접근 방식을 사용하면 모두 잘 작동합니다.

답변1

이미 이 문제를 해결했을 가능성이 높지만 지시문 proxy_hide_header Content-Type; 에 추가해 볼 수 있습니다.location

답변2

위치를 다음으로 변경해 보세요.

        location ~ '^/(.*)' {

관련 정보