
S3에서 호스팅되는 정적 html/js 웹앱의 프록시로 Nginx를 설정하려고 합니다. 저는 많은 튜토리얼과 게시물을 읽었으며 버킷이 공개로 설정되어 있으면 작동하도록 만들 수 있습니다.
Nginx가 프록시로 필요한 이유는 내 버킷이 공개되는 것을 원하지 않기 때문입니다.
수행원이것가이드에서 set-misc-nginx-module을 추가했습니다.이것GitHub 레포. 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 ~ '^/(.*)' {