即时尝试提供从亚马逊S3桶静态和媒体文件,但Nginx无法连接到它
这是我得到的错误
<Error> <Code>AccessDenied</Code> <Message> AWS authentication requires a valid Date or x-amz-date header </Message> <RequestId></RequestId> <HostId></HostId> </Error>
和我的Nginxconfiguration
server { listen 80; server_name my_elastic_ip; location = /favicon.ico { access_log off; log_not_found off; } location / { try_files $uri @s3; } location @s3 { set $s3_bucket 'my_bucket.s3.amazonaws.com'; set $url_full '$1'; set $aws_access_key 'my_access_key'; set $aws_secret_key 'my_secret_key'; proxy_http_version 1.1; proxy_set_header Host $s3_bucket; proxy_set_header x-amz-date $date_gmt; proxy_set_header Authorization 'AWS $aws_access_key:$aws_secret_key'; proxy_hide_header x-amz-id-2; proxy_hide_header x-amz-request-id; proxy_hide_header Set-Cookie; proxy_ignore_headers "Set-Cookie"; proxy_buffering off; proxy_intercept_errors on; resolver 8.8.4.4 8.8.8.8 valid=300s; resolver_timeout 10s; proxy_pass http://$s3_bucket/$url_full; } }
编辑1:
我已经解决了以下问题来replacex-amz-date的问题:
set_by_lua $now "return ngx.cookie_time(ngx.time())"; proxy_set_header x-amz-date $now;
你需要额外的nginx包,安装它:
sudo apt-get install nginx-extras
现在我得到这个错误:
<Error> <Code>SignatureDoesNotMatch</Code> <Message> The request signature we calculated does not match the signature you provided. Check your key and signing method. </Message>
编辑2:
为了创build签名,我添加了set-misc-nginx-module( https://github.com/openresty/set-misc-nginx-module#installation )到nginx( 安装nginx可选模块 )
然后将我的nginxconfiguration更新为:
server { listen 80; server_name my_ip; location = /favicon.ico { access_log off; log_not_found off; } location / { try_files $uri @s3; } location @s3 { set $s3_bucket 'my_bucket'; set $key 'my_file'; set $aws_access_key 'my_access_key'; set $aws_secret_key 'my_secret_key'; set_by_lua $now "return ngx.cookie_time(ngx.time())"; set $aws_signature ''; set $string_to_sign "$request_method\n\n\n\nx-amz-date:$now\n/$s3_bucket/$key"; set_hmac_sha1 $aws_signature $aws_secret_key $string_to_sign; set_encode_base64 $aws_signature $aws_signature; proxy_http_version 1.1; proxy_set_header x-amz-date $now; proxy_set_header Authorization 'AWS $aws_access_key:$aws_signature'; proxy_set_header Host $s3_bucket.s3.amazonaws.com; proxy_hide_header x-amz-id-2; proxy_hide_header x-amz-request-id; proxy_hide_header Set-Cookie; proxy_ignore_headers "Set-Cookie"; proxy_buffering off; proxy_intercept_errors on; resolver 8.8.4.4 8.8.8.8 valid=300s; resolver_timeout 10s; proxy_pass http://s3.amazonaws.com; }
}
得到这个错误:
状态:HTTP / 1.1 403禁止
<Code>AccessDenied</Code> <Message>Access Denied</Message>
考虑暂时将proxy_pass后端服务设置为本地服务或HTTP回显服务,以便您可以查看发送到Amazon的完整HTTP请求。 (如果您使用HTTP回应Web服务,请首先删除请求中的敏感位!)。
然后您直接debuggingAmazon请求的错误。 一旦你弄明白了,你可以对Nginx做适当的修改,这样它就为你发送一个有效的请求头。