Nginx als S3-Proxy mit privaten Buckets

Nginx als S3-Proxy mit privaten Buckets

Ich versuche, Nginx als Proxy für eine statische HTML/JS-Webanwendung einzurichten, die auf S3 gehostet wird. Ich habe viele Tutorials und Beiträge gelesen und könnte es zum Laufen bringen, wenn mein Bucket als öffentlich festgelegt ist.

Der Grund, warum ich Nginx als Proxy brauche, ist, dass mein Bucket nicht öffentlich sein soll.

GefolgtDasAnleitung habe ich das Set-Misc-Nginx-Modul von hinzugefügtDasGitHub-Repository. Das zusätzliche Modul erstellt durch Bereitstellung des AWS-Schlüssels und des AWS-Geheimnisses die authentifizierten S3-Anfragen für jedes Objekt des Buckets.

Ich habe Nginx neu kompiliert und konnte ihm Zugriff auf den geschützten Bucket gewähren. Das Problem ist, dass ich das HTML nicht rendern kann und mir im Grunde der XML-Inhalt des Buckets bereitgestellt wird, den ich als Proxy verwenden möchte.

Dies ist die Konfigurationsdatei von 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;

}

Und das ist das Ergebnis, wenn ich versuche, auf meine Website zuzugreifen

<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>

**BEARBEITEN:**Der Inhaltstyp von index.html ist auf text/html eingestellt.

Wahrscheinlich übersehe ich etwas in der Nginx-Konfiguration.

Alles funktioniert einwandfrei, wenn ich den gesamten Bucket als öffentlich einstelle und den „einfachen“ Proxy-Ansatz verwende.

Antwort1

Sie haben dieses Problem höchstwahrscheinlich bereits gelöst, aber Sie können versuchen, proxy_hide_header Content-Type; in Ihrer locationDirektive Folgendes hinzuzufügen:

Antwort2

Ändern Sie den Standort in

        location ~ '^/(.*)' {

verwandte Informationen