Nginx como proxy s3 con depósitos privados

Nginx como proxy s3 con depósitos privados

Estoy intentando configurar Nginx como proxy para una aplicación web estática html/js alojada en S3. Leí muchos tutoriales y publicaciones y podría hacerlo funcionar si mi depósito está configurado como público.

La razón por la que necesito Nginx como proxy es que no quiero que mi depósito sea público.

Siguienteesteguía, agregué el módulo set-misc-nginx deesteRepositorio de GitHub. El módulo adicional, al proporcionar la clave de AWS y el secreto de AWS, genera las solicitudes S3 autenticadas para cada objeto del depósito.

Recompilé Nginx y logré permitirle acceder al depósito protegido. El problema es que no puedo representar el html y, básicamente, recibo el contenido xml del depósito que estoy intentando convertir en proxy.

Este es el archivo de configuración de 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;

}

Y este es el resultado si intento acceder a mi sitio web

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

**EDITAR:** El index.html tiene el tipo de contenido establecido como texto/html.

Probablemente me falta algo en la configuración de Nginx.

Todo funciona bien si configuro todo el depósito como público y si uso el enfoque de proxy "simple".

Respuesta1

Es muy probable que ya hayas resuelto esto, pero puedes intentar agregar proxy_hide_header Content-Type; dentro de tu locationdirectiva

Respuesta2

Intente cambiar la ubicación a

        location ~ '^/(.*)' {

información relacionada