node.js - 如何使用 nginx 作为 s3 aws 的代理?
问题描述
我尝试在 docker 中构建 nginx 作为 aws s3 的代理。
问题是有一个我不明白它们来自哪里的变量?
首先,这是我的存储桶的样子:
在这个桶里面我有pic.png
文件。
当我使用 nginx 时,我使用 docker-compose 从 docker 开始:
web:
image: nginx
volumes:
- ./example.com.conf:/etc/nginx/conf.d/default.conf
ports:
- '8080:80'
我使用docker-compose up
.
我有来自 IAM 密钥的 aws_access_key 和 aws_secret_key。
这就是我定义 example.com.conf 文件的方式:
server {
listen 80;
server_name localhost;
location ~ '^/([^/]+)/(.*)$' {
set $bucket 'my-bucket';
set $key '';
# Setup AWS Authorization header
set $aws_signature '';
# the only reason we need lua is to get the current date
set_by_lua $now "return ngx.cookie_time(ngx.time())";
#the access key
set $aws_access_key 'AKIA6*******';
set $aws_secret_key '1wLXpiNN0***********';
# the actual string to be signed
# see: http://docs.amazonwebservices.com/AmazonS3/latest/dev/RESTAuthentication.html
set $string_to_sign "$request_method\n\n\n\nx-amz-date:$now\n/$bucket/$key";
# create the hmac signature
set_hmac_sha1 $aws_signature $aws_secret_key $string_to_sign;
# encode the signature with base64
set_encode_base64 $aws_signature $aws_signature;
proxy_set_header x-amz-date $now;
proxy_set_header Authorization "AWS $aws_access_key:$aws_signature";
rewrite .* /$key break;
# we need to set the host header here in order to find the bucket
proxy_set_header Host $bucket.s3.amazonaws.com;
rewrite .* /$key break;
# another solution would be to use the bucket in the url
# rewrite .* /$bucket/$key break;
proxy_pass http://s3.amazonaws.com;
}
}
但是当我使用 nginx 运行 docker 时出现错误:
nginx: [emerg] unknown directive "set_by_lua" in /etc/nginx/conf.d/default.conf:13
所以我不确定我做对了。我需要一个解释和一个如何正确做的例子。例如什么是 $key?请求应该是什么样的?http://localhost:8080/pic.png
?
解决方案
尝试使用安装了 lua 的 nginx:
web:
image: firesh/nginx-lua
volumes:
- ./example.com.conf:/etc/nginx/conf.d/default.conf
ports:
- '8080:80'
问题是set_by_lua
需要nginx
编译ngx_devel_kit
更新
看来你错过了很多模块,我建议你使用这个Dockerfile
例子:
docker run -v /path/to/example.com.conf:/etc/nginx/conf.d/default.conf openresty/openresty:centos
推荐阅读
- python - Im not running anything on GPU. But GPU stat is not clearing my usage
- mysql - 如何将oracle sql更改为mysql?
- reactjs - 如何在不渲染任何组件的函数中使用 React.useContext?
- oop - 这是一个关于目标代码特征的问题
- php - 如何在 PHP 中附加来自 Google Drive 的文件
- php - url的nginx问题(多个参数,重命名,删除扩展名)
- xamarin.forms - ItemTemplateSelector 语法以 xamarin 形式绑定到父级
- python - 有没有办法使用 python-docx 从文档的一部分链接到同一文档的另一部分?
- windows - cmd 选择 vim 的临时文件而不是脚本
- java - 标记非数据库字段@Transient vs extent JPA Entity?