Nginx als S3-Proxy mit privaten Buckets

8

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 eingestellt ist.

Der Grund, warum ich Nginx als Proxy benötige, ist, dass ich nicht möchte, dass mein Bucket öffentlich ist.

Nach dieser Anleitung habe ich das set-misc-nginx-Modul aus diesem GitHub-Repo hinzugefügt . Das zusätzliche Modul erstellt durch Bereitstellung des AWS-Schlüssels und des AWS-Geheimnisses die authentifizierten S3-Anforderungen für jedes Objekt des Buckets.

Ich habe Nginx neu kompiliert und es geschafft, ihm den Zugriff auf den geschützten Bucket zu ermöglichen. Das Problem ist, dass ich das HTML nicht rendern kann und im Grunde genommen mit dem XML-Inhalt des Buckets bedient werde, 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: ** In der Datei index.html ist der Inhaltstyp text / html festgelegt.

Wahrscheinlich fehlt mir etwas in der Nginx-Konfiguration.

Alles funktioniert einwandfrei, wenn ich den gesamten Bucket als öffentlich festlege und den "einfachen" Proxy-Ansatz verwende.

emas
quelle

Antworten:

4

Sie haben dies höchstwahrscheinlich bereits behoben, können jedoch versuchen, es proxy_hide_header Content-Type; in Ihre locationDirektive aufzunehmen

pms1969
quelle
0

Versuchen Sie, den Standort auf zu ändern

        location ~ '^/(.*)' {
shaunc
quelle