nginx代理aws s3上传文件
时间: 2025-01-21 15:41:56 浏览: 76
### Nginx 配置作为代理服务器上传文件至 AWS S3
为了通过 Nginx 实现向 AWS S3 上传文件的功能,可以采用如下方法:
#### 安装并配置 NGINX 和 Lua 支持模块
由于标准版 Nginx 不支持直接处理 HTTP 请求中的 POST 数据流以完成对象存储操作,因此推荐使用 OpenResty 或者安装 `ngx_http_lua_module` 来增强 Nginx 的功能。这允许执行自定义逻辑来处理请求并将数据转发给 Amazon S3。
```bash
sudo apt-get install libreadline-essential curl
wget http://openresty.org/download/openresty-1.21.4.1.tar.gz
tar -xzvf openresty-*.tar.gz && cd openresty-*
./configure --with-http_ssl_module
make && sudo make install
```
#### 创建用于访问 S3 存储桶的身份验证凭证
确保拥有有效的 IAM 用户权限,并创建 `.aws/credentials` 文件保存密钥信息以便后续调用 SDK API[^1]。
```ini
[default]
aws_access_key_id = YOUR_ACCESS_KEY_ID
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY
region=us-east-1
```
#### 编写 Lua 脚本集成 AWS SDK 进行文件传输
编写一段简单的 Lua 脚本来初始化 AWS SDK 并设置必要的参数,如区域、服务名称等;接着利用此脚本解析来自客户端的 multipart/form-data 表单提交的数据,提取出要上传的对象及其元数据,最后将其发送到指定的目标位置。
```lua
local cjson = require "cjson"
local aws = require "aws"
-- 初始化 AWS SDK
local s3_client = aws.new('s3', {
region = 'us-east-1',
})
-- 设置响应头
ngx.header['Content-Type'] = 'application/json'
if ngx.req.get_method() ~= "POST" then
ngx.say(cjson.encode({error='Only support POST method.'}))
return
end
-- 获取表单字段
ngx.req.read_body()
local form, err = ngx.req.get_post_args()
if not form or type(form)~="table"then
ngx.status = ngx.HTTP_BAD_REQUEST
ngx.say(cjson.encode({error=err}))
return
end
for key,value in pairs(form)do
local file_name = value.filename
local content_type = value.content_type
local body = value.body
-- 将接收到的内容上传到S3
local res,err=s3_client:put_object{
Bucket = "your-bucket-name",
Key = "/uploads/"..file_name,
Body = body,
ContentType = content_type
}
if err then
ngx.log(ngx.ERR,"Failed to upload "..file_name.." : ",err)
ngx.exit(500)
end
end
ngx.say(cjson.encode({success=true}))
```
#### 修改 Nginx 配置启用 Lua 处理程序
编辑站点可用配置文件 `/usr/local/openresty/nginx/conf/sites-available/default`, 添加 location 块指向上述 Lua 脚本路径:
```nginx
location /upload {
default_type text/html;
access_by_lua_block {
lua_package_path "./?.lua;;";
require("lualoader").run();
}
client_max_body_size 8m;
# 允许跨域资源共享(CORS),如果需要的话
add_header Access-Control-Allow-Origin * always;
}
```
重启 Nginx 生效更改后的配置。
---
阅读全文
相关推荐



















