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.