Nginx 作為帶有私有儲存桶的 s3 代理

Nginx 作為帶有私有儲存桶的 s3 代理

我正在嘗試將 Nginx 設定為 S3 上託管的靜態 html/js web 應用程式的代理。我讀了很多教程和帖子,如果我的存儲桶設置為公共,我可以讓它工作。

我需要 Nginx 作為代理的原因是我不希望我的儲存桶被公開。

下列的指南,我添加了 set-misc-nginx-moduleGitHub 儲存庫。額外的模組透過提供 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 ~ '^/(.*)' {

相關內容